概述
近日学习分类算法时,例如,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