目录
编辑
模型训练
逻辑回归
XGBoost
Wide&Deep
模型部署
模型训练
确定了最终的入模变量,终于进入模型训练的环节了,在这个环节我们需要选定模型结构,调节模型超参数,以及评估模型的效果。为了得到一个兼具区分度和稳定性的模型,我们需要将样本集分为三部分:训练集(training set)、验证集(validation set)和测试集(testing set)。其中,训练集是用来训练模型的参数;验证集是为了调节模型的超参数,进而得到一组超参数使模型在训练集和验证集上都有稳定的预测效果,不会过拟合或者欠拟合;而测试集通常会选取与训练集时间跨度较大的时间外(Out-Of-Time,O0T)样本集,目的是让测试模型效果不会受到时间因素的影响。通常为了充分验证模型的稳定性,会选取多个测试集来测试。划分完训练集、验证集和测试集,下面我们可以开始模型调参的工作,超参数调得好,般可以使模型在默认超参数的KS上再提升2到3个点。对于不同的模型结构,需要调节的超参数会有些差异,下面介绍最常用的结构以及对应的重要超参数。
逻辑回归
首先是逻辑回归模型,该模型中超参数并不多,需要调节的超参数就是正则化项(penalty)和正则化项系数的倒数(C)。其中,penalty可以选择LI和L2两种,两者都可以避免模型的过拟合,区别在于L1会使特征系数归零,而L2会保留所有的特征;C代表了正则化系数的倒数,C越小则正则化越强,模型也越稳定。对于这种超参数不多的情况,可以利用网格搜索(GridSearch)方法,遍历出不同超参数下验证集上的模型效果,选取验证集上效果最优的一组超参数训练模型,并在测试集上测试。
XGBoost
XGBoost是目前各家公司运用最多的一类模型结构,超参数相比逻辑回归多了一些,因此需要建模人员对各个超参数的含义和作用相对熟悉,这样才能更高效地进行调参工作。XGBoost模型中比较重要的超参数有:树的最大深度(max_depth)、叶子节点最小权重和(min_child weight)、节点最小分裂损失(gamma)、样本随机比例(subsample)、特征随机比例(colsample_bytree)、L1正则项权重(reg_alpha)、L2 正则项权重(reg_lambda)、学习速率(learning_rate)、树的棵数(n_estimators)。利用GridSearch方法调参通常会按照超参数对于模型的影响进行分步搜索:首先是max_dcpth和 min child weight,这两个直接决定了树的深度;其次是gamma,gamma 越大说明树的分裂越保守;然后是subsample和colsample_bytree,对于样本和特征的随机采样,可以保证树模型的泛化能力;再往后是两个正则化权重reg_alpha 和 reg.lambda,与逻辑回归中的超参数C类似,值越大则正则化强度越高;最后是learning rate和n estimators,这两个超参数直接决定了模型的学习速度和精度,因此放在最后来调节。除去这些树结构中本身的超参数之外,在XGBoost训练的时候还可以加人早停(early_stopping_rounds)的条件,如果验证集上的损失连续多轮没有下降,则模型训练过程被截断,输出最后一轮模型训练的结果。除去传统的GridSearch方法之外,还有一种贝叶斯优化(BayesianOptimization)方法,也可以用作模型调参。相比于GridSearch,贝叶斯优化在每次选取超参数的时候都会考虑上一次超参数的信息,这样能够大大减少模型迭代次数,提高调参效率,很适合XGBoost 这种超参数比较多的调参场景。
Wide&Deep
深度学习框架的调参一直是令建模人员头疼的问题,业内甚至戏称为“炼丹”。“炼丹之术”见仁见智,对于Wide&Deep这类深度学习模型,并没有一套最优的调参方式,不过以下这些超参数都是值得尝试的。首先,特征在进入网络前,有一个重要的步骤是标准化处理,原因有两个:一是因为深度学习模型是多个广义线性模型交织在一起,如果特征的量纲不统一,数值过大的特征会影响其他特征的贡献程度(WOE+LR模型中没有要求必须标准化处理,是因为WOE映射已经去量纲化);二是因为数值过大的特征还会影响损失函数的收敛速度,标准化处理后可以显著提升网络的计算效率。
深度学习模型中比较重要的超参数有学习速率(learning rate)、网络层数(layer)、节点个数(unit)、激活函数(activation)、批量训练样本个数(batch_size)、正则化项系数(regularizer)、优化器(optimizer)、训练次数(epoch)。其中比较难懂的是optimizer、batchsize和epoch,这里单独再介绍下。optimizer 是指神经网络模型中所运用的各类梯度下降的计算方式,常见的有SGD、RMSprop、Adam等,这些优化器都是在传统SGD的基础上,围绕动量(momentum)和学习率衰减因子(decay)展开,目的是平衡梯度下降的效率和精度,需要根据实际数据来选择和尝试不同的optimizer。batch_size和epoch可以看作一组参数,它们共同影响着网络权重的更新频率:固定epoch的情况下,batch_size 越大则跑完一次epoch的迭代次数越少,但是会导致网络权重更新缓慢;固定batch_size的情况下,epoch过多则会导致网络权重更新过于频繁,最终产生过拟合的问题。因此需要通过实验选取比较合适的batch_size和epoch组合。
除了调节超参数,深度学习模型中还有两种常见的避免过拟合的处理方式,分别是BatchNormalization 和Dropout。BatchNormalization是指在神经网络模型中,在上一个隐藏层的输出和下一个隐藏层的输入之间增加标准化处理,目的是提高网络结构的泛化能力,减少由于每个隐藏层输人的样本分布偏差而导致模型效果衰减的问题;Dropout则是在模型训练过程中,随机删除一些神经元,通过引人随机噪声的方式,提高网络结构的鲁棒性。对于比较复杂的深度学习模型,可以考虑加入这两层结构。
通常在一个建模项目中,建模人员都会尝试2、3种模型结构并调参,以简单模型为基线,再去评估复杂模型能够带来多少效果上的提升。风控模型的评估指标主要还是从准确性(AUC)、区分度(KS)和稳定性(PSI)三方面考虑,反欺诈楔型还会关注召回率(Recall)和精准率(Precision)。
模型部署
相比于传统评分卡,机器学习和深度学习模型的部署要复杂得多,需要专门的工程团队配合模型团队完成。在这个环节,建模人员通常需要提供两个文件,即特征工程脚本和训练好的模型。
特征工程脚本中包含数据清洗和特征加工的所有逻辑,目的是将数仓中的原始数据转化为最终入模的特征。对于模型文件,机器学习模型训练完可以保存为PMML文件,深度学习模型则通常保存为PB文件,这两种格式的优势是支持跨平台开发,方便工程团队的人员在Java环境中调用模型文件来实现计算的功能。
由于离线开发环境和线上生产环境的数据管道通常存在差异,模型部署过程中还有一个重要的工作就是数据验证,包括原始数据、模型特征和端到端的预测结果。对于公司内部的数据源,我们希望线上线下能够完全对齐;对于外部数据源和实时数据,我们允许一定范围内的误差。
print('要天天开心')