【分类】分类性能评价

评价指标

1、准确率、召回率、精确率、F-度量、ROC

​ 属于各类的样本的并不是均一分布,甚至其出现概率相差很多个数量级,这种分类问题称为不平衡类问题。在不平衡类问题中,准确率并没有多大意义,我们需要一些别的指标。

​ 通常在不平衡类问题中,我们使用F-度量来作为评价模型的指标。以二元不平衡分类问题为例,预测只可能出现4种状况:

​ a) 将正类样本预测为正类(True Positive, TP) b) 将负类样本预测为正类(False Positive, FP)

​ c) 将正类样本预测为负类(False Negative, FN) d) 将负类样本预测为负类(True Negative, TN)

  • 对于测试集中 N N N个样本,有 M M M个被正确分类,则准确率(正确率)为:

准确率 ( A c c u r a c y ) = M N 准确率(Accuracy) =\frac{M}{N} 准确率(Accuracy)=NM

  • 定义召回率(recall):不能接受漏报,预测到所有想被预测到的样本

召回率 ( r e c a l l ) = 被预测为正类的 原本的正类 = ∣ T P ∣ ∣ T P ∣ + ∣ F N ∣ 召回率(recall)=\frac{被预测为正类的}{原本的正类}=\frac{|TP|}{|TP|+|FN|} 召回率(recall)=原本的正类被预测为正类的=∣TP∣+∣FN∣∣TP∣

  • 定义精确率(precision):不能接受误检,预测结果尽可能不出错
    精确率 ( p r e c i s i o n ) = 被预测为正类的 预测的正类 = ∣ T P ∣ ∣ T P ∣ + ∣ F P ∣ 精确率(precision)=\frac{被预测为正类的}{预测的正类}=\frac{|TP|}{|TP|+|FP|} 精确率(precision)=预测的正类被预测为正类的=∣TP∣+∣FP∣∣TP∣

  • F F F-度量则是在召回率与精确率之间去调和平均数;
    F α = ( 1 + α 2 ) R P R + α P F 1 = 2 R P R + P F_{ \alpha}=\frac{(1+\alpha ^2)RP}{R+\alpha P}\\ F_{1}=\frac{2RP}{R+P} Fα=R+αP(1+α2)RPF1=R+P2RP

精确率 :分母是预测到的正类,精确率的提出是让模型的现有预测结果尽可能不出错(宁愿漏检,也不能让现有的预测有错)

以地震模型为例说就是宁愿地震了没报,也不能误报地震,比如说为了不错报,只预测了第50天可能发生地震,此时的

1.精确率:1/1=100%

2.召回率:1/2=50%

虽然有一次地震没预测到,但是我们做出的预测都是对的。

召回率 :分母是原本的正类,召回率的提出是让模型预测到所有想被预测到的样本(就算多预测一些错的,也能接受)

以地震模型为例说这100次地震,比如说为了不漏报,预测了第30天、50天、51天、70天、85天地震,此时的

1.精确率:2/5=40%

2.召回率:2/2=100%

虽然预测错了3次,但是我们把会造成灾难的2次地震全预测到了。

精确率和召回率有什么用?为什么需要它?通俗讲解(人话)

上面我们已经讲的很清楚了,这里以两种需求为例

  1. 预测地震 - 不能接受漏报
  2. 人脸识别支付(银行人脸支付) - 不能接受误检

人脸识别支付 :主要提升精确率,更倾向于不能出现错误的预测。

应用场景:你刷脸支付时就算几次没检测到你的脸,最多会让你愤怒,对银行损失不大,但是如果把你的脸检测成别人的脸,就会出现金融风险,让别人替你买单,对银行损失很大。所以宁愿让你付不了钱,也不会让别人帮你付钱。

预测地震 :主要提升召回率,更倾向于宁愿多预测一些错的也不能漏检。

应用场景:地震预测时宁愿多预测一些错的,也不想漏掉一次地震,预测错误最多会让大家多跑几趟,造成少量损失。只要预测对一次,就会挽回百亿级别的损失,之前所有的损失都值了。

ROC曲线 (Receiver Operating Characteristic,受试者操作特征)

