重复K折交叉验证中类型相关报错及KeyError问题求助
问题排查:RepeatedKFold中的KeyError问题
错误原因分析
从你的报错栈和代码来看,这个KeyError的核心有两个问题:
- 未正确定义特征集
x和标签集y:你直接在循环里使用了x和y变量,但代码里没有提前拆分出这两个变量;就算你之前定义过,x[train]的写法在Pandas DataFrame中是按列名索引,而train是交叉验证生成的行位置索引,自然会找不到对应的列,触发KeyError。 - 没必要的类型转换:
rkf.split(recipes.astype(str))把整个数据集转成字符串完全多余,RepeatedKFold只需要基于样本数量拆分索引,数值型数据直接用就行,转字符串反而会给后续模型训练埋坑。
解决方法
按照以下步骤修改代码:
1. 先正确拆分特征与标签
从你的数据处理逻辑来看,rating是分类标签,其他列是特征,所以先把数据集拆分成x(特征)和y(标签):
# 拆分特征(去掉rating列)和标签(rating列) x = recipes.drop('rating', axis=1) y = recipes['rating']
2. 修正交叉验证的索引方式
在循环中使用.iloc[]来按行位置提取数据([]在DataFrame中默认是取列,这是你报错的关键),同时去掉没必要的字符串转换:
rkf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=50) # 用特征集x来拆分索引即可,不需要转字符串 for train_idx, test_idx in rkf.split(x): print("训练集索引:%s,测试集索引:%s" % (train_idx, test_idx)) # 用.iloc按位置取行 xtrain, xtest = x.iloc[train_idx], x.iloc[test_idx] ytrain, ytest = y.iloc[train_idx], y.iloc[test_idx] # 这里可以添加你的模型训练、评估代码
额外注意点
- 你之前对
rating的分箱和LabelEncoder处理是正确的,适合作为分类模型的输入标签; - 确保
x和y的样本数量一致(你已经用dropna()处理过缺失值,这部分没问题); - 如果后续需要用索引而不是位置,也可以用
.loc[],但交叉验证生成的train_idx是位置索引,所以.iloc[]更直接。
内容的提问来源于stack exchange,提问作者Jasmine Wong
相关产品推荐
相关产品推荐

