方法“ train_test_split”(scikit Learning)中的参数“分层”

我试图使用 train_test_split从软件包 scikit 学习,但我有麻烦与参数 stratify。以下是密码:

from sklearn import cross_validation, datasets


X = iris.data[:,:2]
y = iris.target


cross_validation.train_test_split(X,y,stratify=y)

然而,我一直遇到以下问题:

raise TypeError("Invalid parameters passed: %s" % str(options))
TypeError: Invalid parameters passed: {'stratify': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}

有人知道是怎么回事吗? 下面是函数文档。

[...]

分层 : 类似于数组或无(默认为无)

如果不是“无”,则以分层方式拆分数据,将其用作标签数组。

新的版本0.17: 分层 分裂

[...]

237004 次浏览

尝试运行这个代码,它“只是工作”:

from sklearn import cross_validation, datasets


iris = datasets.load_iris()


X = iris.data[:,:2]
y = iris.target


x_train, x_test, y_train, y_test = cross_validation.train_test_split(X,y,train_size=.8, stratify=y)


y_test


array([0, 0, 0, 0, 2, 2, 1, 0, 1, 2, 2, 0, 0, 1, 0, 1, 1, 2, 1, 2, 0, 2, 2,
1, 2, 1, 1, 0, 2, 1])

这个 stratify参数进行分割,以便生成的样品中值的比例与提供给参数 stratify的值的比例相同。

例如,如果变量 y是一个值为 01的二进制分类变量,并且有25% 的0和75% 的1,那么 stratify=y将确保你的随机分割有25% 的 0和75% 的 1

Scikit-Learning 只是告诉你它不认可“分层”论点,并不是说你使用的不正确。这是因为参数是在0.17版本中添加的,如您引用的文档所示。

所以你只需要更新 Scikit-Learning。

对于通过谷歌来到这里的未来的我:

train_test_split 现在在 model_selection中,因此:

from sklearn.model_selection import train_test_split


# given:
# features: xs
# ground truth: ys


x_train, x_test, y_train, y_test = train_test_split(xs, ys,
test_size=0.33,
random_state=0,
stratify=ys)

是使用它的方法。设置 random_state是可取的重现性。

在这种情况下,分层意味着 train _ test _ split 方法返回与输入数据集具有相同比例的类标签的训练和测试子集。

我可以给出的答案是,分层保留了目标列中数据分布的比例,并在 train _ test _ split 中描述了相同比例的分布。 例如,如果问题是一个二进制分类问题,目标列的比例为80% = 是的,20% = 没有。由于目标列中的 是的“不”多4倍,通过分裂成训练和没有分层的测试,我们可能会遇到只有 是的落入我们的训练集,并且所有的 “不”落入我们的测试集的麻烦。(例如,训练集的目标列中可能没有 “不”)

因此,通过分层,训练设备的目标列具有 80% 的答案是肯定的,20% 的答案是否定的,而 测试装置的目标列也分别具有 80% 的答案是肯定的,20% 的答案是否定的

因此,Stratify 将 目标(标签)均匀地分布在列车和测试集中——就像它分布在原始数据集中一样。

from sklearn.model_selection import train_test_split
X_train, y_train, X_test, y_test = train_test_split(features, target, test-size = 0.25, stratify = target, random_state = 43)

分层 = 目标,随机 _ 状态 = 43两者的工作原理不同。