机器学习-XGBoost 及参数调整
原文:Updated: XGBoost with parameter tuning
整体思路总结:
- 导入包
- 导入数据
- 数据清洗:
- 去掉缺失数据过多的变量(标准未给出)
- 模拟变量:直接变为整数
- 空数据替换为 0
- 描述性分析:观察数据特点
- 绘制相关图,寻找与 y 强相关变量
- 绘制这些变量的相关图
- 考虑多重共线性对变量选择的影响
- 适可而止(?)
- 套用模型并分别检查误差,选取最低的那个(XGBoost)
- 最终预测
作者的话:如果想要获得更高分数,看来必须要使用 XGBoost。这个包很好用,但是我遇到了调参的问题。同时,我的 feature engineering 也貌似太幼稚了。对于不同的分类型变量,我应该一个个检查,而不是直接转换成整数。之后会尝试这些,看看 feature engineering 的奇效。
1. 读取数据,导入包
在此之后就是程序主体。主体程序分为四步:
- 数据清洗
- 描述性分析
- 模型选择
- 最终预测
2. 数据清洗
对于数据清洗,重点是有特定的规则,否则会影响结果的准确性。对 training set 总结一下之后,不难发现很多字段都有数据缺失。首先要处理每个变量下的缺失数据。
在 1460 个变量里,‘Alley’, ‘PoolQC’, ‘Fence’ 和 ‘MiscFeature’ 下的缺失数据极多。因此我决定去掉这些变量。处理之后,有效变量降到了 75 个(不含 id)。
然后把假/模拟变量变成数字的形式。由于这部分变量非常多,我决定直接通过“as integer”(变整数)的方式处理。这也是在读取数据文件的时候我把字符串作为因素的原因(???)。数字形式的变量按照描述性分析的需求进行了排序。
最后,对于剩余的空数据,我直接替换成了 0. 到这里数据清洗结束。
3. 描述性分析
变量特别多的时候,很难直观从数据集里获得有效信息。所以我主要观察了数字型变量。假/模拟变量的描述性分析主要通过绘制盒图的方式进行的。部分假/模拟变量,比如 ‘Street’,根据盒图的极端情况来看,是无效的。在把假/模拟变量转换为数字变量之前,就已经对数字变量进行排序了。
首先绘制一个数字变量的相关性图。重点观察与售价强相关的变量。
‘OverallQual’,‘TotalBsmtSF’,‘GarageCars’ 和 ‘GarageArea’ 彼此之间有相对较强的相关性。所以作为例子,把这四个变量与售价的相关性图绘制出来。
看起来售价与其他变量有不错的线性关系。但是,还有一点不能忽略,部分依赖性的变量与其他变量也有线性关系。这里很明显有多重共线性的问题,回归公式的变量非常多的时候需要处理一下。
我最终放在这里的描述性分析是 ‘YearBu’ 和售价的关系。
不难发现,随着建造年份,房屋售价整体在上升,趋势很明显。
探寻数据的工作量巨大,所以我打算就此停住。通过描述性分析可以获得更多的细节。
模型选择
采用模型之前,首先需要把 training set 数据分为两部分:training 和 test。我个人喜欢按照 6:4 的比例来分,但是如果有人能告诉我一个科学的分配比例我会非常感激的。我会用 training set 套三个回归模型,然后通过 RMSE 来选最合适的模型。
Model 1: Linear Regression
第一个也是最简单但是有用的模型是线性回归模型。第一步,把所有变量放入模型里。
R Square 结果不错(???),但是很多变量没能通过 Hypothesis Testing。所以模型不够好。如果坚持用这个模型,可能会出现 overfit。所以,在建立模型的过程中需要加入变量选择。我偏好使用 Step AIC 方法。
仍然有几个变量应该去掉,通过检查 Hypothesis Test 结果,我手动建立了最终的线性回归模型。
……代码
The R Square 结果不错,所有变量都通过了 Hypothesis Test。residual 结果也不错。结果可以看下图。
用 RMSE 检查线性回归模型的表现:0.1808267
Model 2: LASSO Regression
为避免多重共线性,可以使用 LASSO 回归模型。(它)把变量转换为矩阵的格式,可以自动进行变量选择,使用 Lars 包里的 lars 方法就可以。
因为变量太多了,图很乱。但尽管如此,还是可以用 R 找到多重共线性最低的模型。筛选的步骤是根据 Marrow’s cp 的值来的,这个值能够预测多重共线性。预测结果可以通过脚本最优步骤来完成,RMSE 可以用于评估模型。
Model 3: Random Forest
另外还选了一个 Random Forest model。以下语法略。
Model 4: XGBoost
这个包真的让我印象深刻!我非常想继续探索这个包。第一步是把数据集转换为稀疏矩阵。
然后调参,建立了一个 20 层的 for 循环。不清楚这个方法是否可靠不过真的很费时间。
然后通过随机选择参数。由于过程比较无聊,我就在 RMarkdown 文档里跳过了。用了我本地 R 脚本里的预测和评估后的最优参数。能否问下有没有更好的 smart Kagglers 调参方式?
最终决定之前应该测试一下模型。
Final Prediction
选完参数之后,再用 training 数据集去做一下 training。最终预测之前,test 数据集需要转换成 training set 的形式。