机器学习中的混淆矩阵,准确率,精确率,召回率,F1分数,roc曲线以及发生比

目录

一、混淆矩阵(Confusion Matrix)

1.1 简介

1.2 结构

1.3 作用(计算准确率、精确率、召回率、F1分数)

精确率与召回率的区别

1.4 代码

二、roc曲线(Receiver Operating Characteristic Curve)

2.1 简介

2.2 构成

2.3 作用

2.4 代码

三、发生比(Odds Ratio)

3.1 简介

3.2 意义

3.3 应用

3.4 代码


一、混淆矩阵(Confusion Matrix)

1.1 简介

混淆矩阵(Confusion Matrix)是评估分类模型性能的工具,主要用于展示预测结果与实际标签的对比情况。它特别适用于二分类和多分类问题。

1.2 结构

混淆矩阵是一个N×N的矩阵(N为类别数),矩阵的行代表实际类别,列代表预测类别。

以二分类为例:

预测为正类预测为负类
实际为正类TP(真正例)FN(假反例)
实际为负类FP(假正例)TN(真反例)

其中

  • TP(True Positive):实际为正类,预测也为正类。

  • FN(False Negative):实际为正类,但预测为负类。

  • FP(False Positive):实际为负类,但预测为正类。

  • TN(True Negative):实际为负类,预测也为负类。

再具体点,比如我们有一个疾病检测模型,用于判断一个人是否患有某种疾病。我们有一个包含 100 人的测试集,其中:

  • 实际患病(正类):20 人

  • 实际健康(负类):80 人

模型对这些人进行预测后,结果如下:

预测为患病预测为健康
实际患病155
实际健康1070

根据表格,我们可以直接得到以下值:

  • TP(真正例):实际患病且预测为患病的人数 = 15

  • FN(假反例):实际患病但预测为健康的人数 = 5

  • FP(假正例):实际健康但预测为患病的人数 = 10

  • TN(真反例):实际健康且预测为健康的人数 = 70

