SKlearn二分类评价指标

SKlearn的Metrics模块下有有许多二分类算法的评价指标,这里我们主要讨论最常用的几种。


ML evaluation.png

1.准确度(Accuracy)

from sklearn.metrics import accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)

1.1参数说明
y_true:数据的真实label值
y_pred:数据的预测标签值
normalize:默认为True,返回正确预测的个数,若是为False,返回正确预测的比例
sample_weight:样本权重
返回结果:score为正确预测的个数或者比例,由normalize确定
1.2数学表达

Precision.png

1.3 案列演示

import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score

y_true = [1,1,0,1,0]
y_pred = [1,1,1,0,0]

score = accuracy_score(y_true,y_pred)
print(score)
0.6#正确预测的比例

score1 = accuracy_score(y_true,y_pred,normalize = True)
print(score1)
3#正确预测的个数

2.混淆矩阵(Confusion Matrix)

from sklearn.metrics import confusion_matrix(y_true,y_pred,labels=None,sample_weight = None)

2.1参数说明
y_true:真实的label,一维数组,列名
y_pred:预测值的label,一维数组,行名
labels:默认不指定,此时y_true,y_pred去并集,做升序,做label
sample_weight:样本权重
返回结果:返回混淆矩阵
2.2案例演示

import numpy as np
from sklearn.metrics import confusion_matrix

y_true = np.array([0,1,1,1,0,0,1,2,0,1])
y_pred = np.array([0,0,1,1,1,0,1,2,0,1])

confusion_matrix = confusion_matrix(y_true,y_pred)
confusion_matrix
array([[3, 1, 0],
       [1, 4, 0],
       [0, 0, 1]], dtype=int64)

confusion_matrix的官方文档给了我们一个可将混淆矩阵可视化的模板,我们可以将模板复制过来。文档连接:https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-glr-auto-examples-model-selection-plot-confusion-matrix-py

import itertools
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    """
    This function prints and plots the confusion matrix.
    Normalization can be applied by setting `normalize=True`.
    """
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')

    print(cm)

    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)

    fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

    plt.ylabel('True label')
    plt.xlabel('Predicted label')
    plt.tight_layout()

#可视化上述混淆矩阵
plot_confusion_matrix(confusion_matrix,classes = [0,1,2])

如图所示,这样看上去就很直观了,中间的格子4表示1预测为1的个数有4个。

confusion matrix.png

3.Precision&Recall
Precision:精确度。
Recall:召回率。
我们用一个例子来说明下Recall召回率的意思。
3.1班有100位同学,其中80位男生,20位是女生,现欲选出所有的女生,从100人中选了50人,其中20位是女生,30位是男生。
Recall中的四个指标:
TP(True positive):预测对了,预测结果为正例(把女生预测为女生),TP = 20。
FP(False positive):预测错了,预测结果为正例(把男生预测为女生),FP = 30。
TN(True negative):预测对了,预测结果为负例(把男生预测为男生),TN = 50。
FN(False negative):预测错了,预测结果为负例(把女生预测为男生),FN = 0。
Recall = TP/(TP + FN),Recall的意思是关注在正确的结果中,有多少个预测结果是正确的。上述例子的Recall值就是TP/(TP+FN) = 20/(20+0) = 100%。
为什么要引入Recall这个指标呢?
假设我们现在有100个患者样本,其中有5个患者患有癌症,我们用1表示,其余95名正常患者我们用0表示。假设我们现在用一种算法做预测,所有的结果都预测为0,95个肯定是预测对了,算法准确率为95%,看着挺高的。但是这个算法对于癌症患者的预测准确率是0,所以这个算法是没有任何意义的。这时候我们的recall值的价值就体现出来了,recall值是在5个癌症患者中找能预测出来的,如果预测3个对了,recall = 60%。

from sklearn.metrics import classification_report(y_true, y_pred, labels=None, 
target_names=None, sample_weight=None, digits=2, output_dict=False)

3.1参数说明
y_true:真实的label,一维数组,列名
y_pred:预测值的label,一维数组,行名
labels:默认不指定,此时y_true,y_pred去并集,做升序,做label
sample_weight:样本权重
target_names:行标签,顺序和label的要一致
digits,整型,小数的位数
out_dict:输出格式,默认False,如果为True,输出字典。
3.2样例演示

import numpy as np
from sklearn.metrics import classification_report

y_true = np.array([0,1,1,0,1,2,1])
y_pred = np.array([0,1,0,0,1,2,1])
target_names = ['class0','class1','class2']
print(classification_report(y_true,y_pred,target_names = target_names))
#结果如下
  precision    recall  f1-score   support

      class0       0.67      1.00      0.80         2
      class1       1.00      0.75      0.86         4
      class2       1.00      1.00      1.00         1

   micro avg       0.86      0.86      0.86         7
   macro avg       0.89      0.92      0.89         7
weighted avg       0.90      0.86      0.86         7

补充:f1-score是recall与precision的综合结果,其表达式为:f1-score = 2 * (precision * recall)/(precision + recall)
4.ROC_AUC

from sklearn.metrics import roc_auc_score(y_true, y_score, average=’macro’, 
sample_weight=None, max_fpr=None)

4.1参数说明
y_true:真实的label,一维数组
y_score:模型预测的正例的概率值
average:有多个参数可选,一般默认即可
sample_weight:样本权重
max_fpr 取值范围[0,1),如果不是None,则会标准化,使得最大值=max_fpr
4.2 Roc曲线说明
如下图所示,横轴表示false positive rate,纵轴表示true positive rate,我们希望false positive rate的值越小越好,true positive rate的值越大越好,希望曲线往左上角偏。那么如何衡量Roc曲线,我们用Roc的曲线面积来衡量即Auc(Area under curve)值,取值范围:[0,1]。

Roc curve.png

4.3样例演示

import numpy as np
from sklearn.metrics import roc_auc_score

y_true = np.array([0,1,1,0])
y_score = np.array([0.85,0.78,0.69,0.54])
print(roc_auc_score(y_true,y_score))
0.5

5.小结
评估机器学习算法是我们在解决实际问题中非常重要的一步,只有通过准确的评估,我们才能对算法进行后期的优化处理。这一节所说的Precision,Recall,Confusion_matrix,Roc_Auc是我们最常用的二分类算法的评估方法。以后在解决实际问题时,单一的评估指标往往不能反映出真正的算法效果,所以我们需综合多种评估指标来评价某一种算法。

你可能感兴趣的:(SKlearn二分类评价指标)