分类模型评估

目录

1 分类模型评估

1.1 准确率(Accuracy)

1.2 混淆矩阵(Confusion Matrix)

1.3 精确率(Precision)

1.4 召回率(Recall)

1.5 F1分数(F1 Score)

2 ROC曲线、PR曲线、AUC

2.1 ROC曲线

2.2 PR曲线(Precision-Recall Curve)

2.3 AUC(Area Under the ROC Curve)

3 ROC曲线与PR曲线的差异

4 模型评估与结果

5 总结


1.1 准确率(Accuracy)

描述:所有分类正确的样本数占总样本数的比例

公式:Accuracy=\frac{TP+TN}{TP+TN+FP+FN}

其中,TP表示真正例,TN表示真反例,FP表示假正例,FN表示假反例。

1.2 混淆矩阵(Confusion Matrix)

描述:一个表格,显示模型对每个类别的预测数量和实际数量。(真正例、真负例、假正例和假负例的数量)

下面是一个二分类问题混淆矩阵的表格:

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

真正例(True Positive, TP):模型预测为正,真实标签为正
假正例(False Positive, FP):模型预测为正,真实标签为负
假反例(False Negative, FN):模型预测为负,真实标签为正
真反例(True Negative, TN):模型预测为负,真实标签为负

通过上图我们不难得出以下几点结论:

1)竖着来看,真正例(TP)+假正例(FP)= 预测为正样本的数量,假反例(FN)+ 真反例(TN)= 预测为负样本的数量;

2)横着来看,真正例(TP)+ 假反例(FN)= 正样本的数量。假正例(FP)+ 真反例(TN)= 负样本的数量。

3)整体来看,真正例(TP)+ 假正例(FP)+ 假反例(FN)+ 真反例(TN) = 所有样本数量

这些值可以用于计算准确度精确率召回率和其他分类模型评估指标

1.3 精确率(Precision)

描述:正确预测为正的样本数与所有预测为正的样本数之比。

公式:Precision=\frac{TP}{TP+FP}

1.4 召回率(Recall)

描述:正确预测为正的样本数与所有实际为正的样本数之比。

公式:Recall=\frac{TP}{TP+FN}

精确度和召回率是与准确率一起使用的指标,尤其适用于不平衡类别的情况。

1.5 F1分数(F1 Score)

描述:精确率和召回率的调和平均值,F1的大小反映了模型的稳定性,数值越大说明越稳定。

公式:F1=2*\frac{Precision*Recall}{Precison+Recall}

2 ROC曲线、PR曲线、AUC

2.1 ROC曲线

描述:在各种阈值设置下,真正例率(TPR)和假正例率(FPR)的曲线,通过描绘两个指标之间的关系来展示分类器性能。其中以假正例率(FPR--False Positive Rate)为图形的横轴,以真正例率(TPR--True Positive Rate)为纵轴。

FPR=\frac{FP}{FP+TN}

TPR=\frac{TP}{TP+FN}

2.2 PR曲线(Precision-Recall Curve)

描述:在各种阈值设置下,精确率(Precision)和召回率(Recall)的曲线。也是通过描绘两个指标之间的关系来展示分类器性能。其中以召回率为图形的横轴精确率为图形的纵轴

2.3 AUC(Area Under the ROC Curve)

描述:ROC曲线下的面积,是用于评估分类器在不考虑决策边界的情况下的整体性能的指标。

优点:AUC的值介于0和1之间。一个完美的分类器的AUC值为1,而一个随机猜测的分类器的AUC值为0.5。

缺点::AGC考虑了所有可能的决策边界,因此它为比较不同模型的性能提供了一种不依赖于特定阈值的方法。

3 ROC曲线与PR曲线的差异

1.坐标轴

①ROC曲线的x轴是FPR,y轴是TPR

②PR曲线的x轴是Recall (或TPR),y轴是Precision


2.应用场景

①在正负样本均衡的情况下,ROC曲线是一个很好的性能度量

②在正负样本不均衡的情况下,PR曲线往往更有信息量。


3.整体性能指标

①ROC曲线使用AUC(曲线下的面积)

