Stacked Regression Model
总体介绍:通过对房价的预测展示集成回归模型构建的入门思路和方法。文中所用到的原始训练数据train和测试数据test可在本账号下免费下载。其中,目标变量为定量数据,即房屋价格;特征变量为分类数据和定量数据相混合。
步骤及注意:
1.本过程分为两步,第一步是原始数据的整理,处理缺失值,对数据类型及数据分布类型进行转换,便于下一步的模型训练。五四运动图片
职工带薪年休假2.若已有现成面板数据,可以直接越过第一步,从第二步开始直接建模。但直接建模前还是要注意数据的分布类型(正态分布还是其他分布)以及是定量数据还是分类数据,例如在本例的特征变量中,将分类数据或者看似分类数据的定量数据(例如MSSubClass变量)进行了编码赋值处理。
总之,在模型训练之前,一定先要把数据整理好,否则最终效果会受一定影响。
# 数据整理需要的库
1.import numpy as np
2.import pandas as pd
3.import matplotlib.pyplot as plt
4.import aborn as sns
5.color =&lor_palette()
6.sns.t_style('darkgrid')
7.from scipy.stats import norm, skew
掀盖头8.from sklearn.preprocessing import LabelEncoder
9.from scipy.special import boxcox1p
ceeport10.pd.t_option('display.float_format', lambda x: '{:.3f}'.format(x)) =
# 模型构建需要的库
1.from sklearn.linear_model import ElasticNet, Lasso
2.from&ble import GradientBoostingRegressor
3.from sklearn.kernel_ridge import KernelRidge
4.from sklearn.pipeline import make_pipeline
5.from sklearn.preprocessing import RobustScaler
6.from sklearn.ba import BaEstimator, TransformerMixin, RegressorMixin, clone
7.from&del_lection import KFold, cross_val_score
8.import xgboost as xgb
9.import lightgbm as lgb
第一步:数据整理和处理
# 首先保留数据集中的Id项,然后删除
1.train_ID = train['Id']
2.test_ID = test['Id']
3.train.drop("Id", axis=1, inplace=True)
4.test.drop("Id", axis=1, inplace=True)
#查看异常值
1.fig, ax = plt.subplots()
2.ax.scatter(x=train['GrLivArea'], y=train['SalePrice'])
3.plt.ylabel('saleprice', fontsize=14)
4.plt.xlabel('grlivarea', fontsize=14)
5.plt.show()
上图中我们可以看出,右下方存在极大的GrLivArea值,但SalePrice值却很低,属于异常值(极大的房屋面积但售价却极低,不符合逻辑)。
train = train.drop(train[(train['GrLivArea']>4000)&(train['SalePrice']<300000)].index)
1.sns.distplot(train['SalePrice'], fit=norm) # 对房价SalePrice做直方图与核密度曲线,并拟合正态分布曲线
2.plt.show()
上图中可以看出变量为右偏曲线,不服从正态分布,但模型尤其是线性模型偏爱正态分布数据,因此我们利用log(1+x)函数将数据类型转换为正态分布。
1.train['SalePrice'] = np.log1p(train['SalePrice']) # 数据类型转换
2.sns.distplot(train['SalePrice'], fit=norm) # 查看转换后的数据分布
3.plt.show() # 由图可以看出转换后效果不错,趋向于正态分布
1.n_train = train.shape[0] # 保存原始训练数据的行数
2.n_test = test.shape[0] # 保存原始测试数据的行数
3.y_train = train.SalePrice.values # 训练数据的目标变量y
4.all_data =&at((train, test)).ret_index(drop=True) # 先将训练数据和测试数据合并在一个数据框中
5.all_data.drop(['SalePrice'], axis=1, inplace=True) # 删除目标变量SalePrice,总数据框中仅剩下特征变量
6.all_data_na = (all_data.isnull().sum() / len(all_data)) * 100 # 计算每一列缺失值的比例
7.all_data_na = all_data_na.drop(all_data_na[all_data_na==0].index).sort_values(ascending=Fal) # 仅查看有缺失值的特征变量
8.missing_data = pd.DataFrame({'missing ratio': all_data_na})
9.print(missing_data.head(10)) # 查看缺失值占比排前10位的特征变量
1.figure, ax = plt.subplots(figsize=(10, 6))
2.sns.barplot(x=all_data_na.index, y=all_data_na)
3.icks(rotation='90')
4.plt.xlabel('特征变量', fontsize=15)
5.plt.ylabel('缺失值比例(%)', fontsize=15)
6.plt.title('特征变量缺失值构成', fontsize=15)
7.Params['font.sans-rif'女生群聊名称] = ['SimHei']
8.plt.show() # 绘制所有特征变量的缺失值占比条图
1.cor =&() # 查看训练集中各特征变量与SalePrice变量的相关性
2.plt.subplots(figsize=(10, 8))
3.sns.heatmap(cor, vmax=0.9, square=True)
4.plt.show() # 绘制相关性热图
# 下面对缺失值进行处理
1.all_data["LotFrontage"]=upby("Neighborhood")["LotFrontage"].transform(lambda x: x.dian())) # 在不同Neighborhood组别中,利用LotFrontage变量中非缺失值的中位数对缺失值进行插值替代
2.for col in (美羊羊图片'PoolQC', 'MiscFeature', 'Alley', 'Fence', 'FireplaceQu', 'GarageType', 'GarageFinish', 'GarageQual', 'GarageCond', 'BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2', 'MasVnrType', 'MSSubClass'):
3. all_data[col] = all_data[col].fillna('None') # 将以上含有缺失值的变量,全部替换为‘None’表示,例如PoolQC变量为NA,表示该房子没有游泳池,因此用‘None’代替NA
4.for col in ('GarageYrBlt', 'GarageArea', 'GarageCars', 'BsmtFinSF1', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'BsmtFullBath', 'BsmtHalfBath', 'MasVnrArea'):
5. all_data[col] = all_data[col].fillna(0) # 将此类变量用0代替NA,例如,没有车库就意味着车库中没有汽车,为0
6.all_data['MSZoning'长沙高考] = all_data['MSZoning'].fillna(all_data['MSZoning'].mode()[0]) # MSZoning变量中取值最多的为'RL',因此用'RL'填充缺失值
7.all_data = all_data.drop(['Utilities'], axis=1) # 去掉对模型预测无帮助的变量Utilities
8.all_data["Functional"] = all_data["Functional"].fillna("Typ")
9.all_data['Electrical'] = all_data['Electrical'].fillna(all_data['Electrical'].mode()[0])
10.all_data['KitchenQual'仙人走兽]=all_data['KitchenQual'].fillna(all_data['KitchenQual'].mode()[0])