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

使用K折交叉验证缓解过拟合:实现过程中遇到的问题

解决K折交叉验证中的索引报错问题

你猜的完全正确!这个报错的核心原因确实是索引方式搞错了——当X是Pandas DataFrame(或Series)时,直接用X[train_index]会被当成按列索引取值,而KFold.split()返回的train_index和test_index是样本的行位置索引,这就导致了匹配错误。

针对这个问题,你可以用两种方式解决,具体选择取决于你的数据索引类型:

1. 用iloc按行位置索引取值(推荐)

KFold默认返回的是样本的整数位置索引(不管你的DataFrame行标签是什么),所以用iloc是最稳妥的,它专门用来按整数位置访问行/列:

from sklearn.model_selection import KFold
X,y = creation_X_y() #Function which is cleaning my data
kf = KFold(n_splits=5)
for train_index, test_index in kf.split(X):
    print("Train:", train_index, "Validation:",test_index)
    X_train = X.iloc[train_index]
    X_test = X.iloc[test_index]
    # 如果y是Pandas Series,同样要用iloc
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

2. 用loc按行标签索引取值

如果你的DataFrame行标签刚好是连续整数(和位置索引一致,比如默认的0、1、2...),那X.loc[train_index]也能正常工作。但如果你的行标签是自定义的(比如字符串、非连续整数),loc就会找不到对应标签,引发新的错误,所以这种方式不如iloc通用。

额外说明

如果X是NumPy数组的话,原来的X[train_index]写法是没问题的,因为NumPy数组的索引默认就是按行来的。所以你的报错情况,基本可以确定X或y是Pandas的DataFrame/Series类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:42:47