在第四章曾使用logistic回归来预测患病的马是否能存活。现在将在这个数据集上使用adaboost分类器。
加载函数:
def loadDataSet(fileName): #general function to parse tab -delimited floats numFeat = len(open(fileName).readline().split('\t')) # 自动计算每个文件中的特征数目 dataMat = []; labelMat = [] fr = open(fileName) for line in fr.readlines(): lineArr =[] curLine = line.strip().split('\t') for i in range(numFeat-1): lineArr.append(float(curLine[i])) # 总计22列,最后一个为标签,特征便是从0-20一共21个 dataMat.append(lineArr) labelMat.append(float(curLine[-1])) return dataMat,labelMat
运行结果:
...
用错分样例除以总数即可得到错误率。
将弱分类器的数目设置为1-10000之间不同的数目,并运行上述过程,结果如下所示:
可以看到我们仅仅使用50个弱分类器就达到了较高的性能。而logistic回归的分类错误在35%左右。
仔细观察上表,在弱分类器的数目到达一定后错误率反而上升了,这就产生了过拟合现象。
下面我们不再讨论adaboost,而是转为关注所有分类器中的一个普遍问题
1.非均衡分类问题
在前六章的介绍中,我们都假设所有类别的分类代价是一样的。在第五章,我们预测了马的死亡,然后主人就会给马实行安乐死,而不是通过喂药来延缓其不可避免的死亡过程,但是我们预测的正确率只有0.8,如果我们预测错误就将会杀死一个昂贵的动物,更不要说主人对马的感情。
还有垃圾邮件,如果收件箱中会出现某些垃圾邮件,而合法邮件永远不会扔到垃圾邮箱里,人们是否会满意呢?癌症的检测,只要患病的人不会得不到治疗,那么再找一个医生看看会不会更好呢?(即使误判也不愿意漏判)
在大多数情况下,分类的代价是不一样的,在本节中我们将会学习一种新的分类器度量方法,并通过图像技术对上述的非均衡分类问题下不同分类器性能的可视化处理。然后我们考察这两种分类器的变换算法,他们能够将不同决策的代价考虑在内。
1.1 其他分类性能度量指标:正确率,召回率,ROC曲线
利用混淆矩阵就可以很好的理解分类中的错误了。如果矩阵中的非对角元素均为0,就会得到一个完美的分类器。
接下来,我们考虑另外一个混淆矩阵,这次的矩阵只针对一个简单的二分类问题。
在这个二分类问题中,如果将一个正例判为正例,那么就可以认为产生了一个真正例(TP),如果对一个反例正确的判为反例,就是一个真反例(TN),另外两种情况称为 伪反例(FN)和 伪正例(FP)。
在分类中,当某个类别的重要性高于其他类别时,我们就可以利用上述定义来定义出多个比错误率更好的新指标。第一个指标是 正确率,它等于TP/(TP+FP),给出的是预测为正例的样本中真正为正例的比例。第二个是召回率,它等于TP/(TP+FN),给出的是预测为正例的真实正例的比例。在召回率很大的分类器中,真正判错的正例的数目并不多。
我们可以很容易的构造高正确率或则高召回率的分类器,但是很难保证两者同时成立。
另一个用于度量分类中的非均衡分类问题的工具是ROC曲线。ROC代表接受者操作特征。
在图中给出了两条曲线。一条实线,一条曲线。图中的横轴是伪正例的比例,纵轴是真正例的比例。ROC曲线给出的是当前阈值变化时假阳率和真阳率的变化情况。左下角的点是将所有样本都判为反例的情况,而右上角的点对应的是将所有样例判为正例的情况。虚线是随机猜测结果的曲线。
ROC曲线,不但可以比较分类器,还可以基于成本效益分析来做决策。由于是在不同阈值下,不同的分类器的变现情况可能不同,因此某种方式将它们组合起来或许会更有意义。如果只是简单的观察分类的错误率,难以看到深入的效果。
理想状态下,最佳分类器应该位于左上角,这就意味着在假阳率很低的同时获得了很好的真阳率。例如在过滤垃圾邮件时,过滤了所有的垃圾邮件,但是没有将任何合法的邮件因分错放到垃圾邮箱中去。
对不同ROC曲线进行比较的一个指标是 曲线下面积(AUC)。AUC给出的是分类器的平均性能。当然他也不能代替整条曲线的观察。一个完美分类器的AUC为1.0,而随机猜测的AUC则为0.5。
为了画出ROC曲线,分类器必须提供每个样例被判为阳性或则阴性的可信程度。尽管大多数分类器都能做到这一点,但是通常情况下,这些只会在最后输出离散分类标签之前被清除。
1.2 基于代价函数的分类器决策控制
第一张表的计算公式为第二张表则是:
两种分类的代价是不一样的,在构件分类器时,知道了这些代价值,那么就可以选择最小代价的分类器。
在分类算法中,我们有很多的方法来引入代价信息。在adaboost中,可以基于代价函数来调整错误权重D。在朴素贝叶斯中,可以选择有最小代价期望而不是最大概率的类别作为最后的结果。在SVM中,可以在代价函数中对于不同的类别选择不同的参数C。上述做法就会给较小类更多的权重,即在训练时,小类只允许犯更小的错误。
1.3 处理非均衡问题的数据抽样方法
另一种针对非均衡问题调节分类器的方法,就是对分类器的训练数据进行改造。通过 欠抽样 或则 过抽样 来实现。过抽样以为着复制样例,而欠抽样意味着随机删除样例。不管哪种方式,数据都会从原始形式改造为新的形式。抽样过程可以通过随机或则某个预定方式来实现。