通常情况下,我们希望ROC曲线越靠近左上角,这表示模型在各种阈值下都表现良好,同时具有高的真正率和低的假正率,而AUC值(曲线下面积)也可以用来衡量模型的整体性能,越接近1表示模型性能越好。

画ROC曲线步骤:

  • 根据分类模型得出每个样本属于正类的概率,根据概率将样本由高到低排列
  • 将样本为正类的概率由高到低,依次作为阈值 t t t,大于等于 t t t则为正类,小于t视为反类
  • 使用真正率 T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP作为竖轴,假正率 F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP作为横轴,对于每个选定的阈值均能产生一个对应的点。

例子:

样本编号 分类 预测为正类的概率 TPR FPR
1 正类 0.98 1 1 + 14 = 1 15 \frac{1}{1+14}=\frac{1}{15} 1+141=151 0 0 + 5 = 0 5 \frac{0}{0+5}=\frac{0}{5} 0+50=50
2 正类 0.96 2 2 + 13 = 2 15 \frac{2}{2+13}=\frac{2}{15} 2+132=152 0 0 + 5 = 0 5 \frac{0}{0+5}=\frac{0}{5} 0+50=50
3 正类 0.92 3 3 + 12 = 3 15 \frac{3}{3+12}=\frac{3}{15} 3+123=153 0 0 + 5 = 0 5 \frac{0}{0+5}=\frac{0}{5} 0+50=50
4 正类 0.88 4 4 + 11 = 4 15 \frac{4}{4+11}=\frac{4}{15} 4+114=154 0 0 + 5 = 0 5 \frac{0}{0+5}=\frac{0}{5} 0+50=50
5 正类 0.85 5 5 + 10 = 5 15 \frac{5}{5+10}=\frac{5}{15} 5+105=155 0 0 + 5 = 0 5 \frac{0}{0+5}=\frac{0}{5} 0+50=50
6 正类 0.83 6 6 + 9 = 6 15 \frac{6}{6+9}=\frac{6}{15} 6+96=156 0 0 + 5 = 0 5 \frac{0}{0+5}=\frac{0}{5} 0+50=50
7 反类 0.82 6 6 + 9 = 6 15 \frac{6}{6+9}=\frac{6}{15} 6+96=156 1 1 + 4 = 1 5 \frac{1}{1+4}=\frac{1}{5} 1+41=51
8 正类 0.8 7 7 + 8 = 7 15 \frac{7}{7+8}=\frac{7}{15} 7+87=157 1 1 + 4 = 1 5 \frac{1}{1+4}=\frac{1}{5} 1+41=51
9 正类 0.78 8 8 + 7 = 8 15 \frac{8}{8+7}=\frac{8}{15} 8+78=158 1 1 + 4 = 1 5 \frac{1}{1+4}=\frac{1}{5} 1+41=51
10 反类 0.71 8 8 + 7 = 8 15 \frac{8}{8+7}=\frac{8}{15} 8+78=158 2 2 + 3 = 2 5 \frac{2}{2+3}=\frac{2}{5} 2+32=52
11 正类 0.68 9 9 + 6 = 9 15 \frac{9}{9+6}=\frac{9}{15} 9+69=159 2 2 + 3 = 2 5 \frac{2}{2+3}=\frac{2}{5} 2+32=52
12 正类 0.64 10 10 + 5 = 10 15 \frac{10}{10+5}=\frac{10}{15} 10+510=1510 2 2 + 3 = 2 5 \frac{2}{2+3}=\frac{2}{5} 2+32=52
13 正类 0.59 11 11 + 4 = 11 15 \frac{11}{11+4}=\frac{11}{15} 11+411=1511 2 2 + 3 = 2 5 \frac{2}{2+3}=\frac{2}{5} 2+32=52
14 正类 0.55 12 12 + 3 = 12 15 \frac{12}{12+3}=\frac{12}{15} 12+312=1512 2 2 + 3 = 2 5 \frac{2}{2+3}=\frac{2}{5} 2+32=52
15 反类 0.52 12 12 + 3 = 12 15 \frac{12}{12+3}=\frac{12}{15} 12+312=1512 3 3 + 2 = 3 5 \frac{3}{3+2}=\frac{3}{5} 3+23=53
16 正类 0.51 13 13 + 2 = 13 15 \frac{13}{13+2}=\frac{13}{15} 13+213=1513 3 3 + 2 = 3 5 \frac{3}{3+2}=\frac{3}{5} 3+23=53
17 正类 0.5 14 14 + 1 = 14 15 \frac{14}{14+1}=\frac{14}{15} 14+114=1514 3 3 + 2 = 3 5 \frac{3}{3+2}=\frac{3}{5} 3+23=53
18 反类 0.48 14 14 + 1 = 14 15 \frac{14}{14+1}=\frac{14}{15} 14+114=1514 4 4 + 1 = 4 5 \frac{4}{4+1}=\frac{4}{5} 4+14=54
19 正类 0.42 15 15 + 0 = 15 15 \frac{15}{15+0}=\frac{15}{15} 15+015=1515 4 4 + 1 = 4 5 \frac{4}{4+1}=\frac{4}{5} 4+14=54
20 反类 0.2 15 15 + 0 = 15 15 \frac{15}{15+0}=\frac{15}{15} 15+015=1515 1


