机器学习:软件工程方法与实现
上QQ阅读APP看书,第一时间看更新

4.1.7 模型训练与调参

机器学习实践过程并非完美的瀑布式开发模式,各节点往往交叉折回。

模型训练中比较实战的做法是,快速开发一个基线版本的模型作为后续优化参考的基准。该基线版本采用原始特征,会尽可能少地进行特征处理。

模型训练过程中,调参是一项重要的活动。根据调参方向的不同,可分为:先训练复杂的模型并在后续逐渐简化,或由简至繁逐渐改善模型。一般建议使用前一种方式。调参细节请参考第12章。

模型训练过程中我们会重点关注调参这一步骤,但样本是否平衡往往容易被忽视。样本不平衡是一个非常棘手的问题:一是对于正负样本不平衡并没有一个权威的说法(是99∶1还是95∶5还是其他比例);二是常规的采样方法会导致样本分布变化。对于极度不平衡的样本,异常检测算法值得参考。下面列出了一些常用的处理不平衡样本的技术,实践中请多次试验:

·重新采样(请慎重考虑)。

·使用集成算法、Boosting算法。

·样本权重调整。例如sklearn中的class_weight。再例如,在具有时间属性的数据上,往往近期数据更具有代表性,建模时可结合样本分析的结论,使用权重技术对近期样本加权处理。

·替换或自定义评价指标或损失函数。

模型训练最终的问题即结果好坏,也就是模型欠拟合或过拟合。欠拟合和过拟合的相关概念将在5.2节进一步讲述。我们可以绘制训练误差和验证误差与算法参数逐渐增加复杂度时的曲线,以此来判断算法参数的方向是否正确,以及是否过拟合或欠拟合。当面临过拟合时,一般的处理技巧是降低模型复杂度或重新审视数据,此处我们重点讲述欠拟合时的应对策略。当我们面临欠拟合时,大的策略有如下3种,实践中请依据困难程度,优先选择容易实现的方案。

1)数据策略:是否需要重新评估问题定义和样本设计,请参考4.1.2节;是否可获得更多有价值的数据(先查看学习曲线,观察训练验证误差和样本量的关系。当验证误差随样本量增加而减少的趋势明显时,可考虑增加样本;当误差方差较大时也可考虑增加样本。否则,增加样本量额外付出的代价并不值得。sklearn[1]中提供了对应的接口learning_curve);是否选择更少的特征或加入更多的特征(包含特征工程)。

2)算法策略:是否尝试不同的参数搜索策略(随机或网格搜索等);算法参数是否已达上限,比如树模型中深度等参数已构造出了非常复杂的模型;评估指标是否是经过多次评估的无偏估计;尝试使用其他算法或使用更复杂的算法,例如由线性模型到非线性模型;是否有必要自定义评价指标或损失函数。

3)集成策略:使用模型集成方法,比如Stacking。

由于模型训练和调参过程是一个实验和反复的过程,良好的开发和调试习惯将极大影响该过程顺利与否。实践中,一般为每个流程节点建立一个开发文件;另外,规范的命名方式、内容的组织方式以及变量的命名方式等都建议形成一致的风格。书中推荐使用Jupyter Notebook作为模型开发的工具,它非常适合记录模型开发与训练的过程、思路和版本,也符合文学编程(Literate Programming)的开发思想。

最后,我们需要将模型保存起来。

[1] https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.learning_curve.html