【新人赛】阿里云恶意程序检测 -- 实践记录11.10 - XGBoost学习 / 代码阅读、调参经验总结

时间:2021-09-29 14:40:54

XGBoost学习:

集成学习将多个弱学习器结合起来,优势互补,可以达到强学习器的效果。要想得到最好的集成效果,这些弱学习器应当“好而不同”。

【新人赛】阿里云恶意程序检测 -- 实践记录11.10 - XGBoost学习 / 代码阅读、调参经验总结

根据个体学习器的生成方法,集成学习方法可以分为两大类,序列化方法,并行化方法。序列化方法的代表就是Boosting方法,其中XGBoost和lightGBN都属于此类。

Boosting的方法是先从初始训练集训练出一个基学习器。然后再对训练样本的分布做一些调整,使得前一个学习器分类错误的样本得到更多的关注,再以此训练下一个基学习器。
依次类推,最后对多个基学习器做加权结合。

XGBoost 是 Extreme Gradient Boosting 的缩写,在此先介绍下Gradient Boosting。它的逻辑是:

先利用弱学习器训练 F(x) 。
再利用 F(x) 的残差作为目标,训练 h(x)。
利用 F(x)+h(x) 的残差作为目标,训练出 m(x),以此类推。
最后 F(x)+h(x)+m(x)+… 就是最终的强学习器模型。

比如算均方误差MSE, \(\mathrm{L(y, F(x))}=\frac{1}{n} \sum \left(y-F(x)\right)^{2}\),求导得:\(\frac{\partial L}{\partial F}=- \frac{2}{n} \sum (y-F)\),残差为\((y-F)\)

\(h(x) ≈ y−F(x) = - \frac{n}{2} \frac{\partial L}{\partial F} = - \lambda \frac{\partial L}{\partial F}\)

\(H(x) = F(x) - \lambda \frac{\partial L}{\partial F}\)

和梯度下降的公式是一样的。

对于分类/回归问题的一个简单实践案例(基于sklearn toy datasets)

之前几周的博客:

第一周:初次使用Google Colab,跑了下RManofCH分享的代码,看了下效果。

第二周:数据预处理,数据可视化(初步了解训练数据分布情况),tf-idf模型调参,ngram_range=(1,4)时效果不错。

第三周:tf-idf模型调参(min_df=1, max_df=1.0时效果最好,即取全集),数据可视化(计算了训练集与测试集的差异;得出单个api的类别及数量对文件类别影响不大的结论)

第四周:ngram模型调参(二、三元的拟合效果比较好,加上一、四、五、六元之后,效果都有提升;10折验证时效果最好)

代码阅读,调参经验总结:

阅读别人的代码,可以为自己提供一些其他思路,此外可以学习到一些实际编程的技能。
不过代码一般都是为解决具体问题编写的,自己用的时候还要根据环境,根据业务场景做一些适用性修改,而且参数要自己调一下。

调参的过程中,基本就是其他参数不变,专门调某一个参数,看看结果的变化趋势,是来回震荡还是有一个收敛点,找到一个比较好的局部最优的参数。

1 - 代码修改:

比如之前针对这个比赛做模型训练的时候,第一周跑了下的是先知论坛RMaoofCH的代码,但是遇到了一个Keras版本的问题'keras.backend' has no attribute 'tf' ,后来代码做了一些修改。

2 - 参数修改:

RMaoofCH的tf-idf模型的参数为ngram_range=(1, 5), min_df=3, max_df=0.9,做5折校验。

我调参的结果是,tf-idf模型ngram_range=(1, 4), min_df=1, max_df=1.0时效果最好。
此外比tf-idf更简单的ngram模型效果要优于tf-idf,Vectorizer由TfidfVectorizer改为了CountVectorizer。
而且,经过验证,10折校验比5折校验效果要好。

参数调过一轮之后,除了tf-idf模型的结果超过了RMaoofCH的tf-idf模型的结果,ngram单模型得到的结果甚至比RMaoofCH做的模型融合的结果还要好。