1.3 作用(计算准确率、精确率、召回率、F1分数

混淆矩阵用于计算以下指标:

  1. 准确率(Accuracy):正确预测的比例,公式为 (TP+TN)/(TP+TN+FP+FN)

  2. 精确率(Precision):预测为正类的样本中实际为正类的比例,公式为 TP/(TP+FP)

  3. 召回率(Recall):实际为正类的样本中被正确预测的比例,公式为 TP/(TP+FN)

  4. F1分数(F1 Score):精确率和召回率的调和平均数,公式为 2×(Precision×Recall)/(Precision+Recall)

根据疾病模型可以计算

精确率与召回率的区别

指标关注点公式适用场景
精确率预测为正类的样本中,有多少是真正的正类TP/(TP+FP)假正例(FP)代价高的场景(如垃圾邮件检测)
召回率实际为正类的样本中,有多少被正确预测为正类TP/(TP+FN)假反例(FN)代价高的场景(如疾病检测)

再形象一点,我们可以假设一个捕鱼的场景

假设你是一个渔夫,正在用渔网捕鱼。你的目标是尽可能多地捕到鱼(正类),但同时可能会捞到一些垃圾(负类)。

  • 渔网的大小:代表模型的分类阈值。网越大,捞到的东西越多(包括鱼和垃圾);网越小,捞到的东西越少(可能漏掉一些鱼,但垃圾也更少)。

  • :正类(你想要的)。

  • 垃圾:负类(你不想要的)。

那么,

召回率衡量的就是,你捞到了多少真正的鱼🐟,占所有鱼的比重。

Recall = 捞到的鱼 / 所有的鱼

它关注的是你是否漏掉了鱼,如果召回率高,说明你捞到了大部分鱼,即使捞到了一些垃圾也没关系。如果你不想漏掉任何鱼(比如捕鱼是为了生存),召回率更重要。

例子,有一片海域,里面有100条鱼,你用一张大网,捞到了90条鱼,但也捞到了10个垃圾,召回率 = 90 / 100 = 90%

精确率衡量的就是,你捞到的东西里,有多少是真正的鱼。

Precision = 捞到的鱼​ / (捞到的鱼 + 捞到的垃圾)

他关注的是你捞到的东西中有多少是你真正想要的,如果精确率高,说明你捞到的大部分是鱼,垃圾很少。如果你不想捞到垃圾(比如垃圾处理成本很高),精确率更重要。

例子,你用一张小网,捞到了50条鱼,但没有捞到任何垃圾,精确率 = 50 / (50 + 0) = 100%。

指标关注点捕鱼例子适合场景
召回率是否漏掉了鱼你捞到了多少鱼,占所有鱼的比重不想漏掉任何鱼(如疾病检测)
精确率捞到的东西中有多少是鱼你捞到的东西中,鱼的比例是多少不想捞到垃圾(如垃圾邮件检测)

矛盾

  • 大网:捞到更多的鱼(高召回率),但也会捞到更多垃圾(低精确率)。

  • 小网:捞到更少的垃圾(高精确率),但可能会漏掉一些鱼(低召回率)。

总结为一句话就是:召回率高体现的是宁可错杀,不能放过,精确率高则是宁可放过,不能错杀。

1.4 代码

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.font_manager as fm

# 指定字体路径
font_path = r"d:\Users\z3322\Desktop\simhei.ttf" # 替换为你的字体文件路径
font_prop = fm.FontProperties(fname=font_path)

# 设置全局字体
plt.rcParams['font.sans-serif'] = [font_prop.get_name()]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 实际标签和预测标签
y_true = [1] * 20 + [0] * 80  # 1表示患病,0表示健康
y_pred = [1] * 15 + [0] * 5 + [1] * 10 + [0] * 70  # 模型预测结果

# 计算混淆矩阵
cm = confusion_matrix(y_true, y_pred)

# 绘制混淆矩阵
plt.figure(figsize=(6, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False,
            xticklabels=['预测健康', '预测患病'],
            yticklabels=['实际健康', '实际患病'])
plt.xlabel('预测标签')
plt.ylabel('实际标签')
plt.title('混淆矩阵')
plt.tight_layout()  # 自动调整布局
plt.show()

运行结果如下

二、roc曲线(Receiver Operating Characteristic Curve)

2.1 简介

ROC曲线(Receiver Operating Characteristic Curve)是用于评估二分类模型性能的工具,特别适用于研究模型在不同阈值下的表现。它通过绘制真正例率(TPR)假正例率(FPR)的关系图,直观展示模型的分类能力

2.2 构成

  • 横轴(X轴):假正例率(False Positive Rate, FPR),公式为:

    FPR=FP/(FP+TN)

    表示实际为负类的样本中被错误预测为正类的比例。

  • 纵轴(Y轴):真正例率(True Positive Rate, TPR,也称为召回率),公式为:

    TPR=TP/(TP+FN)

    表示实际为正类的样本中被正确预测为正类的比例。

  • 曲线:通过调整分类阈值(从0到1),计算不同阈值下的TPR和FPR,连接这些点形成ROC曲线。

2.3 作用

  • 理想情况:曲线越靠近左上角,模型性能越好。理想情况下,TPR为1,FPR为0,表示模型完美分类。

  • 随机猜测:对角线(从左下到右上的直线)表示模型的性能等同于随机猜测。

  • 曲线下面积(AUC):ROC曲线下的面积(AUC, Area Under Curve)用于量化模型性能。AUC的取值范围是0到1:

    • AUC = 1:完美模型。

    • AUC = 0.5:随机猜测。

    • AUC > 0.5:模型优于随机猜测。

根据例子可以算出

  • TPR = 15 / (15 + 5) = 0.75,表明模型能够正确识别 75% 的实际患病者。

  • FPR = 10 / (10 + 70) = 0.125,表明模型将 12.5% 的实际健康者错误地预测为患病。

2.4 代码

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
import numpy as np

# 实际标签和预测概率
y_true = [1] * 20 + [0] * 80  # 1表示患病,0表示健康
y_scores = [0.9] * 15 + [0.4] * 5 + [0.6] * 10 + [0.1] * 70  # 模型的预测概率

# 计算 ROC 曲线的 FPR, TPR 和阈值
fpr, tpr, thresholds = roc_curve(y_true, y_scores)

# 计算 AUC 值
roc_auc = auc(fpr, tpr)

# 绘制 ROC 曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label='Random Guess')
plt.xlabel('False Positive Rate (FPR)')
plt.ylabel('True Positive Rate (TPR)')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.show()

运行结果如下

三、发生比(Odds Ratio)

发生比(Odds Ratio)是逻辑回归模型中用于解释特征对结果影响的重要指标。它表示某个特征增加一个单位时,结果发生的概率与不发生的概率之比。

3.1 简介

发生比是指某个事件发生的概率与不发生的概率之比。不同的模型使用不同的发生比计算公式,主要是因为它们的目标、假设和应用场景不同。理解这些差异有助于选择合适的模型进行数据分析和预测。

3.2 意义

  • 发生比大于 1:事件发生的概率大于不发生的概率。

  • 发生比等于 1:事件发生的概率等于不发生的概率。

  • 发生比小于 1:事件发生的概率小于不发生的概率。

3.3 应用

  • Logistic回归:用于二分类问题,目标是预测事件发生的概率。其发生比公式为:

    Odds=P/(1−P)

    其中 P 是事件发生的概率。

        应用场景:适用于预测二分类结果,如是否患病、是否购买等。

        例子:

  • 泊松回归:用于计数数据,目标是预测事件发生的次数。其发生比公式为:

    Odds=λ

    其中 λ 是事件发生的平均次数。

        应用场景:适用于预测计数数据,如某时间段内的事件发生次数。

        例子:

  • Cox比例风险模型:用于生存分析,目标是评估风险因素对生存时间的影响。其发生比公式为:

    Hazard Ratio=h1(t)/h0(t)

    其中 h1(t) 和 h0(t) 分别是暴露组和对照组的风险函数。

        应用场景:适用于生存分析,如评估某种治疗对患者生存时间的影响。

本文所举的例子就是:

3.4 代码

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 设置支持中文的字体
font_path = r"d:\Users\z3322\Desktop\simhei.ttf"  # 替换为你的字体文件路径
font_prop = fm.FontProperties(fname=font_path)
plt.rcParams['font.sans-serif'] = [font_prop.get_name()]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 混淆矩阵数据
TP = 15  # 真正例
FN = 5   # 假反例
FP = 10  # 假正例
TN = 70  # 真反例

# 计算发生比
odds_ratio = (TP / FN) / (FP / TN)

# 数据
labels = ['患病组 (TP/FN)', '健康组 (FP/TN)']
values = [TP / FN, FP / TN]

# 绘制条形图
plt.figure(figsize=(6, 4))
plt.bar(labels, values, color=['blue', 'orange'])
plt.ylabel('暴露比')
plt.title('发生比 (Odds Ratio) 可视化')
plt.text(0, TP / FN + 0.1, f'{TP/FN:.2f}', ha='center')
plt.text(1, FP / TN + 0.1, f'{FP/TN:.2f}', ha='center')
plt.show()

# 显示发生比
print(f"发生比 (Odds Ratio) = {odds_ratio:.2f}")

运行结果如下

发生比为 21,表示患病组的暴露比是健康组的 21 倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值