K近邻交叉验证中,移除列表内当前DataFrame遇ValueError如何解决?
解决K近邻交叉验证中移除折叠时的DataFrame比较错误
问题原因
你遇到的ValueError: Can only compare identically-labeled DataFrame objects,是因为调用training_set.remove(fold)时,Pandas需要比较列表中的DataFrame对象是否和fold相等,但拆分后的折叠可能存在索引范围、标签不一致的情况,导致比较失败。
两种可行的解决方案
方案1:通过索引遍历组合训练集
直接利用索引切片来排除当前测试折叠,完全避免DataFrame对象的比较操作:
k = 5 scores = list() # 遍历折叠的索引,而不是折叠对象本身 for i in range(len(folds)): # 拼接除第i个折叠外的所有部分作为训练集 training_set = pd.concat(folds[:i] + folds[i+1:]) test_set = folds[i] # 计算预测结果与误差 d = test_set.apply(lambda row: distance(row, training_set, k), axis=1) error = root_mean_squared_error(test_set['rings'], d) scores.append(error)
方案2:用enumerate结合列表推导式过滤
如果习惯遍历折叠对象,可以用enumerate同时获取索引和对象,通过索引判断排除当前折叠:
k = 5 scores = list() for idx, fold in enumerate(folds): # 用列表推导式筛选出非当前索引的折叠并拼接 training_set = pd.concat([f for i, f in enumerate(folds) if i != idx]) d = fold.apply(lambda row: distance(row, training_set, k), axis=1) error = root_mean_squared_error(fold['rings'], d) scores.append(error)
补充说明
原代码中list(folds).remove(fold)的问题在于:list.remove()需要先找到匹配元素,而Pandas对DataFrame的相等校验非常严格——要求两个DataFrame的索引、列、数据完全一致。但np.array_split拆分后的折叠,索引是原数据集的分片(比如第一个折叠索引是0-999,第二个是1000-1999),导致比较时触发标签不匹配的错误。上面两种方案都绕开了直接比较DataFrame对象,自然不会出现这个问题。
内容的提问来源于stack exchange,提问作者matt.aurelio
相关产品推荐
相关产品推荐

