kaggle实践

EDA (Exploratory Data Analysis)

  • 探索性分析数据
  • 当前研究问题的领域知识
  • 数据可视化 matplotlib, seabon(为了检验领域知识、检验数据集数值特征)
    • 比如:整体的数据分布,离群的数据个体, 两两变量之间的相关度和分布图
    • Numeric variable 推荐使用box plot 来作图, 坐标类数据 推荐使用scatter plot作图(why?)
  • 使用统计学上的显著性检验 去验证自己给出的关于研究问题的数据集的假设是否成立?
    • 非iid分布对显著性检验的影响?如何消除?如何在非iid情况下继续显著性检验或者其他统计实验。
数据预处理Data preprocessing(是准备提取特征前的必要步骤)
  • Join 数据表格, 可以统一处理数据
  • 处理不规则数据(missing data, outlier), 数据转换中产生的Noise(比如float 转 int, int转float时产生的不精确性))
特征工程feature engineering
  • 结合之前的探索性分析以及目标问题,提取特征(特征可以是明显的,也可以是隐藏的,这一块比较复杂,需要经验积累)
  • 特征选择feature selection(可以先把能够想到的feature都提取出来,然后挑选着做训练)。此外,** Random Forest ** 模型可以帮助提取 **Feature Importance **。 (feature importance对于脱敏数据格外重要,因为脱敏数据一般不具有实际的意义,所以人脑不太能够发现脱敏数据是否重要)
  • categorical variable的表示方式重新编码(one-hot-enconding)
选择模型,调参训练模型 准备好 Feature 以后,就可以开始选用一些常见的模型进行训练了。Kaggle 上最常用的模型基本都是基于树的模型:
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
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
建立机器学习工作流以自动化Pipeline 可以看出 Kaggle 比赛的 Workflow 还是比较复杂的。尤其是 Model Selection 和 Ensemble。理想情况下,我们需要搭建一个高自动化的 Pipeline,它可以做到:
模块化 Feature Transform,只需写很少的代码就能将新的 Feature 更新到训练集中。
自动化 Grid Search,只要预先设定好使用的 Model 和参数的候选,就能自动搜索并记录最佳的 Model。
自动化 Ensemble Generation,每个一段时间将现有最好的 K 个 Model 拿来做 Ensemble。
对新手来说,第一点可能意义还不是太大,因为 Feature 的数量总是人脑管理的过来的;第三点问题也不大,因为往往就是在最后做几次 Ensemble。但是第二点还是很有意义的,手工记录每个 Model 的表现不仅浪费时间而且容易产生混乱。
Crowdflower Search Results Relevance 的第一名获得者 Chenglong Chen 将他在比赛中使用的 Pipeline 公开了,非常具有参考和借鉴意义。只不过看懂他的代码并将其中的逻辑抽离出来搭建这样一个框架,还是比较困难的一件事。可能在参加过几次比赛以后专门抽时间出来做会比较好。

    推荐阅读