← 返回首页
🤖

模型评估

📂 ai ⏱ 2 min 373 words

模型评估

模型评估是机器学习流程中不可或缺的环节,它帮助我们了解模型的性能并做出改进。本文将介绍分类模型的常用评估指标。

混淆矩阵

混淆矩阵是评估分类模型性能的基础,它展示了模型预测结果与真实标签的对比。

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}")

选择合适的评估指标

不同的应用场景需要不同的评估指标:

  1. 类别平衡时:准确率是合适的指标
  2. 类别不平衡时:使用F1分数、AUC-ROC
  3. 关注假正率时:使用精确率
  4. 关注漏检时:使用召回率

模型评估是一个综合的过程,需要根据具体问题选择合适的指标组合来全面评估模型性能。