模型评估与交叉验证
使用准确率、F1、ROC-AUC 和 k 折 CV 评估模型。
模型评估与交叉验证 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
训练集/验证集/测试集划分
请使用三路划分:使用训练集进行拟合,使用验证集调整超参数,使用测试集报告最终性能。在开发过程中,绝不能使用测试集。
from sklearn.model_selection import train_test_split
import numpy as np
X = np.random.rand(1000, 10)
y = (X[:,0] > 0.5).astype(int)
X_tr, X_rest, y_tr, y_rest = train_test_split(X, y, test_size=0.3)
X_val, X_te, y_val, y_te = train_test_split(X_rest, y_rest, test_size=0.5)准确率得分
accuracy_score 是预测正确的比例。类别均衡时可以使用它;对于不平衡数据,建议优先使用 F1 或 AUC。
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = LogisticRegression().fit(X_tr, y_tr)
print("Accuracy:", accuracy_score(y_te, model.predict(X_te)))精确率、召回率与 F1
对于类别不平衡的问题:精确率 = TP/(TP+FP),召回率 = TP/(TP+FN),F1 是精确率和召回率的调和平均值。
from sklearn.metrics import precision_score, recall_score, f1_score, classification_report
# Use classification_report for a full summary:
print(classification_report(y_te, model.predict(X_te)))
# shows precision, recall, f1 for each class混淆矩阵
混淆矩阵展示真阳性、假阳性、真阴性和假阴性。
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt
cm = confusion_matrix(y_te, model.predict(X_te))
print(cm)
# [[TN FP]
# [FN TP]]ROC 曲线与 AUC
roc_auc_score 衡量 ROC 曲线下的面积。AUC = 1.0 表示完美,0.5 表示随机猜测。
from sklearn.metrics import roc_auc_score, roc_curve
y_prob = model.predict_proba(X_te)[:,1]
print("AUC:", roc_auc_score(y_te, y_prob))
fpr, tpr, thresholds = roc_curve(y_te, y_prob)
# plot fpr vs tpr for the full ROC curve回归指标
对于回归任务,请使用 mean_squared_error(MSE)、root_mean_squared_error(RMSE)和 r2_score。
from sklearn.metrics import mean_squared_error, r2_score
y_pred = regression_model.predict(X_te)
mse = mean_squared_error(y_te, y_pred)
print("RMSE:", mse**0.5)
print("R²:", r2_score(y_te, y_pred))k 折交叉验证
cross_val_score 将数据划分为 k 折,在其中 k-1 折上训练,在 1 折上评估,并重复 k 次。这比单次划分更加稳健。
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(random_state=0)
scores = cross_val_score(LogisticRegression(), X, y, cv=10, scoring="accuracy")
print(f"{scores.mean():.3f} ± {scores.std():.3f}")StratifiedKFold
使用 StratifiedKFold,确保每一折都具有相同的类别分布,这对于不平衡数据集至关重要。
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(weights=[0.9,0.1], random_state=0)
cv = StratifiedKFold(n_splits=5)
scores = cross_val_score(LogisticRegression(), X, y, cv=cv, scoring="f1")
print("Stratified F1:", scores.mean())偏差-方差权衡
高偏差表示欠拟合(模型过于简单)。高方差表示过拟合(模型过于复杂)。交叉验证可以揭示您遇到的是哪一种问题。
# Underfitting: low train score AND low val score
# → increase model complexity, add features
# Overfitting: high train score, low val score
# → regularise, reduce complexity, get more data
from sklearn.model_selection import validation_curve
import numpy as np
train_sc, val_sc = validation_curve(DecisionTreeClassifier(), X, y, param_name="max_depth", param_range=range(1,10))嵌套交叉验证
如果需要进行无偏的超参数调整和评估,请使用嵌套 CV:内层循环负责调整,外层循环负责评估。
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
X, y = make_classification(random_state=0)
gs = GridSearchCV(SVC(), {"C":[0.1,1,10]}, cv=5)
outer_scores = cross_val_score(gs, X, y, cv=5)
print("Nested CV accuracy:", outer_scores.mean())概率校准
分类器的概率估计可能校准得不够好。使用 CalibratedClassifierCV 可以获得更好的概率估计。
from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y)
cal = CalibratedClassifierCV(SVC(), cv=5).fit(X_tr, y_tr)
print(cal.predict_proba(X_te[:3]))快速检查
为什么在评估模型时,交叉验证优于单次训练集/测试集划分?
回顾
对于类别均衡的问题,请使用准确率;对于类别不平衡的问题,请使用 F1/AUC。使用 k 折 cross_val_score 进行评估,对不平衡数据使用 StratifiedKFold,在调整超参数时使用嵌套 CV,以获得无偏的最终估计。在开发过程中,绝不能查看测试集。
用 AI 导师学习 Python — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 76
- 课程
- 320
常见问题解答
「模型评估与交叉验证」课时是免费的吗?
是的 — 「模型评估与交叉验证」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「模型评估与交叉验证」这节课中我会学到什么?
使用准确率、F1、ROC-AUC 和 k 折 CV 评估模型。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「模型评估与交叉验证」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。