数字表示转折点对应样本编号

ROC曲线下方面积为 A U C AUC AUC, A U C AUC AUC值越大,表示分类模型的预测准确性越高, R O C ROC ROC曲线越光滑,++一般表示过拟合现象较轻++(为什么??


2.各项指标的python实现,以logistic回归为例

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
plt.rcParams['font.sans-serif']=['STKaiTi'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 创建一个示例分类数据集
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)

# 将数据集分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练一个分类模型,例如Logistic回归
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'准确率 (Accuracy): {accuracy:.2f}')

# 计算召回率
recall = recall_score(y_test, y_pred)
print(f'召回率 (Recall): {recall:.2f}')

# 计算精确率
precision = precision_score(y_test, y_pred)
print(f'精确率 (Precision): {precision:.2f}')

# 计算F1指标
F1 = 2*recall*precision/(recall+ precision)
print(f'F1={F1}')

#ROC曲线和AUC值
fpr, tpr, thresholds = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
roc_auc = auc(fpr, tpr)

# 可视化ROC曲线
plt.figure(figsize=(10, 6),dpi = 300)
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线 (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, 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('ROC曲线')
plt.legend(loc='lower right')
plt.show()

结果:

准确率 (Accuracy): 0.85

召回率 (Recall): 0.83

精确率 (Precision): 0.88

F1=0.8504983388704319

评价方法

  • 保留法:划分训练集于测试集,比例不清楚,没有k-折交叉验证好
  • k-折交叉验证:将样本随机划分为k个大小相等的子集,在每一轮交叉验证种,选择一个子集作为测试集,重复k轮,保证每个子集都作为测试集出现,对k轮检验结果取平均值作为评价表中
  • 蒙特卡洛交叉验证:多次保留法,某些样本可能只出现在测试集中
相关推荐
@小匠3 小时前
Read Frog:一款开源的 AI 驱动浏览器语言学习扩展
人工智能·学习
山间小僧4 小时前
「AI学习笔记」RNN
机器学习·aigc·ai编程
网教盟人才服务平台6 小时前
“方班预备班盾立方人才培养计划”正式启动!
大数据·人工智能
芯智工坊6 小时前
第15章 Mosquitto生产环境部署实践
人工智能·mqtt·开源
菜菜艾6 小时前
基于llama.cpp部署私有大模型
linux·运维·服务器·人工智能·ai·云计算·ai编程
TDengine (老段)6 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
小真zzz6 小时前
搜极星:第三方多平台中立GEO洞察专家全面解析
人工智能·搜索引擎·seo·geo·中立·第三方平台
GreenTea7 小时前
从 Claw-Code 看 AI 驱动的大型项目开发:2 人 + 10 个自治 Agent 如何产出 48K 行 Rust 代码
前端·人工智能·后端
火山引擎开发者社区7 小时前
秒级创建实例,火山引擎 Milvus Serverless 让 AI Agent 开发更快更省
人工智能