入门第二战,达到了top1%的分数,有点小兴奋,不过也有可能为公分的提高使模型过拟合了,但入门赛貌似也只能追求公分的提高。
言归正传,开战。
一、导包
# 数据处理及可视化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 算法
from xgboost.sklearn import XGBRegressor
from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.tree import DecisionTreeRegressor
# 训练
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import cross_val_score
二、获取数据
train = pd.read_csv("all/train.csv")
test = pd.read_csv("all/test.csv")
sample_submission = pd.read_csv("all/sample_submission.csv")
三、数据分析
1、SalePrice分布
sns.distplot(train.SalePrice)
可以看到SalePrice偏离了正态分布,需要调整,将SalePrice对数化。
sns.distplot(np.log(train.SalePrice + 1))
2、缺失值
(缺失值的处理参考https://www.kaggle.com/laurenstc/top-2-of-leaderboard-advanced-fe)
拼接数据并将缺失值数量可视化
all_data = pd.concat((train.drop(["SalePrice"], axis=1), test))
all_data_na = (all_data.isnull().sum() / len(all_data)) * 100
all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)
plt.figure(figsize=(12, 6))
plt.xticks(rotation="90")
sns.barplot(x=all_data_na.index, y=all_data_na)
PoolQC:PoolQC的缺失值太多,按照文件的意思就是没有游泳池,可以用None来填充缺失值。理论上来说与PoolQC缺失值对应的PoolArea应该为0,但观察为数不多的有值PoolArea后,发现在测试集中960,1043,1139很特别,这三个例子不能用None填充。13个数据中,Ex出现4次,Gd出现4次,Fa出现2次。根据平均分布的思想,有两个缺失值需要填充Fa。
all_data[all_data.PoolArea != 0][["PoolArea", "PoolQC"]]
MiscFeature:直接删除。按照文件的意思可填充None。我也探索过MiscFeature与其对应的MiscVal以及GarageType之间的关系,试过一些填充办法,甚至确定了测试集中1089这个例子应该填充Gar2,但最终删除该特征对我的模型效果最好。
all_data[all_data.MiscVal > 10000][["MiscFeature", "MiscVal"]]
Alley:按照文件的意思可填充None。
Fence:同MiscFeature,直接删除。
FireplaceQu:按照文件的意思可填充None。