使用K折交叉验证缓解过拟合:实现过程中遇到的问题
解决K折交叉验证中的索引报错问题
你猜的完全正确!这个报错的核心原因确实是索引方式搞错了——当X是Pandas DataFrame(或Series)时,直接用X[train_index]会被当成按列索引取值,而KFold.split()返回的train_index和test_index是样本的行位置索引,这就导致了匹配错误。
针对这个问题,你可以用两种方式解决,具体选择取决于你的数据索引类型:
1. 用iloc按行位置索引取值(推荐)
KFold默认返回的是样本的整数位置索引(不管你的DataFrame行标签是什么),所以用iloc是最稳妥的,它专门用来按整数位置访问行/列:
from sklearn.model_selection import KFold X,y = creation_X_y() #Function which is cleaning my data kf = KFold(n_splits=5) for train_index, test_index in kf.split(X): print("Train:", train_index, "Validation:",test_index) X_train = X.iloc[train_index] X_test = X.iloc[test_index] # 如果y是Pandas Series,同样要用iloc y_train, y_test = y.iloc[train_index], y.iloc[test_index]
2. 用loc按行标签索引取值
如果你的DataFrame行标签刚好是连续整数(和位置索引一致,比如默认的0、1、2...),那X.loc[train_index]也能正常工作。但如果你的行标签是自定义的(比如字符串、非连续整数),loc就会找不到对应标签,引发新的错误,所以这种方式不如iloc通用。
额外说明
如果X是NumPy数组的话,原来的X[train_index]写法是没问题的,因为NumPy数组的索引默认就是按行来的。所以你的报错情况,基本可以确定X或y是Pandas的DataFrame/Series类型。
内容的提问来源于stack exchange,提问作者user15565396
相关产品推荐
相关产品推荐

