对我的分数提升最大的主要有两块:
特征工程 : 主要为离散型变量的排序赋值,特征组合和PCA
模型融合 : 主要为加权平均和Stacking
1.探索性可视化(Exploratory Visualization)
2.数据清洗(Data Cleaning)
3.特征工程(Feature Engineering)
4.基本建模&评估(Basic Modeling & Evaluation)
5.参数调整(Hyperparameters Tuning)
6.集成方法(Ensemble Methods)
1.探索性可视化
查看各特征的类型、意义,以及特征之间的关系。
train.describe() #查看所有特征数学特性
由于建造年份 (YearBuilt) 这个特征存在较多的取值 (从1872年到2010年),直接one hot encoding会造成过于稀疏的数据,因此在特征工程中会将其进行数字化编码(labelenc类)。
2.数据清洗
这里主要的工作是处理“缺失值”,首先来看各特征的缺失值数量:aa = full.isnull().sum()。aa[aa>0].sort_values(ascending=False) #查看所有
存在缺失值的特征,并将其数量从高到低排序。
2.1、仔细观察一下data_description里面的内容的话,会发现很多缺失值都有迹可循,比如上表第一个PoolQC,表示的是游泳池的质量,其值缺失代表的是这个房子本身没有游泳池,因此可以用 “None” 来填补;
2.2、有些特征多为表示XX面积,比如 TotalBsmtSF 表示地下室的面积,如果一个房子本身没有地下室,则缺失值就用0来填补。
2.3、对于有些用数字来表示类型的,可以通过用众数mode填充
完成以上步骤确保train数据集已经不存在缺失值
3.特征工程
3.1我们应该构建尽可能多的特征,并信任模型来选择正确的特性:对于离散型特征,一般采用pandas中的get_dummies进行数值化,但在这个比赛中光这样可能还不够,所以下面我采用的方法是按特征进行分组,计算该特征每个取值下SalePrice的平均数和中位数,再以此为基准排序赋值。map_values()方法。对年使用LabelEncoder,然后是get_dummies。
3.2特征组合:将原始特征进行组合通常能产生意想不到的效果,然而这个数据集中原始特征有很多,不可能所有都一一组合,所以这里先用Lasso进行特征筛选,选出较重要的一些特征进行组合。
3.3PCA:PCA是非常重要的一环,对于最终分数的提升很大。因为我新增的这些特征都是和原始特征高度相关的,这可能导致较强的多重共线性(Multicollinearity),而PCA恰可以去相关性。因为这里使用PCA的目的不是降维,所以n_components用了和原来差不多的维度,这是我多方实验的结果,即前面加XX特征,后面再降到XX维。
4.基本建模&评估
使用了13个算法和5折交叉验证来评估baseline效果:
LinearRegression
Ridge
Lasso
Random Forrest
Gradient Boosting Tree
Support Vector Regression
Linear Support Vector Regression
ElasticNet
Stochastic Gradient Descent
BayesianRidge
KernelRidge
ExtraTreesRegressor
XgBoost
5.参数调整
常见方法是GridSearch
6.集成方法
Voting:模型融合其实也没有想象的那么高大上,从最简单的Voting说起,这也可以说是一种模型融合。假设对于一个二分类问题,有3个基础模型,那么就采取投票制的方法,投票多者确定为最终的分类。
Averaging:对于回归问题,一个简单直接的思路是取平均。稍稍改进的方法是进行加权平均。权值可以用排序的方法确定,举个例子,比如A、B、C三种基本模型,模型效果进行排名,假设排名分别是1,2,3,那么给这三个模型赋予的权值分别是3/6、2/6、1/6。这两种方法看似简单,其实后面的高级算法也可以说是基于此而产生的,Bagging或者Boosting都是一种把许多弱分类器这样融合成强分类器的思想。
Bagging:RandomForest
Boosting:Adaboost、GBDT、Xgboost
Stacking:用了Lasso,Ridge,SVR,KernelRidge,ElasticNet,BayesianRidge作为第一层模型,KernelRidge作为第二层模型第一层5个模型,第二层1个元模型。第一层模型的作用是训练得到一个Rn×m的特征矩阵来用于输入第二层模型训练,其中n为训练数据行数,m为第一层模型个数。