共计 1917 个字符,预计需要花费 5 分钟才能阅读完成。
刚接触机器学习时,我发现自己的模型在训练集上表现优异,但一到测试集就惨不忍睹——这就是典型的过拟合现象。过拟合就像学生死记硬背了所有习题答案,遇到新题目却不会举一反三。今天我们就来聊聊如何用交叉验证这个利器解决这个问题。

过拟合的表现与常见验证方法
-
过拟合的典型症状:训练准确率高达 95%,测试准确率却只有 60%。这意味着模型记住了训练数据的噪声而非规律。
-
三种验证策略对比:
- 留出法:简单粗暴(如 7:3 分训练测试集),但小数据集可能浪费数据
- K 折交叉验证:把数据分 K 份,轮流用 K - 1 份训练,1 份验证,适合大多数场景
- 留一法:极端 K 折(K= 样本数),计算成本高但适合极小数据集
动手实现 K 折交叉验证
先准备数据并标准化(重要!不同量纲的特征会影响模型):
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
# 标准化特征(注意:要先拆分训练测试集再分别标准化!)scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
实现 5 折交叉验证(shuffle=True 打乱数据顺序,避免原始分布影响):
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
# 创建模型
model = LogisticRegression(max_iter=200)
# 交叉验证(默认使用准确率评估)scores = cross_val_score(model, X_scaled, y, cv=5, shuffle=True)
print(f'各折准确率: {scores}')
print(f'平均准确率: {scores.mean():.2f} ± {scores.std():.2f}')
可视化训练过程能更直观发现问题(示例使用 SVM):
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import learning_curve
# 绘制学习曲线
train_sizes, train_scores, val_scores = learning_curve(SVC(kernel='linear'), X_scaled, y, cv=5, train_sizes=np.linspace(0.1, 1.0, 5)
)
plt.plot(train_sizes, train_scores.mean(axis=1), label='训练集')
plt.plot(train_sizes, val_scores.mean(axis=1), label='验证集')
plt.xlabel('训练样本数')
plt.ylabel('准确率')
plt.legend()
性能优化与避坑指南
- 计算资源权衡:
- 10 折比 5 折更稳定但耗时翻倍
-
大数据集可用 3 折加速
-
小数据集技巧:
- 使用分层抽样(stratified K-fold)保持类别比例
-
分类问题推荐使用 StratifiedKFold 替代普通 KFold
-
严防数据泄露:
- 特征工程要在交叉验证循环内进行
-
避免在标准化时使用全部数据 fit
-
其他注意事项:
- 设置随机种子(random_state)保证可复现
- 分类问题优先看 F1 分数而非准确率
延伸思考
当你发现不同折的验证结果波动很大时:
1. 是否数据分布不均匀?尝试增加折数或检查 shuffle
2. 是否需要收集更多数据?
3. 是否模型复杂度不合适?
交叉验证与超参数调优的黄金组合:
from sklearn.model_selection import GridSearchCV
params = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
grid = GridSearchCV(SVC(), params, cv=5)
grid.fit(X_scaled, y)
print(f'最佳参数: {grid.best_params_}')
延伸阅读:
– Scikit-learn 官方文档的 模型选择章节
–《An Introduction to Statistical Learning》第 5 章
希望这篇笔记能帮你避开过拟合的坑。刚开始可能会觉得交叉验证流程复杂,但多练习几次就会感受到它的价值——毕竟好的模型应该像经验丰富的老医生,见过各种病例(交叉验证的多种数据划分)才能稳健诊断新病人。
正文完
