机器学习建模的一般性流程技术与技巧个人总结
对过往的算法项目的经验总结,不完善,后续补充。
1.业务逻辑抽象化
这一步骤需要想清楚、明确三个问题:
1)要针对什么群体;
2)解决什么问题;
3)哪些方面信息和这个问题是相关的;
做三件事:
1)明确模型目标,包括样本标签选取和设计、评估指标选取;
2)初步选定样本范围和特征范围,具体的样本和特征筛选可在下一步进行;
3)尽量获取问题对应的理论模型(物理模型或财务模型)
很多问题是存在相关领域的理论模型的,了解理论模型,首先可以帮助选取特征,其次可以先建立理论模型,再用机器学习算法对理论模型与实际数据的残差进行预测,效果会更好。
2.数据处理
数据处理并不是严格意义上的流程第二步,在后续模型优化过程中,随时可能需要根据模型的表现和存在的问题对数据做进一步的加工处理。
数据处理可以做的工作非常多,并且直接影响整个模型的最终的效果,这里不一一例举,只取几个我觉得比较有意思的点。
数据处理的工作大致可以分为两个方向,特征加工和样本加工;
特征加工:
1)数据平滑
数据平滑的方法非常多,总的来说是将某一个特征在样本上的分布变得更光滑、更连续,数据平滑的目的通常有两个,减少噪音或规避概率密度函数为0的问题。
对时间序列数据,如果噪声较多,可采用移动平均的方法进行平滑处理降噪;对波动范围较大且没有负值的特征,可以通过取对数的方式进行平滑,取对数还可以在一定程度上消除共线性、异方差的问题;
在数据质量有问题的情况下,也可以反向操作,将数据离散化,通过损失一部分信息为代价提升数据质量,如对用户申报收入的处理;
2)名义变量处理
特征处理:
ONE-HOT编码,不赘述;
多分类问题标签处理(深度学习模型直接用softmax损失函数完事):
1对1;1对多;多对多;
1对1:两两抽取类别样本,分别训练模型,最后各个分类器的预测结果进行投票,缺点:损失样本,N个类别需要训练N*(N-1)/2个分类器;
1对多:N个类别生成N-1个训练集建立N-1个分类器,每个训练集1类作为正例的时候其它类全部作为反例,缺点:类别数量多的时候存在类别不平衡问题;
多对多:ECOC编码,将N个类别做M次划分,每次把一部分类别作为正例,一部分类别作为反例,生成M个训练集训练M个分类器,预测时通过计算各分类器预测结果与各类编码距离,距离最小的类别作为最终分类结果,优点:可容错,样本比例均衡不损失信息,缺点:编码麻烦;
3)异常值与缺失值处理
对线性回归模型及其变体而言,这一步很有必要,但是对基于树的方法不是必须的,因为树的节点分叉是个离散的过程。不过时间充分或者要追求极限性能的话还是可以搞一搞,可以降低过拟合的风险;
4)特征筛选与衍生
现在很多做机器学习的都不太讲究这个了,直接把特征丢给模型让模型去筛选,但是我个人认为这一步还是有意义有价值的;特征筛选与衍生可以基于业务理解进行处理,不赘述,也可交给模型;这里记录两个小技巧:
特征筛选:先选用一个简单的模型,如线性回归模型或logitic模型,基于AIC或BIC,采用前向/后向/逐步的方法选取变量
特征衍生:考虑变量间可能存在相互作用的关系,可从已有特征中随机抽取两个变量,取其乘积作为新的特征,再采用上述特征筛选的方法快速筛选。
5)样本稀疏与多重共线性
做映射
样本处理:
1)数据增强
图像领域的图像翻转、旋转、位移等;半监督学习(容易有过拟合问题)
2)类别不平衡问题处理
欠采样:欠采样会导致信息损失,可采用stacking算法弥补;或直接bagging投票;
过采样:容易导致过拟合,可以通过增加扰动缓解
3.模型选择
根据数据量大小、数据特征数量、任务类型选取合适的模型,简单的问题用简单的模型处理,复杂的问题用复杂的模型处理,不懂的问题去谷歌目前相关领域效果最好的模型
4.模型训练与调参
个人认为,大部分机器学习算法调参,都是为了解决两个问题,1.过拟合;2.规避局部最优;
过拟合问题最常见,通用解决方法:加罚,调整L1罚或L2罚系数;
如何判断模型存在过拟合:模型效果在训练集和测试集上存在明显差异;
规避局部最优是因为机器学习优化算法基本上都是贪婪策略,容易陷入局部策略,因此在模型效果得不到提升的时候需要采用一些方法强迫模型跳出当前的最优解,最典型的例子就是xgboost里面的colsample_bytree, colsample_bylevel, colsample_bynode参数
此外,可通过grid search、random search、贝叶斯方法自动调参
5.模型集成
模型集成不是必须的,但是通常情况下都能略微提升模型的性能
方法:bagging、stacking
stacking通常要求初级学习器的尽可能的不同,否则无意义。可通过采用不同模型作为初级学习器,或采用不同训练样本,或对样本进行随机旋转实现这一点