理解准确性并不是一切。学会根据问题选择、计算和解释适当的指标——特别是在欺诈检测等不平衡场景中。
想象一个欺诈数据集:
一个总是预测"无欺诈"的模型将有99%的准确性……但它是无用的!它检测到零欺诈。
混淆矩阵显示:
from sklearn.metrics import confusion_matrix
import seaborn as sns
y_pred = 模型.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=['合法', '欺诈'],
yticklabels=['合法', '欺诈'])
plt.title("混淆矩阵")
plt.ylabel("实际")
plt.xlabel("预测")
plt.show()
在我标记为欺诈的所有交易中,有多少实际上是欺诈?
精确率 = TP / (TP + FP)
✅ 当假正例成本高时很重要(例如,阻止合法卡片)。
在所有实际欺诈中,我检测到了多少?
召回率 = TP / (TP + FN)
✅ 在欺诈检测中至关重要。 您希望最小化FN(未检测到的欺诈)。
精确率和召回率的调和平均数。在寻求平衡时有用。
F1 = 2 * (精确率 * 召回率) / (精确率 + 召回率)
from sklearn.metrics import precision_score, recall_score, f1_score
print("精确率:", precision_score(y_test, y_pred))
print("召回率: ", recall_score(y_test, y_pred))
print("F1分数: ", f1_score(y_test, y_pred))
ROC曲线显示了在各种决策阈值下真正例率(召回率)和假正例率之间的权衡。
AUC(曲线下面积) 是0到1之间的数字:
from sklearn.metrics import roc_auc_score, roc_curve
y_proba = 模型.predict_proba(X_test)[:, 1] # 正类概率
auc = roc_auc_score(y_test, y_proba)
print("AUC-ROC:", auc)
# 绘制曲线
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
plt.plot(fpr, tpr, label=f'ROC曲线 (AUC = {auc:.2f})')
plt.plot([0,1], [0,1], 'k--', label='随机分类器')
plt.xlabel('假正例率')
plt.ylabel('真正例率')
plt.title('ROC曲线')
plt.legend()
plt.grid()
plt.show()
✅ AUC优势: 对类别不平衡不变。非常适合欺诈检测。
Scikit-learn提供专业摘要:
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred,
target_names=['合法', '欺诈']))
典型输出:
precision recall f1-score support
合法 0.99 1.00 0.99 19800
欺诈 0.85 0.50 0.63 200
accuracy 0.99 20000
macro avg 0.92 0.75 0.81 20000
weighted avg 0.99 0.99 0.99 20000
数据集: 欺诈_预处理.csv(来自上一模块的预处理数据)
任务:
predict_proba和0.3阈值。precision_recall_curve 来绘制精确率-召回率权衡图(当负例占多数时有用)。