目录
一、为什么要进行模型评估?
模型评估是对训练好的模型性能进行评估, 模型评估是模型开发过程不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。
二、不同的分类模型评估指标
1. 混淆矩阵
混淆矩阵(Confusion Matrix)是机器学习中用于评估分类模型性能的一种工具,它将模型预测的结果与真实标签进行比较,从而生成一个矩阵来展示模型的预测性能。这个矩阵通常用于二分类问题,但也可以扩展到多分类问题。
在二分类问题中,混淆矩阵是一个2x2的矩阵,其中行表示真实结果的标签,列表示模型的预测结果标签,如下图所示:
预测结果 | |||
+1 | -1 | ||
真实结果 | +1 | 真正例(TP) | 伪反例(FN) |
-1 | 伪正例(FP) | 真反例(TN) |
矩阵的四个格子分别表示以下情况:
1. 真正例(True Positive, TP,也称真阳):模型正确预测为正例的样本数量。
2. 假正例(False Positive, FP,也称假阳):模型错误地将反例预测为正例的样本数量。
3. 真反例(True Negative, TN,也称真阴):模型正确预测为反例的样本数量。
4. 假反例(False Negative, FN,也称假阴):模型错误地将正例预测为负例的样本数量。
2. 准确率(Accuracy)
准确率(Accuracy)是最常见的分类模型的评估指标。
准确率是指:模型正确预测的样例(真正例 + 真反例)占样本总数的比例。对于二类问题,准确率的计算公式如下:
3. 精确率(Precision)
精确率(Precision,也称正确率)是指预测为正例的样本中的真正正例的比例。对于二类问题,精确率的计算公式如下:
4. 召回率(Recall)
召回率(Recall)是指预测为正例的真实正例占所有真实正例的比例。对于二类问题,召回率的计算公式如下:
5. F1分数(F1 Score)
F1分数(F1 Score)是一个评估分类模型性能的指标,它同时考虑了模型的精确率和召回率。F1分数的计算公式如下:
F1分数的值范围在0到1之间,1表示模型在这两个指标上都达到了完美水平。F1分数综合考虑了精确率和召回率,使得模型在两个指标上达到平衡。因此它可以作为很好的性能评估指标,尤其是在类别不平衡的数据集上。
6. ROC曲线
另一个用于度量分类中的非均衡型的工具是ROC曲线(Receiver Operating Characteristic Curve)。
ROC曲线通过不同阈值下的假正例率(FPR)与真正例率(TPR)来绘制,它显示了模型在不同阈值下的性能。
6.1 真正例率(True Positive Rate, TPR)是指所有正例样本中预测为真正正例的样本的比例。TPR的计算公式如下:
6.2 假正例率(False Positive Rate, FPR)是指所有反例样本中被错误预测为正例样本的所占比例。FPR的计算公式如下:
此外,对不同的ROC曲线进行比较的一个指标是曲线下的面积(Area Unser the Curve, AUC)。AUC给出的是分类器的平均性能值,它提供了一个单一的数值,来总结模型的性能,其中1表示完美模型,0.5表示随机猜测。
7.PR曲线
PR曲线(Precision-Recall Curve)显示了在不同阈值下的精确率(Precision)与召回率(Recall)之间的关系。PR曲线下的面积(AP)用于评估模型在类别不平衡数据集上的性能,特别是在正类样本非常少时,PR曲线比ROC曲线更能反映模型的性能。
三、 简单的案例应用
(一)过程分析
1.导入模块
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc, precision_recall_curve
import matplotlib.pyplot as plt
2.加载数据集
# 加载数据集
data = load_diabetes()
X = data.data
y = data.target > 120 # 将目标转换为二分类问题
3.划分数据集
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
4.创建并训练模型
#用逻辑回归的方法创建模型
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
5.不同的模型评估指标计算
#计算准确率、精确率、召回率和F1分数
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# 计算ROC曲线和AUC值
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
roc_auc = auc(fpr, tpr)
roc_auc_values.append(roc_auc)
# 计算PR曲线和AUC值
precision_curve, recall_curve, _ = precision_recall_curve(y_test, model.predict_proba(X_test)[:, 1])
pr_auc = auc(recall_curve, precision_curve)
pr_auc_values.append(pr_auc)
6.输出不同k值下的评估指标结果
# 打印评估指标
print(f"k={k}: Accuracy={accuracy:.4f}, Precision={precision:.4f},
Recall={recall:.4f}, F1={f1:.4f}")
不同k值的评估指标结果如下所示:
7. 绘制ROC曲线、PR曲线(以k=8为例)
# 绘制ROC曲线
plt.figure(figsize=(10, 6))
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title(f'ROC Curve for k = {k}')
plt.plot(fpr, tpr, label=f'k={k}, AUC = {roc_auc:.2f}')
# 绘制PR曲线
plt.figure(figsize=(10, 6))
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title(f"PR Curve for k = {k}" )
plt.plot(recall_curve, precision_curve, label=f'k={k}, AP = {pr_auc:.2f}')
k=8条件下,ROC曲线和PR曲线如下图所示:
(二)总代码
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc, precision_recall_curve
import matplotlib.pyplot as plt
# 加载数据集
data = load_diabetes()
X = data.data
y = data.target > 120 # 将目标转换为二分类问题
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用逻辑回归模型进行训练,并计算评估指标
tree_models = []
roc_auc_values = []
pr_auc_values = []
k_set= { 2, 4, 6, 7, 8, 9}
for k in k_set:
#用逻辑回归的方法创建模型
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
#计算准确率、精确率、召回率和F1分数
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# 计算ROC曲线和AUC值
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
roc_auc = auc(fpr, tpr)
roc_auc_values.append(roc_auc)
# 计算PR曲线和AUC值
precision_curve, recall_curve, _ = precision_recall_curve(y_test, model.predict_proba(X_test)[:, 1])
pr_auc = auc(recall_curve, precision_curve)
pr_auc_values.append(pr_auc)
# 打印评估指标
print(f"k={k}: Accuracy={accuracy:.4f}, Precision={precision:.4f}, Recall={recall:.4f}, F1={f1:.4f}")
# 绘制ROC曲线
plt.figure(figsize=(10, 6))
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title(f'ROC Curve for k = {k}')
plt.plot(fpr, tpr, label=f'k={k}, AUC = {roc_auc:.2f}')
# 绘制PR曲线
plt.figure(figsize=(10, 6))
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title(f"PR Curve for k = {k}" )
plt.plot(recall_curve, precision_curve, label=f'k={k}, AP = {pr_auc:.2f}')
# 完成ROC曲线的绘制
plt.figure(figsize=(10, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve for Different Tree Depths')
plt.legend(loc='lower right')
plt.show()
# 完成PR曲线的绘制
plt.figure(figsize=(10, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR Curve for Different Tree Depths')
plt.legend(loc='lower right')
plt.show()
# 打印最终的AUC值
print("ROC AUC values for different tree depths:", roc_auc_values)
print("PR AUC values for different tree depths:", pr_auc_values)
总结
(一)ROC曲线和PR曲线的差异
PR曲线(Precision-Recall Curve)和ROC曲线(Receiver Operating Characteristic Curve)都是用于评估分类模型性能的工具,它们侧重点不同,因而应用的场景也不同。
PR曲线主要关注模型在召回率(Recall)方面的表现,即模型能够正确识别正类的比例。特别适用于类别不平衡的数据集,其中正类样本数量远少于负类样本。在这种情况下,模型可能更关注召回率,因为它可以帮助识别更多的正类样本。
PR曲线下的面积(Average Precision, AP)是评价模型性能的指标。AP值越高,模型性能越好。
ROC曲线主要关注模型在真正例率(True Positive Rate, TPR)方面的表现,即模型能够正确识别正类的比例。它适用于类别相对平衡的数据集,其中正类和负类样本数量相近。在这种情况下,模型可能更关注TPR,因为它可以帮助区分正类和负类。
ROC曲线下的面积(Area Under the Curve, AUC)是评价模型性能的指标。AUC值越高,模型性能越好。
(二)不同k值对ROC曲线的影响
当k值较小时,模型会更加关注最近的邻居,这可能导致模型对噪声更加敏感,从而在ROC曲线上表现出较低的性能。
当k值较大时,模型会更加关注较远的邻居,这可能导致模型更加泛化,从而在ROC曲线上表现出较高的性能。