Data Exploration
在这一步要做的基本就是 EDA (Exploratory Data Analysis),也就是对数据进行探索性的分析,从而为之后的处理和建模提供必要的结论。
通常我们会用 pandas 来载入数据,并做一些简单的可视化来理解数据。
Visualization: matplotlib 和 seaborn
比较常用的图表有:
- 查看目标变量的分布。当分布不平衡时,根据评分标准和具体模型的使用不同,可能会严重影响性能。
- 对 Numerical Variable,可以用 Box Plot 来直观地查看它的分布。
- 对于坐标类数据,可以用 Scatter Plot 来查看它们的分布趋势和是否有离群点的存在。
- 对于分类问题,将数据根据 Label 的不同着不同的颜色绘制出来,这对 Feature 的构造很有帮助。 绘制变量之间两两的分布和相关度图表。
- 参考:https://www.kaggle.com/benhamner/python-data-visualizations
Statistical Tests
我们可以对数据进行一些统计上的测试来验证一些假设的显著性。虽然大部分情况下靠可视化就能得到比较明确的结论,但有一些定量结果总是更理想的。不过,在实际数据中经常会遇到非 i.i.d. 的分布。所以要注意测试类型的的选择和对显著性的解释。 在某些比赛中,由于数据分布比较奇葩或是噪声过强,Public LB的分数可能会跟 Local CV的结果相去甚远。可以根据一些统计测试的结果来粗略地建立一个阈值,用来衡量一次分数的提高究竟是实质的提高还是由于数据的随机性导致的。
Data Preprocessing
大部分情况下,在构造 Feature 之前,我们需要对比赛提供的数据集进行一些处理。通常的步骤有:
有时数据会分散在几个不同的文件中,需要 Join 起来。
处理 Missing Data。
处理 Outlier。
必要时转换某些 Categorical Variable 的表示方式。
有些 Float 变量可能是从未知的 Int 变量转换得到的,这个过程中发生精度损失会在数据中产生不必要的 Noise,即两个数值原本是相同的却在小数点后某一位开始有不同。这对 Model 可能会产生很负面的影响,需要设法去除或者减弱 Noise。
Dummy Variables
类别少的时候:onehot编码
类别多的时候:根据 Feature Importance 或是这些取值本身在数据中的出现频率,为最重要(比如说前 95% 的 Importance)那些取值(有很大可能只有几个或是十几个)创建 Dummy Variables,而所有其他取值都归到一个“其他”类里面。
Feature Engineering
Feature 为主,调参和 Ensemble 为辅
怎么构造有用的 Feature,是一个不断学习和提高的过程。
Feature Selection
总的来说,我们应该生成尽量多的 Feature,相信 Model 能够挑出最有用的 Feature。但有时先做一遍 Feature Selection 也能带来一些好处:
- Feature 越少,训练越快。 有些 Feature 之间可能存在线性关系,影响 Model 的性能。 通过挑选出最重要的Feature,可以将它们之间进行各种运算和操作的结果作为新的 Feature,可能带来意外的提高。
- Feature Selection 最实用的方法也就是看 Random Forest 训练完以后得到的 Feature Importance了。其他有一些更复杂的算法在理论上更加 Robust,但是缺乏实用高效的实现。从原理上来讲,增加 Random Forest中树的数量可以在一定程度上加强其对于 Noisy Data 的 Robustness。
- 看 Feature Importance 对于某些数据经过脱敏处理的比赛尤其重要。这可以免得你浪费大把时间在琢磨一个不重要的变量的意义上。
Model Selection
准备好 Feature 以后,就可以开始选用一些常见的模型进行训练了。Kaggle 上最常用的模型基本都是基于树的模型:
-
Gradient Boosting
-
Random Forest
-
Extra Randomized Trees
以下模型往往在性能上稍逊一筹,但是很适合作为 Ensemble 的 Base Model。这一点之后再详细解释。(当然,在跟图像有关的比赛中神经网络的重要性还是不能小觑的。