在使用机器学习算法进行分类预测的过程中,往往最困难的部分在于如何提高模型预测的准确率。有时候当我们辛辛苦苦准备了数据集,进行了繁琐的数据预处理,编码,提交到集群完成了模型训练之后,忽然发现预测的准确率低到让人无语,笔者曾经遇到过进行0,1分类,结果训练出来的模型准确率是51.8%,这和人工随机分类几乎没有差别,非常令人沮丧。
往往在这个时候,才是数据分析真正开始的时候,数据工程师才会真正回来审视数据的意义,斟酌数据处理的过程,探究数据结果的评价。
数据工程师未必真的懂数据的意义。我们在进行一个运维数据分析的research项目,想通过结合产品outage的数据和产线系统数据,训练出一个模型,从而能够进行outage的分类和预测。项目之初,我们搞到了很多的产线数据,然后按照历史outage的出现时间和数据的特征,人工甄别制作了一个训练集,然后带入spark的朴素贝叶斯算法训练出模型,在用测试集进行分类测试的时候,结果绝大部分数据都分错了。首先,我们就怀疑问题出在了人工制作的训练数据集上,我们的人既不是专业的运维工程师也不是系统工程师,对outage数据和系统数据都是想当然的理解,然后按照我们的想法赋予每条数据相应的标签。显然,这个训练集的label并不靠谱,要想解决这个问题,最直接有效的办法是同时找来运维工程师,系统工程师和产品的研发工程师进行交流,向数据工程师解释数据的意义。不过,大部分项目在research阶段,并没有那么大的能量召集各种角色的核心人员来讲解数据。在这种情况下,数据工程师能做的是在分析的时候尽量剔除没弄明白的数据特征,这种策略是违背大数据思想的,但是,这有助于排除数据干扰,可以集中精力更有把握的进行后续的步骤,好在research阶段主要是为了证明方法能否行得通,而不是真正的解决问题。
数据预处理阶段对模型的训练起着相当重要的作用。原始数据经过高质量的处理后再输入训练算法,不仅能够提高模型的准确率,也有助于提高训练的效率。算法对数据是有要求的,比如进行分类模型的训练,有逻辑回归,朴素贝叶斯,决策树等多种算法,每种算法对输入数据的分布和规模有着一些固有的假设,其中最常见的假设形式是数据特征满足正态分布。为了使数据更符合模型的假设,可以对每个特征进行标准化,具体的做法是对每个特征值减去列的均值,然后除以列的标准差以进行放缩(ps:决策树和朴素贝叶斯不受特征标准化的影响)。除数值形式的特征外,对于类别特征的处理,常用的方法是对类别的每个值进行索引,然后在每条数据中都引入类别索引值,使得每条数据都包含了类别特征的信息,比如,weather类别有三个特征sunny,rain,snow,那么对于weather为sunny的类别就是(1,0,0),weather为rain的类别就是(0,1,0),weather为snow的类别就是(0,0,1)。
在模型训练的过程中,常需要根据测试结果进行参数调优并进行迭代训练。这里牵涉到了如何对模型的性能进行评估的问题。
常用准确率和召回率来评价结果的完整性。在二分类问题中,准确率定义为真阳性的数目除以真阳性和假阴性的总数,其中真阳性是指被正确预测的类别为1的样本,假阳性是错误预测为类别1的样本。如果每个被分类器预测为类别1的样本确实属于类别1,那么准确率达到100%。召回率定义为真阳性的数目除以真阳性和假阴性的和,其中假阴性是类别为1却被预测为0的样本。如果任何一个类型为1的样本没有被错误预测为类别0(即没有假阴性),那么召回率达到100%。
通常,准确率和召回率是负相关的,高准确率常常对应低召回率,反之亦然。比如模型的预测结果永远是1,则不会出现假阴性,也不会错过任何类别为1的样本,于是模型的召回率是1.0,另一方面,假阳性会非常的高,意味着准确率非常低。准确率和召回率在单独度量时用处不大,它们通常会被组合起来使用,即“准确率-召回率(PR)”曲线图。PR曲线下的面积为平均准确率,直觉上,PR曲线下的面积为1等价于一个完美模型。除了PR曲线,还常用ROC曲线进行评估,ROC用于表示分类器性能在不同决策阈值下真阳性率(TPR)对假阳性率(FPR)的折中,具体的原理和适用场景网上也有很多。