随机分类器,也就是对于一个分类问题,随机猜测答案。理论上,随机分类器的性能是所有分类器的下界。对随机分类器的理解,可以帮助更好的理解分类器的性能指标。随机分类器的性能也可以作为评价分类器的一个基础。所以简单写了几行代码来研究一下随机分类器的性能。用的是scikit-learn包。
这里产生了一个正负样本比例为7:3的样本。由于是随机猜测,所以feature数据就不需要了。随机分类器对每个样本,输出一个[0, 1)之间的数作为正样本的概率。分类以0.5为阈值,评价了几个主要的指标,并画出ROC和Precision-recall曲线。
import numpy as np import numpy.random as r import sklearn.metrics as m import pylab as pl def main(): size = 1000000 y_true = np.array([ 1 if i >= 0.3 else 0 for i in r.random(size) ], dtype=np.float32) y_pred = r.random(size) y_cls = np.array([ 1 if i >= 0.5 else 0 for i in y_pred ], dtype=np.float32)
print m.classification_report(y_true, y_cls) fpr, tpr, th = m.roc_curve(y_true, y_pred) ax = pl.subplot(2, 1, 1) ax.plot(fpr, tpr) ax.set_title('ROC curve') precision, recall, th = m.precision_recall_curve(y_true, y_pred) ax = pl.subplot(2, 1, 2) ax.plot(recall, precision) ax.set_ylim([0.0, 1.0]) ax.set_title('Precision recall curve') pl.show() if __name__ == '__main__': main()
几个主要指标如下 。
precision recall f1-score support 0.0 0.30 0.50 0.37 299977 1.0 0.70 0.50 0.58 700023 avg / total 0.58 0.50 0.52 1000000
ROC和Precision-recall曲线见下。
ROC曲线是一条y=x的直线,AUC=0.5。ROC曲线的横轴和纵轴分别是fpr和tpr,可以理解为将负例分为正例的概率,以及将正例分为正例的概率。注意,这里的分母都是实际的正例/负例数目。也就是说,ROC曲线反映了分类器对正例的覆盖能力和对负例的覆盖能力之间的权衡。
而Precision-recall曲线是一条y=0.7的直线,0.7为样本中正例的比例。横轴recall也就是tpr,反映了分类器对正例的覆盖能力。而总轴precision的分母是识别为正例的数目,而不是实际正例数目。precision反映了分类器预测正例的准确程度。那么,Precision-recall曲线反映了分类器对正例的识别准确程度和对正例的覆盖能力之间的权衡。对于随机分类器而言,其precision固定的等于样本中正例的比例,不随recall的变化而变化。