分层参数的含义

数据挖掘 神经网络 数据集 训练
2021-09-25 10:13:14

我正在训练神经网络,并试图将我的数据划分为训练集和测试集。我有很多输出类,其中一些只有 2 个示例,所以在这种情况下,我希望有 1 个训练示例和 1 个测试示例。根据我的阅读,这是使用stratify参数,但分层是什么意思?

我将我的数据分为训练和测试:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.1, random_state=42, stratify=y)

所以,据我了解,这分为两组:训练(90% 的数据)和测试(10% 的数据),但要确保每组中每个类至少有 1 个?

3个回答

stratify参数将保留目标在原始数据集中的比例,在训练和测试数据集中也是如此。

因此,如果您的原始数据集df的目标/标签为 [0,1,2],比例为 40:30:30。也就是说,对于每 100 个数据集,您可以分别找到目标 0,1 和 2 的 40、30 和 30 个观测值。

现在,当您使用 拆分此原始数据时train_test_split(x,y,test_size=0.1,stratify=y),这些方法会以 90:10 的比例返回训练和测试数据集。现在,在每个数据集中,目标/标签数据比例保留为 40:30:30,用于类 [0,1,2]。

通常,我们希望保留数据集的比例,以便更好地预测和重现结果

stratify参数询问您是否要在整个原始数据集中找到的训练集中和测试集中保留相同比例的类。

例如,如果整个原始数据集中有 100 个观测值,其中 80 个是类一个和 20 是类b并且您设置stratify = True.7 : .3 训练测试拆分,您将获得一个包含 56 个类示例的训练集一个和14个类的例子b.

简而言之,它确保拆分后的数据在训练数据和测试数据之间至少具有一定的相似性。假设您有 100 个癌症患者的二进制 (0,1) 数据集,并且您已将其分成 80% 作为 train_data 和 20% 作为 test_data。默认情况下,在 test_data 中,你得到 15 个值作为“1”,5 个值作为 0,所以这将是一个相当有偏差的数据集。为了避免这种情况,我们使用“分层”来提供训练和测试数据集之间的一组公共关系。(例如:11个值作为“1”,9个值作为“0”)