②PR曲线使用AP(Average Precision,曲线下的面积)。

4 模型评估与结果

代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc, precision_recall_curve

# 生成合成样本数据
X, y = make_classification(n_samples=2000, n_features=20, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练分类模型(这里使用逻辑回归作为示例模型)
model = LogisticRegression()
model.fit(X_train, y_train)

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

# 计算混淆矩阵
TP = np.sum((y_test == 1) & (y_pred == 1))
TN = np.sum((y_test == 0) & (y_pred == 0))
FP = np.sum((y_test == 0) & (y_pred == 1))
FN = np.sum((y_test == 1) & (y_pred == 0))

# 计算准确度
accuracy = (TP + TN) / (TP + TN + FP + FN)

# 计算精确度
precision = TP / (TP + FP)

# 计算召回率
recall = TP / (TP + FN)

# 计算F1分数
f1 = (2 * precision * recall) / (precision + recall)

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

# 计算PR曲线
precision, recall, _ = precision_recall_curve(y_test, model.predict_proba(X_test)[:, 1])

# 输出结果
print("混淆矩阵:")
print("TP:", TP)
print("TN:", TN)
print("FP:", FP)
print("FN:", FN)
print("准确度:", accuracy)
print("精确度:", precision)
print("召回率:", recall)
print("F1分数:", f1)

# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
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 Curve')
plt.legend(loc="lower right")
plt.show()

# 绘制PR曲线
plt.figure(figsize=(8, 6))
plt.plot(recall, precision, color='blue', lw=2, label='Precision-Recall curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc="lower left")
plt.show()

输出:

混淆矩阵:
TP: 181
TN: 180
FP: 24
FN: 15
准确度: 0.9025
精确度: [0.49       0.49122807 0.49246231 0.49370277 0.49494949 0.49620253
 0.49746193 0.49872774 0.5        0.50127877 0.5025641  0.50385604
 0.50515464 0.50645995 0.50777202 0.50909091 0.51041667 0.51174935
 0.51308901 0.5144357  0.51578947 0.5171504  0.51851852 0.5198939
 0.5212766  0.52266667 0.52406417 0.52546917 0.52688172 0.52830189
 0.52972973 0.53116531 0.5326087  0.53405995 0.53551913 0.5369863
 0.53846154 0.5399449  0.54143646 0.54293629 0.54444444 0.545961
 0.54748603 0.54901961 0.5505618  0.55211268 0.55367232 0.55524079
 0.55681818 0.55840456 0.56       0.56160458 0.56321839 0.5648415
 0.56647399 0.56811594 0.56976744 0.57142857 0.57309942 0.57478006
 0.57647059 0.57817109 0.57988166 0.58160237 0.58333333 0.58507463
 0.58682635 0.58858859 0.59036145 0.59214502 0.59393939 0.59574468
 0.59756098 0.59938838 0.60122699 0.60307692 0.60493827 0.60681115
 0.60869565 0.6105919  0.6125     0.61442006 0.6163522  0.61829653
 0.62025316 0.62222222 0.62420382 0.62619808 0.625      0.62700965
 0.62903226 0.63106796 0.63311688 0.63517915 0.6372549  0.63934426
 0.64144737 0.64356436 0.64569536 0.64784053 0.65       0.65217391
 0.65436242 0.65656566 0.65878378 0.66101695 0.66326531 0.66552901
 0.66780822 0.66666667 0.66896552 0.67128028 0.67361111 0.67595819
...
 0.08163265 0.07653061 0.07142857 0.06632653 0.06122449 0.05612245
 0.05102041 0.04591837 0.04081633 0.03571429 0.03061224 0.0255102
 0.02040816 0.01530612 0.01020408 0.00510204 0.        ]
F1分数: 0.9027431421446385

ROC曲线:

PR曲线

5 总结

针对类别不平衡的问题,可以采用一些方法来改善模型性能,例如使用重采样技术、调整分类阈值等。对于分类模型的评估,我们需要综合考虑多个指标,并根据具体业务需求选择合适的评估方法和调整策略。这样才能更准确地评估模型的性能和进行模型的优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值