1、比赛概述html
2、可视化python
一般来讲 matplotlib 和 seaborn 提供的绘图功能就能够知足需求了。git
比较经常使用的图表有:github
大部分状况下,在构造 Feature 以前,咱们须要对比赛提供的数据集进行一些处理。一般的步骤有:算法
这一部分的处理策略多半依赖于在前一步中探索数据集所获得的结论以及建立的可视化图表。在实践中,我建议使用 iPython Notebook 进行对数据的操做,并熟练掌握经常使用的 pandas 函数。spring
总的来讲,咱们应该生成尽可能多的 Feature,相信 Model 可以挑出最有用的 Feature。但有时先作一遍 Feature Selection 也能带来一些好处:windows
Feature Selection 最实用的方法也就是看 Random Forest 训练完之后获得的 Feature Importance 了。其余有一些更复杂的算法在理论上更加 Robust,可是缺少实用高效的实现,好比这个。从原理上来说,增长 Random Forest 中树的数量能够在必定程度上增强其对于 Noisy Data 的 Robustness。数组
看 Feature Importance 对于某些数据通过脱敏处理的比赛尤为重要。这能够省得你浪费大把时间在琢磨一个不重要的变量的意义上。网络
这里用一个例子来讲明在一些状况下 Raw Feature 可能须要通过一些转换才能起到比较好的效果。dom
假设有一个 Categorical Variable 一共有几万个取值可能,那么建立 Dummy Variables 的方法就不可行了。这时一个比较好的方法是根据 Feature Importance 或是这些取值自己在数据中的出现频率,为最重要(好比说前 95% 的 Importance)那些取值(有很大可能只有几个或是十几个)建立 Dummy Variables,而全部其余取值都归到一个“其余”类里面。
5、模型选择
准备好 Feature 之后,就能够开始选用一些常见的模型进行训练了。Kaggle 上最经常使用的模型基本都是基于树的模型:
如下模型每每在性能上稍逊一筹,可是很适合做为 Ensemble 的 Base Model。这一点以后再详细解释。(固然,在跟图像有关的比赛中神经网络的重要性仍是不能小觑的。)
以上这些模型基本均可以经过 sklearn 来使用。
固然,这里不能不提一下 Xgboost。Gradient Boosting 自己优秀的性能加上 Xgboost 高效的实现,使得它在 Kaggle 上广为使用。几乎每场比赛的获奖者都会用 Xgboost 做为最终 Model 的重要组成部分。在实战中,咱们每每会以 Xgboost 为主来创建咱们的模型而且验证 Feature 的有效性。顺带一提,在 Windows 上安装 Xgboost 很容易遇到问题,目前已知最简单、成功率最高的方案能够参考我在这篇帖子中的描述。
在训练时,咱们主要但愿经过调整参数来获得一个性能不错的模型。一个模型每每有不少参数,但其中比较重要的通常不会太多。好比对 sklearn 的 RandomForestClassifier
来讲,比较重要的就是随机森林中树的数量 n_estimators
以及在训练每棵树时最多选择的特征数量max_features
。因此咱们须要对本身使用的模型有足够的了解,知道每一个参数对性能的影响是怎样的。
一般咱们会经过一个叫作 Grid Search 的过程来肯定一组最佳的参数。其实这个过程说白了就是根据给定的参数候选对全部的组合进行暴力搜索。
1 |
param_grid = {'n_estimators': [300, 500], 'max_features': [10, 12, 14]} |
顺带一提,Random Forest 通常在 max_features
设为 Feature 数量的平方根附近获得最佳结果。
这里要重点讲一下 Xgboost 的调参。一般认为对它性能影响较大的参数有:
eta
:每次迭代完成后更新权重时的步长。越小训练越慢。num_round
:总共迭代的次数。subsample
:训练每棵树时用来训练的数据占所有的比例。用于防止 Overfitting。colsample_bytree
:训练每棵树时用来训练的特征的比例,相似 RandomForestClassifier
的 max_features
。max_depth
:每棵树的最大深度限制。与 Random Forest 不一样,Gradient Boosting 若是不对深度加以限制,最终是会 Overfit 的。early_stopping_rounds
:用于控制在 Out Of Sample 的验证集上连续多少个迭代的分数都没有提升后就提早终止训练。用于防止 Overfitting。通常的调参步骤是:
eta
设得比较高(好比 0.1),num_round
设为 300 ~ 500。eta
下降,找到最佳值。early_stopping_rounds
。 1 |
X_dtrain, X_deval, y_dtrain, y_deval = cross_validation.train_test_split(X_train, y_train, random_state=1026, test_size=0.3) |
最后要提一点,全部具备随机性的 Model 通常都会有一个 seed
或是 random_state
参数用于控制随机种子。获得一个好的 Model 后,在记录参数时务必也记录下这个值,从而可以在以后重现 Model。
Cross Validation 是很是重要的一个环节。它让你知道你的 Model 有没有 Overfit,是否是真的可以 Generalize 到测试集上。在不少比赛中 Public LB 都会由于这样那样的缘由而不可靠。当你改进了 Feature 或是 Model 获得了一个更高的 CV 结果,提交以后获得的 LB 结果却变差了,通常认为这时应该相信 CV 的结果。固然,最理想的状况是多种不一样的 CV 方法获得的结果和 LB 同时提升,但这样的比赛并非太多。
在数据的分布比较随机均衡的状况下,5-Fold CV 通常就足够了。若是不放心,能够提到 10-Fold。可是 Fold 越多训练也就会越慢,须要根据实际状况进行取舍。
不少时候简单的 CV 获得的分数会不大靠谱,Kaggle 上也有不少关于如何作 CV 的讨论。好比这个。但总的来讲,靠谱的 CV 方法是 Case By Case 的,须要在实际比赛中进行尝试和学习,这里就再也不(也不能)叙述了。
Ensemble Learning 是指将多个不一样的 Base Model 组合成一个 Ensemble Model 的方法。它能够同时下降最终模型的 Bias 和 Variance(证实能够参考这篇论文,我最近在研究相似的理论,可能以后会写新文章详述),从而在提升分数的同时又下降 Overfitting 的风险。在如今的 Kaggle 比赛中要不用 Ensemble 就拿到奖金几乎是不可能的。
常见的 Ensemble 方法有这么几种:
从理论上讲,Ensemble 要成功,有两个要素:
相比 Blending,Stacking 能更好地利用训练数据。以 5-Fold Stacking 为例,它的基本原理如图所示:
整个过程很像 Cross Validation。首先将训练数据分为 5 份,接下来一共 5 个迭代,每次迭代时,将 4 份数据做为 Training Set 对每一个 Base Model 进行训练,而后在剩下一份 Hold-out Set 上进行预测。同时也要将其在测试数据上的预测保存下来。这样,每一个 Base Model 在每次迭代时会对训练数据的其中 1 份作出预测,对测试数据的所有作出预测。5 个迭代都完成之后咱们就得到了一个 #训练数据行数 x #Base Model 数量
的矩阵,这个矩阵接下来就做为第二层的 Model 的训练数据。当第二层的 Model 训练完之后,将以前保存的 Base Model 对测试数据的预测(由于每一个 Base Model 被训练了 5 次,对测试数据的全体作了 5 次预测,因此对这 5 次求一个平均值,从而获得一个形状与第二层训练数据相同的矩阵)拿出来让它进行预测,就获得最后的输出。
这里给出个人实现代码:
1 |
class Ensemble(object): |
获奖选手每每会使用比这复杂得多的 Ensemble,会出现三层、四层甚至五层,不一样的层数之间有各类交互,还有将通过不一样的 Preprocessing 和不一样的 Feature Engineering 的数据用 Ensemble 组合起来的作法。但对于新手来讲,稳妥当当地实现一个正确的 5-Fold Stacking 已经足够了。
能够看出 Kaggle 比赛的 Workflow 仍是比较复杂的。尤为是 Model Selection 和 Ensemble。理想状况下,咱们须要搭建一个高自动化的 Pipeline,它能够作到:
对新手来讲,第一点可能意义还不是太大,由于 Feature 的数量老是人脑管理的过来的;第三点问题也不大,由于每每就是在最后作几回 Ensemble。可是第二点仍是颇有意义的,手工记录每一个 Model 的表现不只浪费时间并且容易产生混乱。