import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
from tqdm import tqdm
There are 1460 instances in training set.
train_raw = pd.read_csv('./dataset/train.csv')
train_raw
And there are 1450 instances in test set.
test_raw = pd.read_csv('./dataset/test.csv')
test_raw
First, I use KNN to imputate missing values.
from sklearn.neighbors import KNeighborsRegressor, KNeighborsClassifier
def imputate(dataset, n_neighbors = 10):
# Exclude feature `Id` and `SalePrice`.
df = dataset.copy().loc[:, (dataset.columns != 'Id') & (dataset.columns != 'SalePrice')]
numerical_features = [col for col in df.columns if pd.api.types.is_numeric_dtype(df.dtypes[col])]
categorical_features = [col for col in df.columns if not pd.api.types.is_numeric_dtype(df.dtypes[col])]
for col in tqdm(df.columns):
if df[col].isna().any():
samples = pd.DataFrame()
for feature in numerical_features:
if feature != col:
samples[feature] = df[feature].fillna(df[feature].mean())
for feature in categorical_features:
if feature != col:
samples[feature],_ = pd.factorize(df[feature])
samples_x = samples.loc[df[col].notna(), :]
samples_y = df.loc[df[col].notna(), col]
predict_x = samples.loc[df[col].isna(), :]
model = None
if col in numerical_features:
model = KNeighborsRegressor(n_neighbors = min(n_neighbors, samples_x.shape[0]))
else:
model = KNeighborsClassifier(n_neighbors = min(n_neighbors, samples_x.shape[0]))
model.fit(samples_x, samples_y)
predict_y = model.predict(predict_x)
df.loc[df[col].isna(), col] = predict_y
df['Id'] = dataset['Id']
for col in categorical_features:
df[col],_ = pd.factorize(df[col])
if 'SalePrice' in dataset.columns:
df['SalePrice'] = dataset['SalePrice']
return df
train_raw = imputate(train_raw)
train_raw
test_raw = imputate(test_raw)
test_raw
I use 80% of training instances for training and other 20% for validation.
from sklearn.model_selection import train_test_split
train_features, test_features, train_target, test_target = train_test_split(train_raw.loc[:, (train_raw.columns != 'Id') & (train_raw.columns != 'SalePrice')], train_raw['SalePrice'])
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_log_error
rfr = RandomForestRegressor()
rfr.fit(train_features, train_target)
mean_squared_log_error(rfr.predict(test_features), test_target)
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_log_error
gbr = GradientBoostingRegressor()
gbr.fit(train_features, train_target)
mean_squared_log_error(gbr.predict(test_features), test_target)
submission = pd.DataFrame({
'Id': test_raw['Id'],
'SalePrice': gbr.predict(test_raw.loc[:, test_raw.columns != 'Id'])
})
submission.to_csv('./dataset/submission.csv', index = False)
submission