机器学习-XGBoost 及参数调整

2017-06-07  本文已影响176人  4282a0e145f5

原文:Updated: XGBoost with parameter tuning

整体思路总结:

  1. 导入包
  2. 导入数据
  3. 数据清洗:
    1. 去掉缺失数据过多的变量(标准未给出)
    2. 模拟变量:直接变为整数
    3. 空数据替换为 0
  4. 描述性分析:观察数据特点
    1. 绘制相关图,寻找与 y 强相关变量
    2. 绘制这些变量的相关图
    3. 考虑多重共线性对变量选择的影响
    4. 适可而止(?)
  5. 套用模型并分别检查误差,选取最低的那个(XGBoost)
  6. 最终预测

作者的话:如果想要获得更高分数,看来必须要使用 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 的形式。

上一篇下一篇

猜你喜欢

热点阅读