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

