EDA (Exploratory Data Analysis)
- 探索性分析数据
- 当前研究问题的领域知识
- 数据可视化 matplotlib, seabon(为了检验领域知识、检验数据集数值特征)
- 比如:整体的数据分布,离群的数据个体, 两两变量之间的相关度和分布图
- Numeric variable 推荐使用box plot 来作图, 坐标类数据 推荐使用scatter plot作图(why?)
- 使用统计学上的显著性检验 去验证自己给出的关于研究问题的数据集的假设是否成立?
- 非iid分布对显著性检验的影响?如何消除?如何在非iid情况下继续显著性检验或者其他统计实验。
- Join 数据表格, 可以统一处理数据
- 处理不规则数据(missing data, outlier), 数据转换中产生的Noise(比如float 转 int, int转float时产生的不精确性))
- 结合之前的探索性分析以及目标问题,提取特征(特征可以是明显的,也可以是隐藏的,这一块比较复杂,需要经验积累)
- 特征选择feature selection(可以先把能够想到的feature都提取出来,然后挑选着做训练)。此外,** Random Forest ** 模型可以帮助提取 **Feature Importance **。 (feature importance对于脱敏数据格外重要,因为脱敏数据一般不具有实际的意义,所以人脑不太能够发现脱敏数据是否重要)
- categorical variable的表示方式重新编码(one-hot-enconding)
Gradient Boosting
Random Forest
Extra Randomized Trees
【kaggle实践】以下模型往往在性能上稍逊一筹,但是很适合作为 Ensemble 的 Base Model。这一点之后再详细解释。(当然,在跟图像有关的比赛中神经网络的重要性还是不能小觑的。)
SVM
Linear Regression
Logistic Regression
Neural Networks
以上这些模型基本都可以通过 sklearn 来使用。
- 训练模型时调参一般需要根据过往经验
- 此外, 可以使用grid search加快调参的速度。(grid search会对所有给定的候选参数组合进行暴力组合搜索)
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(融合多个模型的方法) Ensemble Learning 是指将多个不同的 Base Model 组合成一个 Ensemble Model 的方法。它可以同时降低最终模型的 Bias 和 Variance(证明可以参考这篇论文,我最近在研究类似的理论,可能之后会写新文章详述),从而在提高分数的同时又降低 Overfitting 的风险。
常见的 Ensemble 方法有这么几种:
- Bagging:使用训练数据的不同随机子集来训练每个 Base Model,最后进行每个 Base Model 权重相同的 Vote。也即 Random Forest 的原理。
- Boosting:迭代地训练 Base Model,每次根据上一个迭代中预测错误的情况修改训练样本的权重。也即 Gradient Boosting 的原理。比 Bagging 效果好,但更容易 Overfit。
- Blending:用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。实现简单,但对训练数据利用少了。
- Stacking
模块化 Feature Transform,只需写很少的代码就能将新的 Feature 更新到训练集中。
自动化 Grid Search,只要预先设定好使用的 Model 和参数的候选,就能自动搜索并记录最佳的 Model。
自动化 Ensemble Generation,每个一段时间将现有最好的 K 个 Model 拿来做 Ensemble。
对新手来说,第一点可能意义还不是太大,因为 Feature 的数量总是人脑管理的过来的;第三点问题也不大,因为往往就是在最后做几次 Ensemble。但是第二点还是很有意义的,手工记录每个 Model 的表现不仅浪费时间而且容易产生混乱。
Crowdflower Search Results Relevance 的第一名获得者 Chenglong Chen 将他在比赛中使用的 Pipeline 公开了,非常具有参考和借鉴意义。只不过看懂他的代码并将其中的逻辑抽离出来搭建这样一个框架,还是比较困难的一件事。可能在参加过几次比赛以后专门抽时间出来做会比较好。