深度学习推荐系统实战_34_特别加餐TensorFlow的模型离线评估实践怎么做
你好,我是王哲。
今天咱们来聊一聊TERFLLW的模离线评估实践。
那上两节课,我们学习了离线评估的主要方法和离线评估估的主要效果。
那这些方法和指标具体怎怎使用的,会遇到哪些问题呢?我们之前实现的深度推进模型,它们们的效果到底怎么样呢?这节课我们就直接进入实战,在NNL flow环境下评估一下。
我们之前实现过的深度学习模型,一方面这能帮助我们进一步加深对离线评估方法和指标的效解。
那另一方面也能检验一下我们自己模型的效果。
那离线评估的第一步就是要生成训练集和测试集。
那在这次评估实战中,我会选择最常用的后套检验来划分训练集和测试集。
那划分的方法我们已经在第二十三讲里用spark实现过了,那就是调用spark中的random split函数进行划分啊,具体的代码你可以参考feature engine for reack model对象中的split and safe training test samples函数。
那这里我们按照八比二的比例,把全量的样本集划分为训练集和测试集,再把它们分别存储在training samples点CSV和test samples点CSV路径中。
那在TNRF low内部,我们跟之前载入数据集的方式一样。
那调用get data方法分别载入训练集和测试集就可以了。
它在载入了训练集和测试集后,我们需要搞清楚怎么在tenn l flolow中设置评估指标,再通过这些评估指标观察模型在每一轮训练上的效果变化,以及最终在测试集上的表现。
那这个过程听起来还挺复杂,好在tennl flow已经为我们提供了非常丰富的评估指标可以选择。
那这样我们可以在模型的编译阶段来设置mattrics来指定想要使标的评估指标,那具体怎么做呢?接下来我们一起来看一看文稿中的代码。
那首先一个设置评估指标的典型过程。
那首先我们在model compile阶段设置了准确度ROC曲线的AUCP二曲线的AUC这三个指标。
那这三个指标是我们在评估推荐模型时最常用的三个指标。
那同时呢在训练和评估的过程中,模型还会默认产生损失函数loss这一指标。
那在模型编译的时候,我们采用的bendary cross entropy作为损失函数。
所以这里的loss指标就是我们在上一节课讲过的二分类问题的模型,loss啊log loss.那在设置好了评估指标后,模型在每轮i pok结束之后,都会输出这些评估指标的当前值。
在最后的测试集评估阶段,我们可以调用model UI六的函数来生成测试集上的评估指标。
那具体的实现代码,你可以参考spp RXX项目中深度推荐模型相关的代码。
那在执行这段代码的时候,它会输出每一轮训练的loss accuracy, ROCUC和PRUC这四个指标的变化。
那以及最终在测试集上的四个指标的结果,你可以仔细对比一下这个结果,找找规律。
那总的来说,随着训练的进行,模型的loss在降低,而accuracy啊两个UC这几个指标都在升高,那这证明模型的效果。
随着训练轮数的增加是在逐渐的变好,最终我们就得到了测试集上的评估指标。
你会发现,测试集上的评估结果相比训练集有所下降,比如accuracy从零点七五下降到了零点七四,ROCUC从零点八六下降到了零零点八一四,那这非常正常的现象,因为模型在训练集上都会存在着轻微过拟合的情况。
那但如果说测试集的评估结果相比于训练集出现了大幅的下降,比如说下降的幅度超过了百分之五,就说明模型产生了非常严重的过拟合的现象。
我们就要反思一下是不是在模型设计过程中出现了一些问题。
比如说模型的结构,对于这个问题来说,过于复杂,模型的层数或者每层的神经元数量过多,或者我们要看一看是不是需要加入dropout,整则画像,来减轻过拟合的风险。
那除了观察模型自己的效果,在模型评估阶段,我们更应该重视不同模型之间的对比,这样才能够确定我们最终上线哪一个模型。
那下面我们就做一个模型效果的横向对比。
那在推荐模型篇,我们已经实现了embedding MLP neuroc FY ite n deep以及DPM这四个深度学习模型。
那后面还有同学添加了DIN的实现。
那接下来我们就利用这节课的模型评估方法来尝试对比一下这几个模型方效果。
首首先我直接把这些模型在测试集上的评估结果记录到了文稿的表格里。
啊,当然我刚建议你运行一下sppars项目中的代码,多实践。
我们刚才说的模型评估方法,那结合合表格我们可以看出那embedding MLP和y den deep模型在我们的movie ens,这个小规模的数据集上的效果是最好的。
他们两个指标也非常的接近,那只不过在不同指标上有细微的差异。
那比如在模型loss指标上,y单d模型好一点,而在accuracy AUC指标上,零emadm LP会好一点。
遇到这种情况,我们该怎么挑选出更好的那个模型呢?一般我们会在两个方向上做尝试,一是做进一步的模型的调参。
特别是对于复杂一点的y单d模型,我们可以尝试通过参数的fine tuning,让模型达到更好的效果。
二是如果经过多次尝试,两个模型的效果还是比较接近,我们就通过线上评测来选出最后的胜出者。
那说完了效果好的指标,不知道你们有没有注意到一个很反常的现象,那就是模型DFM的评估结果非常的奇怪。
那怎么个奇怪法呢?那理论上来说,DFM的表达能力其实是最强的,可它现在展示出来的评估结果却是最差的那这种情况极有可能是因为模型遇到了过拟合的状态。
为了验证这个想法,我们再来看一下DFM在训练集上的表现。
那我把它的训练集和测试集上的评估结果放在了文稿的表格里。
我们很惊讶的发现,DFM在测试集上的表现比训练集差了非常多。
那毫无疑问这个模型过拟合了。
那当然这里面也有我们数据的因素。
那因为我们采用了一个规模很小的采样过的moviolence数据集。
那它训练复杂模型的时候,小数据集往往更难让模型收敛。
并且由于训练不充分的原因,那模型中有很多参数其实没有达到稳定的状态,因此在测试机上的表现往往会呈现较大的随机性。
那通过DPFM效果对比的例子,也再一次印证了我们在最优的模型结构该怎么找那节课里面的结论。
那推荐模型是没有银弹的,每一个业务每一类数据都有最合适的模型结构,并不是说最复杂的最新的模型就是最好的模型结构。
我们需要因地制宜的调整模型和参数,这才是算法公式最大的价值所在。
好了,今天的实践就到这里,我们一起来做个总结。
那这节实践课我们基于teninl flow进行了深度推荐模型的评估。
那整个实践过程可以分成三步,第一步是导入spark分割好的训练集和测试集。
第二步是在TNRF flow中设置评估指标,再在测试集上调model l evalue的函数来计算这些评估指标。
那在实践过程中,我们要清楚有哪些teninf follow指标可以直接调用。
那在这节课里,我们用到的最常用的loss accuracy ROCUC和PRAUC四个指标。
第三步是根据四个深度推荐模型的评估结果,进行模型效果的对比。
通过对比的结果,我们发现ebei DMRP和y零d模型的效果是最好的。
同时我们也发现本该表现很好的d排盘模型,它的评估结果却非常差,原因是模型产生了非常严重的过拟合问题。
因此,在实际的工作中,我们需要通过不断的调整模型、结构、调试模型参数,来找到最合适当前业务和数据集的模型。
那最后我们再来看两个思考题。
那第一个问题是除了这节课用到的loss accuracy、 LCUCPRUC这四个指标,那你自己在特斯福勒的实践中还会经常用到哪些评估指标呢?你能把这些常用的评估指标以及他们的特点分享出来吗?那第二个问题是你认为DPFM模型评估结果这么差的原因,除了过拟合,还有什么更深层次的原因呢?可以尝试从模型结构的原理上给出一些解释吗?那期待在留言区看见你对DPFI模型的思考和使用评估指标的经验。
我们下节课见。