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

K折交叉验证运行时报KeyError: '[] not in index'错误如何解决

报错原因
  • 核心问题是你将X、Y转为Pandas DataFrame后,直接使用X[train_index]的索引方式是匹配列名,而KFold返回的train_index、test_index是行的位置下标,你的DataFrame列名是0、1、2、3(对应原来的A、B、C、D),不存在和行下标对应的列名,因此触发KeyError。
  • 第二个逻辑问题:你将训练集、测试集的拆分代码写在了for循环外部,循环结束后仅会保留最后一折的索引值,无法完成10折交叉验证的完整流程。
  • 额外问题:你的数据集总计只有18条样本,设置n_splits=10会导致部分折的测试集仅1条样本,同时shuffle=False结合你数据集类别扎堆的特性,会出现某一折全是正样本/负样本的问题,影响验证结果可信度。
修复后代码
import pandas as pd
from sklearn.model_selection import StratifiedKFold

df = pd.read_csv('CD.TXT', delimiter=',')
# 不需要转values再转DataFrame,直接取特征和标签即可
X = df[['A', 'B', 'C', 'D']]
Y = df['Label']

# 分类任务推荐用StratifiedKFold,保证每折类别比例一致,这里同时开启shuffle打乱样本顺序
# 样本量少可以减少折数,比如调整为5折
cv = StratifiedKFold(n_splits=5, random_state=42, shuffle=True)

# 所有折的处理逻辑都要放到for循环内部
for fold, (train_index, test_index) in enumerate(cv.split(X, Y)):
    print(f"=====第{fold+1}折=====")
    # DataFrame用.iloc按位置下标取行
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]
    Y_train, Y_test = Y.iloc[train_index], Y.iloc[test_index]
    
    # 这里可以添加你的模型训练、验证代码
    print("训练集大小:", len(X_train), "测试集大小:", len(X_test))
    print("训练集标签分布:\n", Y_train.value_counts())
可选简化方案

如果你不需要用到Pandas的DataFrame特性,可以直接用Numpy数组操作,不需要修改索引逻辑:

import pandas as pd
from sklearn.model_selection import StratifiedKFold

df = pd.read_csv('CD.TXT', delimiter=',')
X = df[['A', 'B', 'C', 'D']].values
Y = df['Label'].values

cv = StratifiedKFold(n_splits=5, random_state=42, shuffle=True)
for train_index, test_index in cv.split(X, Y):
    X_train, X_test = X[train_index], X[test_index]
    Y_train, Y_test = Y[train_index], Y[test_index]
    # 后续模型训练逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:27:04