分类模型评估指标:混淆矩阵、ROC与AUC解析
模型评估概述
模型评估用于选择最优模型、参数和特征组合。分类问题常用评估指标包括分类准确率、混淆矩阵及其衍生指标、ROC曲线和AUC值。
分类准确率的局限性
以皮马印第安人糖尿病数据集为例,使用逻辑回归模型:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
diabetes_data = pd.read_csv('diabetes_dataset.csv')
features = ['glucose', 'bmi', 'age', 'pedigree']
X = diabetes_data[features]
y = diabetes_data.diabetes_status
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
accuracy = model.score(X_test, y_test)
print(f"模型准确率: {accuracy:.3f}")
空准确率(多数类占比)计算:
majority_class = y_test.value_counts().index[0]
null_acc = (y_test == majority_class).mean()
print(f"空准确率: {null_acc:.3f}")
当准确率接近空准确率时,表明模型可能仅能识别多数类。
混淆矩阵分析
混淆矩阵提供更详细的分类表现:
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, predictions)
print("混淆矩阵:\n", cm)
关键指标计算:
TP = cm[1, 1] # 真阳性
TN = cm[0, 0] # 真阴性
FP = cm[0, 1] # 假阳性
FN = cm[1, 0] # 假阴性
sensitivity = TP / (TP + FN) # 召回率
specificity = TN / (TN + FP) # 特异度
precision = TP / (TP + FP) # 精确率
f1_score = 2 * (precision * sensitivity) / (precision + sensitivity)
不同场景的指标选择:
- 欺诈检测:优先优化召回率(减少漏报)
- 垃圾邮件过滤:优先优化精确率(减少误报)
阈值调整策略
通过调整分类阈值优化模型表现:
probabilities = model.predict_proba(X_test)[:, 1]
adjusted_predictions = (probabilities > 0.35).astype(int)
new_cm = confusion_matrix(y_test, adjusted_predictions)
new_recall = new_cm[1, 1] / (new_cm[1, 1] + new_cm[1, 0])
print(f"调整后的召回率: {new_recall:.3f}")
阈值降低会提高召回率但降低特异度,需根据业务需求平衡。
ROC与AUC评估
ROC曲线展示不同阈值下的性能:
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt
fpr, tpr, cutoffs = roc_curve(y_test, probabilities)
plt.plot(fpr, tpr)
plt.xlabel('假阳性率 (1 - 特异度)')
plt.ylabel('真阳性率 (召回率)')
plt.title('ROC曲线')
plt.show()
auc_value = roc_auc_score(y_test, probabilities)
print(f"AUC值: {auc_value:.3f}")
AUC值提供模型整体性能评估,适用于类别不平衡场景。值越接近1表示模型区分能力越强。