模型评估
模型评估
模型评估是机器学习流程中不可或缺的环节,它帮助我们了解模型的性能并做出改进。本文将介绍分类模型的常用评估指标。
混淆矩阵
混淆矩阵是评估分类模型性能的基础,它展示了模型预测结果与真实标签的对比。
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 confusion_matrix, ConfusionMatrixDisplay
# 创建示例数据
X, y = make_classification(n_samples=1000, n_features=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练模型
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("混淆矩阵:")
print(cm)
# 可视化混淆矩阵
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['负类', '正类'])
disp.plot(cmap='Blues')
plt.title('混淆矩阵')
plt.show()
准确率(Accuracy)
准确率是正确预测的样本数占总样本数的比例,是最直观的评估指标。
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.4f}")
# 手动计算
TP = cm[1, 1]
TN = cm[0, 0]
FP = cm[0, 1]
FN = cm[1, 0]
accuracy_manual = (TP + TN) / (TP + TN + FP + FN)
print(f"手动计算的准确率: {accuracy_manual:.4f}")
精确率(Precision)
精确率表示预测为正类的样本中实际为正类的比例,衡量模型的"查准率"。
from sklearn.metrics import precision_score
precision = precision_score(y_test, y_pred)
print(f"精确率: {precision:.4f}")
# 手动计算
precision_manual = TP / (TP + FP)
print(f"手动计算的精确率: {precision_manual:.4f}")
召回率(Recall)
召回率表示实际为正类的样本中被正确预测的比例,衡量模型的"查全率"。
from sklearn.metrics import recall_score
recall = recall_score(y_test, y_pred)
print(f"召回率: {recall:.4f}")
# 手动计算
recall_manual = TP / (TP + FN)
print(f"手动计算的召回率: {recall_manual:.4f}")
F1分数
F1分数是精确率和召回率的调和平均数,综合考虑了两者的表现。
from sklearn.metrics import f1_score
f1 = f1_score(y_test, y_pred)
print(f"F1分数: {f1:.4f}")
# 手动计算
f1_manual = 2 * (precision * recall) / (precision + recall)
print(f"手动计算的F1分数: {f1_manual:.4f}")
# F-beta分数(可调节精确率和召回率的权重)
from sklearn.metrics import fbeta_score
f2 = fbeta_score(y_test, y_pred, beta=2) # 更重视召回率
f05 = fbeta_score(y_test, y_pred, beta=0.5) # 更重视精确率
print(f"F2分数: {f2:.4f}")
print(f"F0.5分数: {f05:.4f}")
分类报告
sklearn提供了方便的分类报告函数,一次性输出所有指标。
from sklearn.metrics import classification_report
print("分类报告:")
print(classification_report(y_test, y_pred, target_names=['负类', '正类']))
AUC-ROC曲线
ROC曲线和AUC是评估二分类模型性能的重要指标,特别适用于类别不平衡的数据。
from sklearn.metrics import roc_curve, roc_auc_score, auc
# 获取预测概率
y_prob = model.predict_proba(X_test)[:, 1]
# 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)
# 计算AUC
auc_score = roc_auc_score(y_test, y_prob)
print(f"AUC: {auc_score:.4f}")
# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线 (AUC = {roc_auc:.4f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label='随机分类器')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('假正率 (FPR)')
plt.ylabel('真正率 (TPR)')
plt.title('ROC曲线')
plt.legend(loc="lower right")
plt.grid(True)
plt.show()
多分类评估
对于多分类问题,需要使用宏平均和微平均来计算指标。
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
# 加载多分类数据
iris = load_iris()
X_iris, y_iris = iris.data, iris.target
X_train_iris, X_test_iris, y_train_iris, y_test_iris = train_test_split(
X_iris, y_iris, test_size=0.3, random_state=42)
# 训练多分类模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train_iris, y_train_iris)
y_pred_iris = rf.predict(X_test_iris)
# 多分类指标
print("宏平均精确率:", precision_score(y_test_iris, y_pred_iris, average='macro'))
print("微平均精确率:", precision_score(y_test_iris, y_pred_iris, average='micro'))
print("加权平均精确率:", precision_score(y_test_iris, y_pred_iris, average='weighted'))
# 多分类AUC(使用one-vs-rest)
from sklearn.metrics import roc_auc_score
y_prob_iris = rf.predict_proba(X_test_iris)
auc_ovo = roc_auc_score(y_test_iris, y_prob_iris, multi_class='ovo')
auc_ovr = roc_auc_score(y_test_iris, y_prob_iris, multi_class='ovr')
print(f"One-vs-One AUC: {auc_ovo:.4f}")
print(f"One-vs-Rest AUC: {auc_ovr:.4f}")
选择合适的评估指标
不同的应用场景需要不同的评估指标:
- 类别平衡时:准确率是合适的指标
- 类别不平衡时:使用F1分数、AUC-ROC
- 关注假正率时:使用精确率
- 关注漏检时:使用召回率
模型评估是一个综合的过程,需要根据具体问题选择合适的指标组合来全面评估模型性能。