分类算法的评价指标

概述

近日学习分类算法时,例如,SVM、KNN和LR等时,一直苦于不知道如何很好的评价训练出来模型的好坏,在查看了大量的网上资料以及机器学习相关的书籍之后,基本明确了在分类算法中常用的评价指标以及相关指标的Python代码实现,闲话说到这,现在简单的对这些评价指标逐步说明一下。

概念

在机器学习分类算法中,用来对分类算法评价的指标有:准确率(accuracy)、召回率(recall)、精准率(precision)、F1-score、ROC以及AUC,相关概念如下:

准确率(accuracy):指对一个事物表达或描述的正确程度,用来反映对事物的正确性解答,直观的感受就是总样本中预测正确的概率;

召回率(recall):是检索出的相关文档数和文档库中所有的相关文档数的比率,也叫查全率,亦可以叫做真正率;

精准率(precision):描述的在预测结果为正类时,预测正确的比率;

F1-score精准率和召回率的调和函数

ROC:ROC全称是receiver operating characteristic curve,又称为感受性曲线(sensitivity curve)。得此名的原因在于曲线上各点反映着相同的感受性,它们都是对同一信号刺激的反应,只不过是在两种不同的判定标准下所得的结果而已

AUC:AUC全称是Area Under Curve,其实就是ROC曲线下的面积;

上面提到的部分概念在我的上一篇博客中也有所提及,这里权当复习一遍;当然,想了解的,可以查看这篇博客《关于混淆矩阵以及分类问题的概述》https://blog.csdn.net/u011587322/article/details/80660978

分类算法评价指标的Python代码实现

这里基于sklearn的datasets库中的make_classification来生成一个案例数据集,生成数据的代码如下:

from sklearn.datasets import make_classification
samples = make_classification(n_samples = 10000, n_features = 100, n_classes = 2, random_state = 1,weights = [0.15], flip_y = 0.1)
samples_train_x = samples[0][:-2000]
samples_train_y = samples[1][:-2000]
samples_test_x = samples[0][-2000:]

samples_test_y = samples[1][-2000:]

这里生成了10000个样本数据,每条样例数据100个特征,总共可分为两类数据,这其实就是一个经典的二分类问题。将生成的数据集分成两类,train数据8000条,test数据2000条;

数据集生成完成后,我们需要采用分类算法,根据训练集训练的模型,去预测测试集的结果,并使用评价指标去评价分类算模型的好坏。这里采用SVM进行实现。

首先我们需要训练出模型出来并进行预测,实现代码如下

clf = SVC(probability=True)#由于后面我们需要启用概率,对分类器的好坏进行预估,所以这里需要将probability设置为True
clf.fit(samples_train_x,samples_train_y)
pred = clf.predict(samples_test_x)

预测了结果之后,我们需要对预测的结果进行评价,这里先用最直观的准确率进行评价,准确率描述的是总样本中,预测正确的比率,在本次案例中,其实就是预测的结果pred中对比samples_test_y的正确率;准确率可调用sklearn.metrics.accuracy_score代码如下:

from sklearn.metrics import accuracy_score
# accuracy score
print("accuracy score is ",accuracy_score(samples_test_y,pred))

然后还可以查看一下召回率(recall)、精准率(precision)、F1-score,同样需要使用metrics包中的方法:

import sklearn.metrics as metrics
# recall score
print("recall score is ",metrics.recall_score(samples_test_y,pred))
# precision score
print("precision scoreis ",metrics.precision_score(samples_test_y,pred))
# F1 score
print("F1 score is ",metrics.f1_score(samples_test_y,pred))

这里重点说一下ROC和AUC,二分类模型在对每一个测试样本进行预测的时候,会返回一个概率,设定一个阈值,使得大于该阈值的样本判定为正类,反之则为负类,在正常的预测的情况下,阈值一般视实际情况而定,这样就可以将一个样本很好的分为正类和负类;但在ROC中,我们并不直接设定阈值,而是通过调整阈值,按照类似二分法的方式,得到多组不同的数据(混淆矩阵),从而可以得到多个(FPR,TPR)点,我们以FPR为横轴、TPR为纵轴,就可以绘制出ROC曲线,ROC曲线下的面积即为AUC。上面说了相关的概念,然后我们来看一下Python代码需要如何实现:

# get predict score
#由于是二分类问题,得到的预测得分其实是一个n行2列的数组,每一行的第0列代表为负的概率,第1列代表为正的概率,每一行的两项之和为1
y_score = clf.predict_proba(samples_test_x) 
#Compute Receiver operating characteristic
#根据metrics.roc_curve的API,roc_curve需要输入测试数据的实际目标值以及预测结果的目标得分,即目标概率,API中描述如下
#    y_true : array, shape = [n_samples]
#        True binary labels in range {0, 1} or {-1, 1}.  If labels are not
#        binary, pos_label should be explicitly given.
#
#    y_score : array, shape = [n_samples]
#        Target scores, can either be probability estimates of the positive
#        class, confidence values, or non-thresholded measure of decisions
#        (as returned by "decision_function" on some classifiers).
#这里需要获取为正的概率,即y_score[:,1]
fpr,tpr,threshold = metrics.roc_curve(samples_test_y,y_score[:,1])
# AUC
roc_auc = metrics.auc(fpr,tpr)
print("AUC is ",roc_auc)

获取到了fpr以及tpr,我们还可以绘制ROC曲线,代码如下:

import matplotlib.pyplot as plt
plt.plot(fpr, tpr, color = 'red', label = 'ROC curve (area = %0.2f)'%roc_auc)
plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

得到的整体结果如下:

accuracy score is  0.8845
recall score is  0.9706780696395846
precision scoreis  0.8967268623024831
F1 score is  0.9322381930184805
AUC is  0.8374924902941785

猜你喜欢

转载自blog.csdn.net/u011587322/article/details/80685201
今日推荐