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

使用K-Folds交叉验证器训练决策树时出现KeyError如何解决?

K-Folds交叉验证结合决策树训练时KeyError问题的解决方法

问题原因

报错的核心原因是:KFold.split()返回的是数据的位置索引(即行的序号,从0开始),而你用X[train]这种方式取数时,Pandas会把括号里的内容当成**标签索引(即DataFrame的index列值)**来匹配。如果你的DataFrame索引不是连续的0、1、2...(比如有缺失行、手动修改过索引,或之前的操作打乱了索引),就会出现找不到对应标签的KeyError。

解决方法

有两种简单的修正方式:

方法1:用.iloc按位置索引取值

直接把代码中取训练集和测试集的四行,替换成用.iloc按位置索引获取数据:

X_train = X.iloc[train]
y_train = Y.iloc[train]
X_test = X.iloc[test]
y_test = Y.iloc[test]

.iloc专门用于按位置(行/列的序号)访问数据,完美匹配KFold返回的位置索引,不会出现索引不匹配的问题。

方法2:将数据转为NumPy数组

如果不需要保留Pandas的DataFrame/Series结构,可以直接把X和Y转为NumPy数组,这样用方括号索引就会直接按位置取值:

# 替换原来的X、Y定义行
X = df.iloc[:,:200].values
Y = df.iloc[:,200].values

之后X[train]、Y[train]这类写法即可正常工作。

额外优化提示

你代码中一开始的train_test_split是多余的——后面的KFold循环已经会重新划分训练集和测试集,这行代码可以删掉,避免混淆。

修正后的完整代码示例

import pandas as pd
from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

df = pd.read_csv(r'C:\Users\data.csv')
    
# 划分特征与目标变量
X = df.iloc[:,:200]
Y = df.iloc[:,200]

clf = DecisionTreeClassifier()

kf = KFold(n_splits=5, shuffle=True, random_state=3)

cnt = 1

# 交叉验证循环
for train, test in kf.split(X, Y):
    print(f'Fold:{cnt}, Train set: {len(train)}, Test set:{len(test)}')
    cnt += 1
    
    # 用iloc按位置索引取值
    X_train = X.iloc[train]
    y_train = Y.iloc[train]
    X_test = X.iloc[test]
    y_test = Y.iloc[test]

    clf.fit(X_train,y_train)

    predictions = clf.predict(X_test)
    accuracy = accuracy_score(y_test, predictions)

    print("test")
    print(y_test)
    print("predict")
    print(predictions)
    print("Accuracy: %.2f%%" % (accuracy * 100.0))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:05:31