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
相关产品推荐
相关产品推荐

