项目对比(与之前工业蒸汽量预测项目相比):
相同点:
- 二者都属于回归问题,预测一个数值型的目标变量;
- 在数据预处理方面,两个项目均涉及到对于数据偏态的处理(为了更符合回归问题的正态性要求);
- 在模型选择上,两个项目几乎一样,都是先训练多个回归相关模型(核函数岭回归、Lasso、ElasticNet、Gradient Boosting Regression、XGBoost Regressor、LightGBM),然后采用简单模型平均或模型集成方法对多个基模型进行集成。
不同点(注意对不同点的理解一定要基于两个项目数据类型的差异上!工业蒸汽项目数据脱敏且全部为数值型;房价预测项目未脱敏,有数值有类别)(不同点主要体现在数据处理和特征工程上):
- 在异常值处理上,工业蒸汽项目对比了训练集与测试集在不同特征上的分布(该数据全部为数值型,因此可以这样做),删除了不同分布特征,对整体数据进行了标准化。房价预测项目仅仅做了简单的异常值删除(该数据特征有定型、有定量,不能进行前者的分布比较),但是在模型训练时运用了RobustScaler增强对异常值的免疫性。
- 在缺失值处理上,工业蒸汽项目数据脱敏且完整,因此不需要进行太多的缺失值处理。房价预测项目数据未脱敏且数据含许多缺失,因此需要根据变量描述理解每个特征的含义(业务理解)并根据每个特征的含义对缺失值进行填补。
- 在数据标准化上,工业蒸汽项目有对数据进行标准化。房价预测项目没有对数据进行标准化。
- 在数据偏态处理上,工业蒸汽项目没有对训练集的目标值进行偏态处理(这一点属于不完善点),对于其他特征采用对数与指数纠正偏态。房价预测项目对训练集对目标值进行了对数处理,对于其他数值型特征采用box-cox变换。
- 在特征选择上,工业蒸汽项目使用方差分析和单变量选择进行特征筛选。房价预测项目则是尽可能保留所有特征的信息(只删除了一个值全部相同的无区别特征)
- 在新特征生成上,房价预测项目基于对业务的理解,利用现有特征生成了新的特征;工业蒸汽项目为脱敏数据,无法理解数据含义,无法这样做。
- 在特征信息提取上,房价预测项目将部分数值型数据转化为类别型数据(如房屋出售年份、月份、建筑等级),对包含排序信息的类别型数据进行了LabelEncoder(保留排序信息价值),对不含顺序信息对的类别型数据进行dummy variable转换;工业蒸汽项目无类别型数据,无需这样做。
项目流程
- 导入相关库、导入训练集、测试集
- 由于该数据包含ID列,且预测结果需要标明ID。将train/test的ID列分别保存为新的DF:train_ID, test_ID,然后再删除train/test数据中的ID列
- 根据一个特征(房屋面积特征)与目标特征的散点图删除两个异常数据。
- 回归问题目标值可视化(分布图、QQ图)及偏态处理。该步骤可作为模版参考。
- 合并训练集与测试集,方便对特征统一处理。
- 特征与目标相关性可视化
- 计算各个特征缺失值率并可视化
- 基于特征理解对每个特征对缺失值进行填补。
- 某些数据看起来是数值型,其实表达的是类别含义(房屋等级、出售年份、出售月份),将这些数据转化成str类型。
- 对于包含排序信息的类别型变量,采用LabelEncoder进行处理。
- 基于现有的三个特征(地下室面积、一楼面积、二楼面积)生成新的特征(总面积)
- 找到所有数值型变量,计算他们的偏态。对偏态系数的绝对值大于0.75的特征进行box-cox变换。
- 对类别特征进行dummy variable转换。
- 定义k折交叉验证函数(指标为mse)
- 训练基模型,对于部分模型采用RobustScaler增强对异常值的免疫性。
- 用k折交叉验证函数对每个基模型进行评估。
- 定义模型普通平均类和模型集成类(二者都可以对多模型进行融合集成,前者是取简单的平均,后者是集成。该项目选择后者)
- 选择ElasticNet、GBoost、KRR为集成模型的base_models,选择lasso作为集成模型的meta_model,训练集成回归模型,并用k折交叉验证函数进行评估。
- 使用之前训练好的回归集成模型、XGBoost、LightGBM三个模型对测试集预测,将预测结果进行加权融合,得出最终结果。