Scikit learn scikit学习:训练测试分割,我能确保不同数据集上的分割相同吗

Scikit learn scikit学习:训练测试分割,我能确保不同数据集上的分割相同吗,scikit-learn,Scikit Learn,我知道train_test_split方法将数据集分割为随机的train和test子集。使用random_state=int可以确保每次调用该方法时在此数据集上都有相同的拆分 我的问题略有不同 我有两个数据集,A和B,它们包含相同的示例集,这些示例在每个数据集中出现的顺序也是相同的。但它们的关键区别在于,每个数据集中的exmaples使用不同的功能集 我想测试A中使用的功能是否比B中使用的功能带来更好的性能。因此,我想确保当我在A和B上调用train_test_split时,我可以在两个数据集上

我知道train_test_split方法将数据集分割为随机的train和test子集。使用random_state=int可以确保每次调用该方法时在此数据集上都有相同的拆分

我的问题略有不同

我有两个数据集,A和B,它们包含相同的示例集,这些示例在每个数据集中出现的顺序也是相同的。但它们的关键区别在于,每个数据集中的exmaples使用不同的功能集

我想测试A中使用的功能是否比B中使用的功能带来更好的性能。因此,我想确保当我在A和B上调用train_test_split时,我可以在两个数据集上获得相同的分割,以便比较有意义

这可能吗?我是否只需要确保两个数据集的两个方法调用中的随机_状态相同


感谢查看
train\u test\u split
函数的代码,它会在每次调用时在函数内部设置随机种子。因此,每次都会导致相同的拆分。我们可以很简单地检查这一点

X1 = np.random.random((200, 5))
X2 = np.random.random((200, 5))
y = np.arange(200)

X1_train, X1_test, y1_train, y1_test = model_selection.train_test_split(X1, y,
                                                                        test_size=0.1,
                                                                        random_state=42)
X2_train, X2_test, y2_train, y2_test = model_selection.train_test_split(X1, y,
                                                                        test_size=0.1,
                                                                        random_state=42)

print np.all(y1_train == y2_train)
print np.all(y1_test == y2_test)
哪些产出:

True
True
这很好!解决此问题的另一种方法是在所有功能上创建一个训练和测试分割,然后在训练之前分割功能。但是,如果您处于一种奇怪的情况,需要同时执行这两项操作(有时使用相似性矩阵,您不希望在训练集中测试功能),则可以使用
StratifiedShuffleSplit
函数返回属于每个集合的数据的索引。例如:

n_splits = 1 
sss = model_selection.StratifiedShuffleSplit(n_splits=n_splits, 
                                             test_size=0.1,
                                             random_state=42)
train_idx, test_idx = list(sss.split(X, y))[0]

是的,随机状态就足够了

>>> X, y = np.arange(10).reshape((5, 2)), range(5)
>>> X2 = np.hstack((X,X))
>>> X_train, X_test, _, _ = train_test_split(X,y, test_size=0.33, random_state=42)
>>> X_train2, X_test2, _, _ = train_test_split(X2,y, test_size=0.33, random_state=42)
>>> X_train
array([[4, 5],
       [0, 1],
       [6, 7]])
>>> X_train2
array([[4, 5, 4, 5],
       [0, 1, 0, 1],
       [6, 7, 6, 7]])
>>> X_test
array([[2, 3],
       [8, 9]])
>>> X_test2
array([[2, 3, 2, 3],
       [8, 9, 8, 9]])

如上所述,您可以使用随机状态参数。 但是,如果您想全局生成相同的结果,就意味着要为您将来可以使用的所有调用设置随机状态

np.random.seed('Any random number ')

由于
sklearn.model\u selection.train\u test\u split(*数组,**选项)
接受数量可变的参数,您可以这样做:

A_train, A_test, B_train, B_test, _, _ =  train_test_split(A, B, y, 
                                                           test_size=0.33,
                                                           random_state=42)

该选项是保存从train_test_split返回的索引,然后使用它们。