关于sklearn的StratifiedShuffleSplit的问题

数据挖掘 机器学习 Python scikit-学习 统计数据
2021-10-07 19:49:57

我正在阅读 Aurélien Géron 的《使用 Scikit-Learn 和 Tensorflow 进行机器学习实践》一书。在关于加州房价的回归项目中,他回顾了分层抽样的概念。

我想我把这个概念理解为他的解释“人口被划分为称为分层的同质子组,并且从每个分层中抽取正确数量的实例,以保证测试集代表整个人口。”

因此,用我自己的话来说,简单地用 sklearn 的 train_test_split 拆分数据集会使训练集和测试集容易被错误表示分类变量的比率(即总体有 40% 的一个类别,60% 的另一个,但是训练集/测试集是完全不同的比率这些类别中的一个),因此分层可确保样本是“随机的”,但仍然在测试和训练拆分中保持适当的比率。如果我错了,请纠正我。

这是他根据收入类别进行分层抽样的代码(住房是主要数据框):

split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
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]

我对这段代码很困惑:

1)变量'split'代表什么?它是否包括训练和测试分裂......?

2) 在第二行代码中,split.split 是什么意思?我想我对 StratifiedShuffleSplit 如何划分训练集和测试集以及为什么他需要创建这个“for”循环以创建strat_train_set 和strat_test_set 的大部分内容感到困惑。

谢谢,

格雷格

3个回答
split

是允许我们进行分层拆分的对象,并且split.split是拆分的对象方法/函数,称为拆分,可用于执行分层拆分。

根据您想要使用 n_split 参数拆分的数量,您可以拆分,因此是 for 循环。

'StratifiedShuffleSplit' 函数接受有关拆分需要如何进行的参数,并返回一个函数来进行拆分。

第一行中的“split”变量用于存储此函数。在 Python 中,函数/过程可以存储为变量。

'n_splits' 表示折叠的数量。“test_size”表示测试数据集在完整数据集中的比例。

当 n_splits>1 时,for 循环允许您迭代多个拆分。例如,如果 n_splits=2 和 test_size=0.2,数据集 'housing' 被分成两组(80% 训练和 20% 测试)

@格雷格罗森

我也和 OP 有类似的疑问,然后我浏览了 Scikit-Learn 的 GitHub 存储库。回购链接到讨论中的文件

并发现:

  1. split.split(housing, Housing['income_cat']):第一个拆分是 StratifiedShuffleSplit() 类的对象,即可以是您想要保留的任何名称,第二个拆分是此类中的函数(即指基类 BaseShuffleSplit() 的 split 函数,其用途是生成索引,将数据拆分为训练集和测试集。

  2. 上面的@SparkZeus最好地解释了使用循环的原因

快乐的建筑模型!