我在scikit-learn的stratify函数中的train_test_split()参数有问题。这是一个虚拟示例,具有相同的问题,该问题随机出现在我的数据上:

from sklearn.model_selection import train_test_split
a = [1, 0, 0, 0, 0, 0, 0, 1]
train_test_split(a, stratify=a, random_state=42)

返回:
[[1, 0, 0, 0, 0, 1], [0, 0]]

它不应该在测试子集中也选择“1”吗?从我希望train_test_split()stratify一起工作的方式来看,它应该返回类似以下内容的内容:
[[1, 0, 0, 0, 0, 0], [0, 1]]

某些值random_state会发生这种情况,而其他值会正确地起作用。但是我每次必须分析数据时都无法搜索“正确的”值。

我有python 2.7和scikit-learn 0.18。

最佳答案

这个问题是在8个月前提出的,但我想一个答案将来可能仍然对读者有帮助。

使用stratify参数时,train_test_split实际上依赖StratifiedShuffleSplit函数进行拆分。如您在documentation中所见,StratifiedShuffleSplit确实旨在通过保留每个类的样本百分比来进行拆分,这与您期望的一样。

问题是,在您的示例中,25%(8个样本中的2个)为1s,但是样本大小不足以使您看到此比例反射(reflect)在测试集上。您在这里有两个选择:

A. 使用test_size选项增加测试集的大小,该选项默认为0.25,例如0.5。在这种情况下,一半的样本将成为测试集,您会看到其中25%(即四分之一)是1。

>>> a = [1, 0, 0, 0, 0, 0, 0, 1]
>>> train_test_split(a, stratify=a, random_state=42, test_size=0.5)
[[1, 0, 0, 0], [0, 0, 1, 0]]

B. 请将test_size保留为默认值,并增加设置的a的大小,以便其25%的样本至少等于4个元素。包含16个或更多样本的a将为您完成此操作。
>>> a = [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1]
>>> train_test_split(a, stratify=a, random_state=42)
[[0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0]]

希望能有所帮助。

关于python - sklearn的train_test_split中的"Stratify"参数无法正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39856729/

10-12 18:57