机器学习-分类评估方法-精确率-召回率-ROC曲线-AUC指标

一、分类评估的方法:

1、精确率
2、召回率

二、概念介绍:

1、混淆矩阵:
在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类):

混淆矩阵.png

注意:其中P代表正例,N代表反例。

2、准确率:(TP + TN) / (TP + FN + FP + TN)

3、精确率:预测结果为正例样本中真是为正例的比例。

  • 精确率公式:(TP) / (TP + FP)
精确率.png

4、召回率:真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)。

  • 召回率公式:(TP) / (TP + FN)
召回率.png

5、F1-score:反映模型的稳健性。

F1-score公式: F1 = 2TP / (2TP + FN + FP) = (2 * Precision * Recall) / (Precision + Recall)

三、分类评估报告api:

1、sklearn.metrics import classification_report(y_true, y_pred, labels=[], target_names=None)

  • y_true: 真实目标值
  • y_pred:评估器预测目标值
  • labels:指定类别对应的数字
  • target_names: 目标类别名称
  • return: 每个类别精确率与召回率

2、分类评估报告代码演示🌰:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, roc_auc_score

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

"""
肿瘤分类分析
"""

# 1、获取数据
names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
         'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
         'Normal Nucleoli', 'Mitoses', 'Class']
data = pd.read_csv(
    "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
    names=names)

print(data.head())

# 2、基本数据处理
# 2.1、缺失值处理
data = data.replace(to_replace="?", value=np.nan)
data = data.dropna()

# 2.2 确定特征值,目标值
x = data.iloc[:, 1:10]
print("x.head():", x.head())
y = data["Class"]
print("y.head():\n", y.head())

# 2.3 分割数据
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22, test_size=0.2)

# 3.特征工程(标准化)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4.机器学习 - 模型训练(逻辑回归)
estimator = LogisticRegression()
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 准确率
ret = estimator.score(x_test, y_test)
print("准确率为:\n", ret)

# 5.2 预测值
y_pre = estimator.predict(x_test)
print("模型预测值为:\n", y_pre)

# 5.3 精确率、召回率指标评价
ret = classification_report(y_test, y_pre, labels=(2, 4), target_names=("良性", "恶性"))
print("ret:\n", ret)

3、分类评估代码运行结果:

分类评估代码运行结果.png

4、从运行结果来看,recall召回率假如100个样本有99个样本分类正确,只有1个分类错误,但是假设这样一个情况:如果99个样本癌症,1个样本费癌症,不管怎样我全都预测正例(默认癌症为正例),准确率就为99%,但是这样效果并不好,因为这样的样本是不均衡的,那么如何衡量样本不均衡情况下的评估呢?这就需要参考ROC曲线AUC指标了。

四、ROC曲线与AUC指标:

1、TPR与FPR:

  • TPR = TP / (TP + FN) : 所有真实类别为1的样本中,预测类别为1的比例。
  • FPR = FP / (FP + TN) : 所有真实类别为0的样本中,预测类别为1的比例。

2、ROC曲线:

  • ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时ACU为0.5,参考图中红色虚线部分。
ROC曲线.png

3、AUC指标:

  • AUC的概率意义是随机取一对正负样本,正样本得分大于负样本得分的概率。
  • AUC的范围在[0, 1]之间,并且越接近1越好,越接近0.5属于乱猜。
  • ACU=1,完美分类器**,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5<AUC<1,优于随机猜测,这个分类器(模型)妥善设定阈值的话,能有预测价值。

4、AUC计算API:from sklearn.metrics import roc_auc_score

  • sklearn.metrics.roc_auc_score(y_true, y_score)
  • 计算ROC曲线面积,即AUC值
  • y_true : 每个样本的真实类别,必须为0(反例),1(正例)标记
  • y_score : 预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值。
  • AUC只能用来评价二分类
  • AUC非常适合评价样本不平衡中的分类器性能

5、roc-auc代码演示🌰:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, roc_auc_score

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

"""
肿瘤分类分析
"""

# 1、获取数据
names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
         'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
         'Normal Nucleoli', 'Mitoses', 'Class']
data = pd.read_csv(
    "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
    names=names)

print(data.head())

# 2、基本数据处理
# 2.1、缺失值处理
data = data.replace(to_replace="?", value=np.nan)
data = data.dropna()

# 2.2 确定特征值,目标值
x = data.iloc[:, 1:10]
print("x.head():", x.head())
y = data["Class"]
print("y.head():\n", y.head())

# 2.3 分割数据
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22, test_size=0.2)

# 3.特征工程(标准化)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4.机器学习 - 模型训练(逻辑回归)
estimator = LogisticRegression()
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 准确率
ret = estimator.score(x_test, y_test)
print("准确率为:\n", ret)

# 5.2 预测值
y_pre = estimator.predict(x_test)
print("模型预测值为:\n", y_pre)

# 5.3 精确率、召回率指标评价
ret = classification_report(y_test, y_pre, labels=(2, 4), target_names=("良性", "恶性"))
print("ret:\n", ret)

# # 5.4 auc指标计算
y_test = np.where(y_test > 3, 1, 0)

roc_auc_score = roc_auc_score(y_test, y_pre)
print("roc_auc_score:\n", roc_auc_score)

6、运行结果:

roc-auc-score.png

7、ROC曲线的绘制:

  • (1) 构建模型,把模型的概率值从大到小进行排序。
  • (2) 从概率最大的点开始取值,一直进行TPR和FPR的计算,然后构建整体模型,得到结果。
  • (3) 其实就是在求解积分(面积)
    绘制ROC曲线的意义就是不断的把可能分错的情况扣除掉,从概率最高往下取的点,每有一个是负样本,就会导致分错排在它下面的所有正样本,所以要把它下面的正样本数扣除掉(1-TPR,身下的正样本的比例)。ROC曲线绘制出来了,AUC就定了,分对的概率也就能求出来了。

五、总结:

1、 混淆矩阵:
  • 真正例(TP)
  • 伪反例(FN)
  • 伪正例(FP)
  • 真反例(TN)
2、精确率(Precision)与召回率(Recall):
  • 准确率(对不对) :(TP + TN) / (TP + TN + FN + FP)
  • 精确率(查的准不准) : (TP)/ (TP + FN)
  • 召回率(查的全不全) : (TP) / (TP + FN)
  • F1-score :反映模型的稳健性
3、roc曲线和auc指标:
  • roc曲线:通过TPR和FPR来进行图形绘制,绘制之后,形成一个指标auc
  • auc:
    (1)越接近1,效果越好
    (2)越接近0,效果越差
    (3)越接近0.5,效果就是胡说
    注意:这个指标主要用于评价不均衡的二分类问题。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容