在机器学习的模型选择中,K-折交叉验证(K-Fold Cross-Validation) 是最常用且最稳健的模评估方法之一。它通过充分利用有限的数据,给出一个比单次“训练集/验证集划分”更可靠、方差更小的模型性能评价。下文将从背景知识、原理介绍与代码实现三部分说明。
1. 背景知识
由于K-折交叉验证是通过处理训练集与验证集划分,以提供模型性能评价的一种方式,而很多初学者(我在内)容易混淆验证集 (Validation Set) 和 测试集 (Test Set)。因此这里先对验证集 和测试集作解释说明。
(1)训练集:是“课本”,模型通过它学习权值。
(2)验证集:是“模拟考”,模型不直接学习它,但算法工程师根据模拟考成绩来挑选“哪本课本更好”(选模型)或者“学习率该调多大”(调超参数)。
(3)测试集:是“高考”,只有在所有模型都选定、参数都调好后,才能用一次,用来评估最终实力。
核心逻辑:如果根据测试集来调参,那么模型就会“潜意识”里拟合测试集的分布,导致评估结果虚高。这就是所谓的数据泄露 (Data Leakage)。
2. 原理介绍
当数据量不够大时,单次划分验证集可能导致“运气”成分太大。K-折交叉验证通过多次迭代以消除这种偶然性。其核心思想是将数据集“切成
份,轮流坐庄”。

(1)切分:将全部训练数据集随机打乱,并平均分成
个互不相交的子集。
(2)循环:进行
轮训练与评估。
- 在第
轮中,取第
份数据作为验证集(Validation Set)。 - 取剩余的
份数据作为训练集(Training Set)。 - 在该训练集上训练模型,在验证集上计算评价指标(如准确率、MSE等)。
(3)聚合:计算这
次评估结果的平均值和标准差。
3. 代码实现
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
# 1. 加载数据
data = load_iris()
X, y = data.data, data.target
# 2. 定义模型
model = RandomForestClassifier(n_estimators=100)
# 3. 执行 5-折交叉验证
# cv=5 表示 K=5
scores = cross_val_score(model, X, y, cv=5)
print(f"每折的准确率: {scores}")
print(f"平均准确率: {scores.mean():.4f}")
print(f"准确率标准差: {scores.std():.4f}")




