scikit-learn train_test_split 是否保留关系?

Does scikit-learn train_test_split preserve relationships?

我正在尝试理解 this 代码。我不明白你怎么做:

x_validation, x_test, y_validation, y_test = 
  train_test_split(x_validation_and_test, y_validation_and_test...

你以后可以做:

(len(x_validation[y_validation == 0])

肯定 train_test_split 意味着 x_validationy_validation 不相关。我错过了什么?

编辑: 已经有一些很好的答案,但我只想澄清一下。 x_validationy_validation 是否保证顺序正确且彼此相同。显然,您可以向其中任何一个添加一行,然后把事情搞砸,但是是否有一个底层索引意味着顺序得以保留?我来自非 python 背景,有时您无法保证 SQL 列之类的顺序。

您绝对希望 x_validationy_validation 相关,即对应于原始数据集中的相同行。 例如如果验证从输入 x 中获取第 1、3、7 行,则您需要 x_validationy_validation 中的第 1、3、7 行。

train_test_split 函数将数据集划分为两组特征(x)和相应标签(y)的想法。所以你想要并要求

len(x_validation) == len(y_validation)

len(x_test) == len(y_test)

看看你问题的其他部分可能会引起混淆:

y_validation == 0

将生成一个 TrueFalse 值的布尔掩码,您可以使用这些值来 select 只有来自任何数据帧的具有相同长度的那些行,所以在这种情况下它也将与 x_validataion.

一起使用

顺便说一句,

len(x_validation[y_validation == 0])

计算 class 0 的示例数量似乎有点令人困惑。我会去

(y_validation == 0).sum()

我自己,然后你可以将 % negative 计算写为

100*(y_validation == 0).sum()/len(y_validation)

这对我来说更整洁。

train_test_split 从您的数据长度中获取 n 个随机索引,returns xtrainytrainytrain 中这些索引处的值无论你通过什么。看看这个简单的演示:

import numpy as np
from sklearn.model_selection import train_test_split

data = np.random.randint(0, 10, 15) 
target = data**2
indices = np.arange(15)

xtrain, xtest, ytrain, ytest, indicestrain, indicestest = \
    train_test_split(data, target, indices)

print(data)
print(target)
print(indices)
[7 7 4 1 1 3 1 6 8 2 2 1 9 9 9] # random val between 0 and 10
[49 49 16  1  1  9  1 36 64  4  4  1 81 81 81] # their squared values
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]  # the index in the original array (data)

现在,从中随机抽取一些索引,看看它们是否保持相关:

xtrain, xtest, ytrain, ytest, indicestrain, indicestest = \
    train_test_split(data, target, indices)

print(xtrain)
print(ytrain)
print(indicestrain)
[9 9 2 1 8 2 4 7 1 6 7]
[81 81  4  1 64  4 16 49  1 36 49]
[12 14 10 11  8  9  2  1  3  7  0]

如您所见,第二行是第一行的平方,这意味着顺序得以保留。