9 _( \" }# A. }+ W特征工程 ☛ 模型选择 ☛ 调参 ☛ 模型融合6 _1 f' n( x8 U
2 g8 f' G0 r, j- g
1.特征工程5 D' z" a0 O! l1 C
' B4 u8 C9 [ m9 ~* b
特征工程是Kaggle比赛的重中之重,尤其是对于房价预测这类使用树模型的比赛。模型大同小异,基本是由GBDT模型演化而来,而且主要用XGBoost、LightGBM等几种开源框架。所以,模型大家都差不多,特征就是关键了。0 {4 Z7 {3 } T7 Y7 x& r& F
每个比赛都有独特的背景,想要发现甚至是自己创造出重要的特征,往往需要专业的领域知识,比如Zillow这个比赛要预测美国的房价,原始特征有卧室数量、面积,税收等等。想要自己通过原始特征组合,创造出一个“magic feature”就需要了解美国的房地产业。所以,选择一个自己熟悉领域的比赛,会比较有优势。1 G, U0 f1 H$ H& J. O' s: t- l
比赛背景千变万化,从数据科学的角度,还有许多通用的方法来做特征工程。这里列举一些这个比赛里用到的方法:0 C5 R& k0 X$ c# u$ ~9 D7 t, Z. T j
* _, ^7 \2 h! L: J; ]; j
(1)基础预处理:对category类型的数据OneHot编码;数值类型的数据归一化(但是这里用到的大多数模型都是基于决策树的,所以不需要)8 K+ D; i/ P$ Q/ H [
8 c! V( t8 M6 {5 G
(2)缺失值处理:实际数据集中有许多数据是缺失的,考虑列出每个特征的缺失比例,比例过大的直接舍弃,否则想办法填充。这个比例没有什么定式,舍弃特征会丢掉有用信息,填充会引入噪声,具体怎么操作要看模型实际的表现。填充的话,基础的是用均值、中位数等填充,更准确的方法是用算法拟合,还可以直接把缺失视为一种特殊的值(这个比赛中的许多模型就是用-1填充)。 9 O, @) E; O$ @$ t# V' i" w. {) N" A+ E4 {* x0 j0 O7 E+ Q* F
对于树模型来说,数据缺失并不影响树的生成,所以xgboost会在生成树的同时,根据training loss自动学会将遇到缺失值时分裂到左子树还是右子树。作者Tianqi Chen的原话: ' n6 q9 B+ b- Z& E" n- @' W% I' @4 B$ g( E0 d6 ^
Internally, XGBoost will automatically learn what is the best direction to go when a value is missing. Equivalently, this can be viewed as automatically "learn" what is the best imputation value for missing values based on reduction on training loss. ; z& \$ X. G$ y& y7 J0 f: } / h$ Y8 U, D4 R6 q# m(3)异常值(outlier): 由于各种原因,往往有一些样本的误差特别大,把这些样本加入模型会引入很大的噪声,就像很多打分的比赛会去掉最高分和最低分之后再取平均值。这个比赛中去掉这样大误差的outlier能带来很大的提升。 7 n, M( [5 @' g- z+ t- j+ M- o: U. Y7 ]3 u
(4)相关性分析:特征之间并不是完全独立的,这时候可以计算correlation coefficient来确定特征之间的两两关系。还可以计算每个特征和目标值(这里是logerror)之间的相关性,绝对值越大说明这个特征的作用越大。. [, P( ~' a |
: H9 v! ~8 X4 v, T$ z(5)模型权重分析:现在大多数模型在训练完成后都会给出获取特征权重的接口,这时的权重是直接反映了一个特征在这个模型中的作用。这是判断一个特征是否有用的重要方法。例如,原始特征有卧室数量和卫生间数量,我们自己创造了一个特征房间总数(卧室数量+卫生间数量)。这时可以用这种方法判断这个新特征是否有效。/ Y1 P& s! I& X" N
特征工程在实际应用中非常有挑战性,还有许多方法,上述只是一些皮毛。Zillow比赛里我尝试了许多新特征,但最终都没有采用。 2 z7 p, W W; E- U& M0 T 而对于语音识别比赛来说,特征工程就非常有限了。在语音识别领域广泛使用的特征是log-mel频谱和mfcc特征,没有必要自己再做特征工程。而现在火热的端到端(end-to-end)语音识别优点就是省去特征提取,直接使用原始波形作为神经网络的输入。' k- f6 ]& \1 ^) @9 B. K
: a4 T9 p9 u. m8 h1 |- M2.模型选择2 i; V7 }; R. B. r
N6 W+ W/ `; ?( E( i7 O" U
Kaggle比赛很重要的一点是,不可能只使用一个单一模型。在许多比赛的第一名公布的方案里,往往有十几个甚至几十个不同的模型。模型融合(ensemble)实在是太重要了,模型融合的方法下文再讲,但是在选择模型的时候就要考虑到如何让这些模型在融合后效果更好。 ! [, R7 Q' C) W! k \6 F- B0 I- N 不管用什么方法融合,想要模型融合之后效果好,模型之间要有多样性。换句话说,模型之间越不相似,模型融合的效果越好。 1 V. y @) w1 n) p: v 对于Zillow这样给定特征,数据不是图像音频的比赛,主要选用树模型。这类Kaggle比赛,首选肯定是XGBoost和LightGBM。这两个模型都是由梯度提升树(GBDT)演化而来的。简而言之,就是通过梯度提升(Gradient Boost)算法训练许多决策树及其对应的权重,然后投票得到最终的结果。详细的数学证明可以看林轩田老师的台大机器学习技法课程- @8 E2 L1 w) y- V
xgboost模型在生成决策树时是level-wise的,即每一层上的所有节点都会一起分裂,通过max_depth来控制树的高度从而控制模型的拟合程度;lightgbm模型则是leaf-wise的,每一次分裂会从所有叶子节点中找增益最大的节点来分裂,所以主要通过num-leaves来控制模型的拟合程度。' N8 F T0 R* F# A* P* u
只用这两个模型显然不够,可以调整不同的参数来获得许多个侧重点不同的xgboost(lgb)模型:不同的深度(叶子数)、不同的损失函数等等。另外,在这个比赛里还用到了CatBoost、sklearn里的一些模型:随机森林、ExtraTree等。+ C- |) Q6 t; A6 ^
对于语音识别这类用深度学习的比赛而言,模型选择主要在于神经网络的结构和不同的输入。首先可以尝试不同种类的网络,比如CNN、LSTM。这里很难说有什么通用的技巧,在这个比赛中,CNN的效果较好,我用的所有6个模型都是以CNN为基础的。主要用到的结构是VGGNet和SE-ResNet。 : N# F( B$ f; K" N% F& D 对于VGGNet,实际上并没有完全按照论文上的模型,只是参考了思路,整个网络都使用了同样大小的卷积核尺寸(33)和最大池化尺寸(22)。SE(Sequeeze-and-Excitation)Block核心思想是学习特征权重,主要是通过global average pool以及全连接层来学习feature map的权重,然后作为scale乘到原始feature map上。然后将SE Block和ResNet结合。SE-ResNet在深度学习中,很多时候难以说清为什么这个网络结构效果好,只能根据结果来证明。这次的语音识别比赛中,一个比较有用的trick是:为了增加模型的多样性,在每个模型卷积操作完成后分别对feature map用全局最大池化和全局平均池化,相当于抓住了不同的特征,把一个模型变成了两个。另外,上文提到的三种特征:原始波形、log-mel频谱、mfcc特征分别作为输入,这样就形成了六个模型。+ j% l' p9 E. z/ N# x; W0 x
" t$ ^$ R* U$ N, N; U1 ^
3.调参 3 @ L9 \6 C% q& W6 Q( M8 v: H 3 w- m( F! D1 y" [( ~ 调参这事很复杂,有很多经验、方法,实际的比赛中往往还是需要一些玄学。调参最常用的方法就是GridSearch和RandomSearch。GridSearch是给定每个待调参数的几个选择,然后排列组合出所有可能性(就像网格一样),做Cross Validation,然后挑选出最好的那组参数组合。RandomSerach很类似,只是不直接给定参数的有限个取值可能,而是给出一个参数分布,从这个分布中随机采样一定个数的取值。 * v7 h* G# c# ?9 D- F( G - l/ o! d' R2 @# Z8 N7 D- u 调参的方法理解了,那具体调什么参数呢?Zillow Prize比赛里,主要用的模型是XGBoost和LightGBM。下面列出一些主要用到的参数,更多的还是直接看文档。 |0 l& p1 `* m$ }( K * M- _/ W5 \/ _0 @5 ^ IXGBoost:3 g7 m' Q$ ^1 o2 H, Y( N% e# P