模型评估与验证(一)

​ 最近在搞朴素贝叶斯算法的DGA检测的时候,将网上开源的代码down下来在机子上跑了一下,代码与原理也专研明白了一些。但是有个问题在我心里一直挥之不去,详情如下(若要了解更多可以到我主页看朴素贝叶斯之DGA检测系列博客)

《web安全深度学习实战》的朴素贝叶斯运行结果(为了方便描述以下成为A结果):

模型评估与验证(一)_第1张图片

《web安全机器学习入门》的朴素贝叶斯运行结果(为了方便描述以下成为B结果):
模型评估与验证(一)_第2张图片
​ 虽然没有报错,运行结果也出来了,但是为何同样的算法运行出来的结果是不同?难道说评估的指标不一样?那这两个结果存在着什么关联吗?

探索之路

​ (一)首先第一步想到的是探究这个运行结果的含义,结果A的参数意思为

参数 含义
precision 正确预测的个数(TP)/被预测正确的个数(TP+FP)
recall 正确预测的个数(TP)/预测个数(TP+FN)
f1-score 定义为准确率和召回率的调和平均数,用它来综合评估模型性能
support 某类别在测试数据中的样本个数
accuracy 准确率是指在分类中,使用测试集对模型进行分类,分类正确的记录个数占总记录个数的比例
macro avg 每个类别评估指标未加权的平均值,比如准确率的 macro avg,(0.50+0.00+1.00)/3=0.5
weighted avg 加权平均,比如第一个值的计算方法,(0.50*1 + 0.0*1 + 1.0*3)/5 = 0.70

​ 在下面的数字则是混淆矩阵:

正确的、相关的(wanted) 不正确的、不相关的
检测出来的 TP(True Positives) FP(False Positives)
未检测出来的 TN(True Negatives) FN(False Negatives)

​ 准确率,召回率都是根据这些参数得出

​ 而结果B则是一串小数,类似于命中率的东西,没什么新发现。

​ (二)结果没什么新发现,就去探索对应的函数,看他是干嘛的。

​ 结果A中,classification_report 用于输出正确率等评估参数,confusion_matrix 则用于输 出混淆矩阵。结果B中负责输出的函数是cross_val_score。

​ cross_val_score是验证函数,把初始训练样本分成k份,其中(k-1)份被用作训练集, 剩下一份被用作验证集,这样一共可以对分类器做k次训练,并且得到k-1个训练结果与1个验 证结果。

模型评估与验证(一)_第3张图片
​ 知道了各个函数的大概是干嘛的,但是心里面还是有很大疑惑,他们这些函数肯定是在 某个特定的场合上用的,他们究竟存在什么联系?都是模型使用的返回结果,我怎么知道什么 场合用哪个?

​ (三)从sklearn中文手册入手,他们都是出自于sklearn库。

模型评估与验证(一)_第4张图片

​ 官方的说法给了我一些头目,交叉验证用于评估器的表现,classification_report 等方法 是量化预测的质量中的一个方法,评估有很多指标因素参考。到这里,还是一头雾水,无法得 知他们的联系(现在回想起来,可能是他描述得太官方,很多术语不理解造成的)

​ (四)直到看到这两篇文章,我的认识才初有了轮廓

​ 评估机器学习

​ 机器学习模型评价(Evaluating Machine Learning Models)-主要概念与陷阱

​ 一般的,机器学习过程包括两个阶段,分别为:原型设计阶段(Prototyping)与应用阶 段(Deployed),与软件开发类似的Debug与Release阶段 . Prototyping阶段是使用历史数 据训练一个适合解决目标任务的一个或多个机器学习模型,并对模型进行验证(Validation) 与离线评估(Offline evalutation),然后通过评估指标选择一个较好的模型。如在分类任务 中,选择一个适合自己问题的最好的分类算法。Deployed阶段是当模型达到设定的指标值时 便将模型上线,投入生产,使用新生成的数据来对该模型进行在线评估,以及使用新数据更新 模型。在对模型进行离线评估或者在线评估时,它们所用的评价指标往往不同。如在离线评估 中,我们使用的有准确率(accuracy)、精确率-召回率,而在在线评估中,一般使用一些商 业评价指标,如用户生命周期值、广告点击率(click through rate)、用户流失率(customer churn rate)等,这些指标才是模型使用者最终关心的一些指标。甚至在对模型进行训练和验 证过程中使用的评价指标都不一样。

​ 在机器学习中,很多模型都是假设数据的分布是一定的,不变的,即历史数据与将来的 数据都服从相同的分布。但是,在现实生活中,这种假设往往是不成立的,即数据的分布会随 着时间的移动而改变,有时甚至变化得很急剧,这种现象称为分布漂移。例如,在文章推荐系 统中,文章的主题集数目和主题的发生频率可能是每天改变的,甚至每个小时都在改变,昨天 流行的主题在今天可能就不再流行了。如在新闻推荐中,新闻主题就变更得非常快。因此在进 行模型构建之时,我们需要去扑捉分布漂移信息并使自己的模型能够应对这种情况。一个常用 的方法便是使用一些验证指标对模型在不断新生的数据集上进行性能跟踪。如果指标值能够达 到模型构建时的指标值,那么表示模型能够继续对当前数据进行拟合。当性能开始下降时,说 明该模型已经无法拟合当前的数据了,因此需要对模型进行重新训练了。

​ 现在我知道了,结果A是模型离线评估(我们做研究一般很难有实施新的数据,一般是历 史数据)的一些重要指标,不同算法有不同的分类直标,例如有回归评价指标,分类评价指 标,排序评价指标等。结果B仅仅是用于模型验证

​ (五)最终框架浮现

​ 模型评估和验证【2】——交叉验证、网格搜索与模型评估

​ 看到这篇文章,我才是真正的恍然大悟。引用文章的图,描述了算法评估流程

模型评估与验证(一)_第5张图片

​ 我们拿到数据,会分成训练集和测试集合,测试集用classification_report 等这些方法返回 来的评估指标来评估该模型的好坏,而训练集是拿去训练算法的,但是在训练的过程中为了继 续调参,将各个参数调整到最优,通常需要把训练集又分为训练集和验证集,其中验证集就是 用到cross_val_score等交叉验证函数。最后整个思路框架已浮现。

你可能感兴趣的:(人工智能)