我在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/