请教代码末尾for循环逻辑:基于StratifiedShuffleSplit分层划分数据集
嘿,我来帮你把这个分层划分循环的逻辑掰扯得明明白白~
分层划分循环的执行逻辑详解
1. 循环的核心执行流程
首先得明确:StratifiedShuffleSplit这个工具的核心目标,就是按照指定类别的分布比例,把数据集拆分成训练集和测试集,保证拆分后的两个子集里,每个类别的占比和原数据集完全一致,避免随机拆分带来的抽样偏差。
你写的这段循环代码:
for train_index,test_index in split.split(housing,housing["income_cat"]): strat_train_set = housing.loc[train_index] strat_test_set = housing.loc[test_index]
具体执行步骤是这样的:
- 首先调用
split.split()方法,它会根据你传入的参数,生成一组训练集与测试集的索引对(因为你设置了n_splits=1,所以只会生成一组) - 循环遍历这组索引对:
- 第一次(也是唯一一次)迭代时,
train_index会拿到所有属于训练集的行索引,test_index拿到所有属于测试集的行索引 - 接着用
housing.loc[train_index]从完整的DataFrame中提取出对应训练集的所有数据,赋值给strat_train_set;同理,用test_index提取测试集数据到strat_test_set
- 第一次(也是唯一一次)迭代时,
2. 关于循环头参数的疑问解答
你的猜测完全正确!第二个参数housing["income_cat"]就是用来指定分层的依据类别,第一个参数housing是我们要拆分的完整数据集,两者的作用分工明确:
- 第一个参数
housing:告诉方法「我要拆分的是这个完整数据集」,方法需要知道整个数据集的行范围,才能生成对应的拆分索引 - 第二个参数
housing["income_cat"]:告诉方法「你要按照这个列的类别分布来拆分」,确保训练集和测试集里,每个income_cat类别的样本占比,和原数据集里的占比完全一致
举个简单例子:如果原数据里income_cat=1的样本占10%,income_cat=5的样本占20%,那拆分后的训练集和测试集里,这两个类别的占比也会分别是10%和20%。这样就不会出现随机拆分时,训练集里高收入样本占比过高,或者测试集里低收入样本几乎没有的情况,让模型训练更贴合真实数据分布。
补充:为什么要做分层划分?
你之前把median_income转换成income_cat类别,就是因为收入是影响房价的核心特征。如果用普通的随机拆分,很可能出现抽样偏差——比如训练集里全是中高收入样本,模型学不到低收入群体的房价规律,放到真实场景里就会预测不准。分层划分就是为了从根源上避免这种问题,让训练集和测试集都能代表整个数据集的特征分布。
内容的提问来源于stack exchange,提问作者hman
相关产品推荐
相关产品推荐

