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_validation
和 y_validation
不相关。我错过了什么?
编辑:
已经有一些很好的答案,但我只想澄清一下。 x_validation
和 y_validation
是否保证顺序正确且彼此相同。显然,您可以向其中任何一个添加一行,然后把事情搞砸,但是是否有一个底层索引意味着顺序得以保留?我来自非 python 背景,有时您无法保证 SQL 列之类的顺序。
您绝对希望 x_validation
与 y_validation
相关,即对应于原始数据集中的相同行。
例如如果验证从输入 x 中获取第 1、3、7 行,则您需要 x_validation
和 y_validation
中的第 1、3、7 行。
train_test_split
函数将数据集划分为两组特征(x
)和相应标签(y
)的想法。所以你想要并要求
len(x_validation) == len(y_validation)
和
len(x_test) == len(y_test)
看看你问题的其他部分可能会引起混淆:
y_validation == 0
将生成一个 True
和 False
值的布尔掩码,您可以使用这些值来 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 xtrain
、ytrain
或 ytrain
中这些索引处的值无论你通过什么。看看这个简单的演示:
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]
如您所见,第二行是第一行的平方,这意味着顺序得以保留。
我正在尝试理解 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_validation
和 y_validation
不相关。我错过了什么?
编辑:
已经有一些很好的答案,但我只想澄清一下。 x_validation
和 y_validation
是否保证顺序正确且彼此相同。显然,您可以向其中任何一个添加一行,然后把事情搞砸,但是是否有一个底层索引意味着顺序得以保留?我来自非 python 背景,有时您无法保证 SQL 列之类的顺序。
您绝对希望 x_validation
与 y_validation
相关,即对应于原始数据集中的相同行。
例如如果验证从输入 x 中获取第 1、3、7 行,则您需要 x_validation
和 y_validation
中的第 1、3、7 行。
train_test_split
函数将数据集划分为两组特征(x
)和相应标签(y
)的想法。所以你想要并要求
len(x_validation) == len(y_validation)
和
len(x_test) == len(y_test)
看看你问题的其他部分可能会引起混淆:
y_validation == 0
将生成一个 True
和 False
值的布尔掩码,您可以使用这些值来 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 xtrain
、ytrain
或 ytrain
中这些索引处的值无论你通过什么。看看这个简单的演示:
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]
如您所见,第二行是第一行的平方,这意味着顺序得以保留。