模型评估:P-R曲线和ROC曲线

目录

一、模型评估标准

二、P-R曲线

查准率(Precision)、召回率(Recall)和F1分数

混淆矩阵

查准率(Precision)

查全率(Recall)

F1分数

三、ROC曲线

TPR和FPR

AUC

四、总结


一、模型评估标准

模型评估指标用于评估不同模型的优劣。

在分类任务中,最简单的评估指标是错误率与精度,错误率与精度是评价学习模型泛化能力的最常用的方法,错误率与精度不仅仅适用于二分任务也适用于多分类任务。

但是单单看错误率与精度并不能很好地对所有模型进行评估,因此我们引入了P-R曲线和ROC曲线来帮助模型评估。


二、P-R曲线

查准率(Precision)、召回率(Recall)和F1分数

混淆矩阵

混淆矩阵是计算查准率和查全率或其他模型性能评估方法的基础。


真实情况
预测结果
正例反例
正例TP(真正例)FN(假反例)
反例FP(假正例)TN(真反例)

TP:真正例(true positive),即真实结果和预测结果都是正例。
FP:假正例(false positive),即真实结果是反例,预测结果是正例。
TN:真反例(true negative),即真实结果和预测结果都是反例。
FN:假反例(false negative),即真实结果是正例,预测结果是反例。

查准率和查全率是极其矛盾的一对度量,我们可以用极端的方式去理解。若所有测试样本的分类结果都是正样本,那么模型的查全率为1,查准率就很低;若所有测试样本的分类结果都是负样本,那么模型的查准率就很高,查全率就很低。

查准率(Precision)

P=\frac{TP}{TP+FP}

查全率(Recall)

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

构造一个P-R图

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

# 生成样例数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 将数据划分为一半训练集和一半测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)

# 训练逻辑回归模型
clf = LogisticRegression(random_state=42, solver='lbfgs')
clf.fit(X_train, y_train)

# 预测新的样本
y_pred = clf.predict(X_test)

# 计算 P-R 曲线
precision, recall, _ = precision_recall_curve(y_test, clf.predict_proba(X_test)[:, 1])

# 绘制 P-R 曲线
plt.plot(recall, precision, color='blue', lw=2)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')

# 添加图例
plt.legend(['Logistic Regression'])

# 显示图形
plt.show()


P-R图效果如下

通过P-R图来判断模型优劣(逻辑回归和随机森林)例子如下

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import precision_recall_curve
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt

# 生成样例数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 将数据划分为一半训练集和一半测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)

# 训练逻辑回归模型
clf_lr = LogisticRegression(random_state=42, solver='lbfgs')
clf_lr.fit(X_train, y_train)

# 训练随机森林模型
clf_rf = RandomForestClassifier(random_state=42)
clf_rf.fit(X_train, y_train)

# 预测新的样本
y_pred_lr = clf_lr.predict(X_test)
y_pred_rf = clf_rf.predict(X_test)

# 计算逻辑回归模型的 P-R 曲线
precision_lr, recall_lr, _ = precision_recall_curve(y_test, clf_lr.predict_proba(X_test)[:, 1])

# 计算随机森林模型的 P-R 曲线
precision_rf, recall_rf, _ = precision_recall_curve(y_test, clf_rf.predict_proba(X_test)[:, 1])

# 绘制 P-R 曲线
plt.plot(recall_lr, precision_lr, color='blue', lw=2, label='Logistic Regression')
plt.plot(recall_rf, precision_rf, color='green', lw=2, label='Random Forest')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')

# 添加图例
plt.legend()

# 显示图形
plt.show()

(1) 若一个学习模型的P-R曲线完全包住了另一个学习模型的P-R曲线,则前者的性能优于后者。即召回率相同的情况下,查准率越高模型的泛化性能越好。简而言之,曲线越向右上模型越好
(2) 若两个学习模型的P-R曲线互相交叉,则可通过“平衡点”(Break-Event Point,简称BEP)来评价模型的优劣,BEP是“查准率=查全率"的数值。

F1分数

F1=\frac{2PR}{P+R}

F1分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的查准率和查全率。F1分数可以看作是模型精确率和召回率的一种调和平均,它的最大值是1,最小值是0。由于BEP过于简化,更常用的是F1度量,F1越大,性能越好。


三、ROC曲线

ROC(Receiver Operating Characteristic)曲线评价学习模型的泛化能力,并引用了度量参数AUC(Area Under Curve)。

TPR和FPR

与P-R曲线相对ROC曲线使用的横轴和纵轴分别是“假正例率(FPR)”和“真正例率(TPR)”。

其定义如下:

TPR=\frac{TP}{TP+FN}                   ​​​​​​​        ​​​​​​​        FPR=\frac{FP}{TN+FP}

分析逻辑回归模型的ROC曲线

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

# 生成样例数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 将数据划分为一半训练集和一半测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)

# 训练逻辑回归模型
clf = LogisticRegression(random_state=42, solver='lbfgs')
clf.fit(X_train, y_train)

# 计算预测概率
y_scores = clf.predict_proba(X_test)[:, 1]

# 计算假正率(FPR)、真正率(TPR)和阈值(thresholds)
fpr, tpr, thresholds = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)

# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, color='blue', lw=2, label='ROC curve (AUC = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='red', 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('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

与P-R曲线相对,ROC曲线越接近左上方模型越好

AUC

AUC(Area Under Curve)为ROC曲线的面积,面积可以通过梯形面积法求解。

AUC表示,随机抽取一个正样本和一个负样本,分类器正确给出正样本的score高于负样本的概率。


四、总结

        P-R曲线(Precision-Recall curve)和ROC曲线(Receiver Operating Characteristic curve)都是常用的二分类模型评估工具,用于衡量模型在不同阈值下的性能。

        P-R曲线展示了在不同阈值下的查准率(Precision)和召回率(Recall)之间的关系。查准率是指在所有预测为正例中实际为正例的比例,召回率是指在所有实际为正例中被正确预测为正例的比例。P-R曲线以召回率为横轴,查准率为纵轴。曲线上的每个点代表着在相应阈值下的查准率和召回率,而曲线本身则是通过连接这些点而得到的。P-R曲线的面积越大,表示模型的性能越好。

        ROC曲线则是以假正率(False Positive Rate,FPR)和真正率(True Positive Rate,TPR)为坐标轴。假正率是指在所有实际为负例中被错误预测为正例的比例,真正率是指在所有实际为正例中被正确预测为正例的比例。ROC曲线的横轴是FPR,纵轴是TPR。与P-R曲线类似,ROC曲线也是通过连接不同阈值下的FPR和TPR的点得到的。ROC曲线下面积(AUC)越大,表示模型的性能越好。

        总结起来,P-R曲线适用于数据不平衡的情况,对于正例的召回率更为关注,用于评估模型在高查准率和高召回率之间的平衡性。ROC曲线则适用于评估模型在不同阈值下的整体分类性能,对于分类阈值选择不敏感。两条曲线都可以帮助我们选择合适的分类阈值,以及比较不同模型之间的性能优劣。


以上,了解了P-R曲线和ROC曲线的原理以及实现代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值