机器学习场景下循环遍历分层索引时.loc()赋值逻辑疑问
问题解答
- 你认知里“循环每次赋值会覆盖变量,最终仅保留最后一次结果”的逻辑本身完全正确,运行结果和推测不符的核心原因出在拆分类的
n_splits参数配置上:- 机器学习入门场景做分层训练集/测试集拆分时,最常用的是
StratifiedShuffleSplit类,且默认会把参数n_splits设为1,这时候split.split()方法只会生成1组训练、测试索引,整个for循环仅执行1次,不存在赋值覆盖的情况,最终strat_train_set和strat_test_set就是拆分好的唯一一份数据集,和你实际运行的结果一致。 - 如果你把
n_splits设置为大于1的数值(比如交叉验证场景常用的5、10),运行你贴的代码最终确实只会保留最后一轮的拆分结果,不可能存储多份数据集。你误以为“两个变量存储了数据集集合”,大概率是把单份数据集的多行结构、或是拆分生成器返回的多组索引和变量实际存储的内容搞混了。
- 机器学习入门场景做分层训练集/测试集拆分时,最常用的是
- 如果你确实需要存储所有折的拆分结果,需要手动做追加操作,参考代码如下:
# 先初始化空列表存储所有拆分结果 strat_train_all = [] strat_test_all = [] for train_index, test_index in split.split(housing, housing["income_cat"]): strat_train_all.append(housing.loc[train_index]) strat_test_all.append(housing.loc[test_index])
内容的提问来源于stack exchange,提问作者Chanaka Perera
相关产品推荐
相关产品推荐

