You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请教代码末尾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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:00:48