Kaggle(一) 房价预测 (随机森林、岭回归、集成学习)
项目介绍:通过79个解释变量描述爱荷华州艾姆斯的住宅的各个方面,然后通过这些变量训练模型,
来预测房价。
kaggle项目链接:https://www.kaggle.com/c/house-prices-advanced-regression-techniques
数据描述:
train.csv - 训练集
test.csv - 测试集
### 二.数据清洗
把train与test两个数据集合并到一起来处理79个解释变量,等用test来进行预测时就不需再次处理了。
#### 2. 由于有些房子没有车库,造成车库相关的属性缺失,对于这种情况,我们有missing填充,同时对于车库建造时间的缺失,我们用1900填充,表示车库是年久的,使其变得不重要。
```python
garage_obj=['GarageType','GarageFinish','GarageQual','GarageCond'] #列出车库这一类
for garage in garage_obj:
all_df[garage].fillna('missing',inplace=True)
all_df['GarageYrBlt'].fillna(1900.,inplace=True)
```
#### 3.装修类中,装修类型为空的表示没装修过,用missing表示;装修面积为0;
all_df['MasVnrType'].fillna('missing',inplace=True) #用missing标签表示没装修过 all_df['MasVnrArea'].fillna(0,inplace=True) #用0表示没装修过的装修面积 #再次查看数据缺失率,最高为0.16,是LotFrontage列 (all_df.isnull().sum()/len(all_df)).sort_values(ascending=False) #从图中看出LotFrontage分布较均匀,可以用均值补齐缺失值 plt.figure(figsize=(16,6)) plt.plot(all_df['Id'],all_df['LotFrontage'])图一:
python #均值补齐LotFrontage列 all_df['LotFrontage'].fillna(all_df['LotFrontage'].mean(),inplace=True)
#### 4.离散值进行one-hot处理
#还有部分少量的缺失值,不是很重要,可以用one-hotd转变离散值,然后均值补齐 all_dummies_df=pd.get_dummies(all_df) mean_col=all_dummies_df.mean() all_dummies_df.fillna(mean_col,inplace=True) 三.数值转换找出类型为数值的所有列,进行标准化处理
#数据集中数值类型为int和float all_dummies_df['Id']=all_dummies_df['Id'].astype(str) #先排除ID列,不对Id列进行处理 a=all_dummies_df.columns[all_dummies_df.dtypes=='int64'] #数值为int型 b=all_dummies_df.columns[all_dummies_df.dtypes=='float64'] #数值为float型 #进行标准化处理,符合0-1分布 a_mean=all_dummies_df.loc[:,a].mean() a_std=all_dummies_df.loc[:,a].std() all_dummies_df.loc[:,a]=(all_dummies_df.loc[:,a]-a_mean)/a_std #使数值型为int的所有列标准化 b_mean=all_dummies_df.loc[:,b].mean() b_std=all_dummies_df.loc[:,b].std() all_dummies_df.loc[:,b]=(all_dummies_df.loc[:,b]-b_mean)/b_std #使数值型为float的所有列标准化 最终处理完的数据集:其中包含自己把train数据集中按0.8:0.2分为train_train和train_test俩数据集,来比较哪个模型能更好预测数据,然后再用来预测最终的test数据集。
#处理后的训练集(不含Saleprice) df_train1=all_dummies_df.iloc[:1460,:] df_train_train=df_train1.iloc[0:int(0.8*len(df_train1)),:] #train中的训练集(不含Saleprice) df_train_test=df_train1.iloc[int(0.8*len(df_train1)):,:] #train中的测试集(不含Saleprice) df_train_train_y=y_train.iloc[0:int(0.8*len(y_train))] #train中训练集的target df_train_test_y=y_train.iloc[int(0.8*len(df_train1)):] #train中测试集的target #处理后的测试集 df_test1=all_dummies_df.iloc[1460:,:]### 四.建模
分析,显然是回归问题,本项目中解决回归问题的方法:岭回归、随机森林、集成学习
1.岭回归这里要用的特征较多,适合岭回归进行建模,把所有特征放进去就行,无需进行特征选取
#加载相关库 from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score #对岭回归的正则化度进行调参,用到k折交叉验证 alphas=np.logspace(-2,2,50) test_scores1=[] test_scores2=[] for alpha in alphas: clf=Ridge(alpha) scores1=np.sqrt(cross_val_score(clf,df_train_train,df_train_train_y,cv=5)) scores2=np.sqrt(cross_val_score(clf,df_train_train,df_train_train_y,cv=10)) test_scores1.append(1-np.mean(scores1)) test_scores2.append(1-np.mean(scores2)) #从图中找出当正则化参数alpha为多少时,误差最小 %matplotlib inline plt.plot(alphas,test_scores1,color='red') #交叉验证k为5时,误差最小 plt.plot(alphas,test_scores2,color='green')图二
当alpha在0~10之间时,整体结构风险最小。(猜测可能在alpha=5时最小