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是我们最常用的二分类算法的评估方法。以后在解决实际问题时,单一的评估指标往往不能反映出真正的算法效果,所以我们需综合多种评估指标来评价某一种算法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容