模型评估
准确率、F1、ROC-AUC、K-Fold。
模型评估
这一课你将能做到
- 看懂准确率、精确率、召回率、F1、AUC 各自衡量什么,遇到具体业务知道选哪个
- 用混淆矩阵和分类报告定位模型「错在哪一类」
- 通过调整决策阈值,在精确率和召回率之间做出符合业务代价的取舍
- 用交叉验证稳定评估模型,并识别过拟合与欠拟合
为什么要学
模型训练出来只是个数字对象,能不能上线取决于评估。评估做错,后面全错:一个把所有用户都判为「未掌握」的模型,在 92% 的人确实未掌握时准确率高达 92%,但它毫无用处——这正是本站做题场景会遇到的真数据形态(多数用户大部分题未掌握)。
很多初学者第一次翻车就翻在「用准确率评估不平衡数据」。本课把常用指标全部过一遍,并建立关键认知:指标不是背出来的,是按业务代价权衡出来的。
先建立图像
混淆矩阵(二分类,以「是否掌握」为例):
预测: 掌握 预测: 未掌握
真实: 掌握 TP(说对了) FN(漏报:该推的题没推)
真实: 未掌握 FP(误报:乱推难题) TN(说对了)
精确率 = TP / (TP+FP) 「说掌握的里面有多少真掌握」→ 关乎推题体验
召回率 = TP / (TP+FN) 「真掌握的里面找出了多少」 → 关乎别漏掉用户
跟着做
步骤 1:制造不平衡数据,先踩一次坑
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 模拟做题记录:仅 8% 的样本是「已掌握」
X, y = make_classification(n_samples=1000, n_features=6,
weights=[0.92, 0.08], flip_y=0.02, random_state=42)
X_tr, X_te, y_tr, y_te = train_test_split(
X, y, test_size=0.25, stratify=y, random_state=42) # 不平衡必须 stratify
dummy = DummyClassifier(strategy="most_frequent").fit(X_tr, y_tr)
print("全猜多数类的准确率:", accuracy_score(y_te, dummy.predict(X_te)))
# 输出约 0.92 —— 一个什么都不学的模型准确率也很高!
步骤 2:逻辑回归 + 混淆矩阵 + 分类报告
from sklearn.metrics import classification_report, confusion_matrix
clf = LogisticRegression(max_iter=1000).fit(X_tr, y_tr)
y_pred = clf.predict(X_te)
print(confusion_matrix(y_te, y_pred))
print(classification_report(y_te, y_pred,
target_names=["未掌握", "已掌握"], digits=3))
重点看「已掌握」那一行:precision、recall、f1。比例失真时 accuracy 无意义,这三列才是判断依据。
步骤 3:调阈值,做精确率/召回率权衡
proba = clf.predict_proba(X_te)[:, 1] # 预测「已掌握」的概率
for th in [0.2, 0.5, 0.8]:
pred = (proba >= th).astype(int)
cm = confusion_matrix(y_te, pred)
tp, fp, fn = cm[1, 1], cm[0, 1], cm[1, 0]
print(f"阈值={th} 精确率={tp/(tp+fp):.3f} 召回率={tp/(tp+fn):.3f}")
你会看到:阈值调高 → 精确率升、召回率降;调低则相反。业务翻译:推难题场景要精确率(乱推会伤体验),挽回流失用户场景要召回率(宁可多推不错漏)。阈值是产品开关,不是模型参数。