You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于scikit-learn cross_val_score中X、y用训练集还是全数据集的疑问

关于cross_val_score传入X、y的正确选择

嘿,这个问题问到点子上了,很多刚接触交叉验证的同学都会搞混这一点,我给你理得明明白白:

核心结论是:你应该传入的是训练集(X_train, y_train),而不是包含测试集的整个原始数据集。

为什么不能传整个数据集?

交叉验证的本质是帮你在训练数据内部模拟“训练-验证”的过程,用来评估模型的泛化能力。如果把测试集也混进去,交叉验证时模型会“偷偷”学到测试集的信息,最后得到的得分会虚高,完全没法反映模型在真实未知数据上的表现——这就是机器学习里常说的数据泄露,绝对要避免。

正确的使用流程

正常的机器学习项目里,我们会遵循这个标准步骤:

  • 第一步:把原始数据集拆分成训练集和独立测试集(比如用train_test_split),测试集要像“宝贝”一样藏起来,只在最后一步用它来验证最终模型的性能。
  • 第二步:把训练集(X_train, y_train)传入cross_val_score,让它帮你做交叉验证,这一步可以用来评估模型的 baseline 性能,也可以配合网格搜索、随机搜索来调参。
  • 第三步:等模型调优完成后,用整个训练集训练最终模型,最后用之前藏好的测试集做最终的性能测试。

举个直观的代码例子

from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# 加载示例数据
iris = load_iris()
X_total, y_total = iris.data, iris.target

# 第一步:拆分训练集和独立测试集(测试集占20%)
X_train, X_test, y_train, y_test = train_test_split(
    X_total, y_total, test_size=0.2, random_state=42
)

# 第二步:用训练集做5折交叉验证
model = RandomForestClassifier(random_state=42)
cv_results = cross_val_score(model, X_train, y_train, cv=5)
print(f"5折交叉验证平均得分: {cv_results.mean():.2f} ± {cv_results.std():.2f}")

# 第三步:训练最终模型并测试
model.fit(X_train, y_train)
final_test_score = model.score(X_test, y_test)
print(f"独立测试集最终得分: {final_test_score:.2f}")

特殊情况:数据集极小

如果你的数据集特别小(比如只有几十条样本),没法拆分出一个靠谱的独立测试集,那可以考虑把整个数据集传入cross_val_score(比如用留一交叉验证cv=len(X))。但这种情况下要注意,评估结果的方差可能会很大,最好多做几次验证或者结合领域知识来判断。

内容的提问来源于stack exchange,提问作者Javiss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:05:17