sklearn - 在多次运行中保存 train_test_split 分割/状态?

Aci*_*lah 1 python pandas scikit-learn

Python、pandas、jupyter、scikit-learn。

我需要:

  • 对数据集进行 n 个不同的分割。
  • 做一些事情以便以后能够在另一个笔记本/脚本中重现它们中的任何一个。
  • 优雅的方式会很好。

现在我正在使用 sklearn train_test_split,但使用替代方案也可以。如果我理解正确的话 random_state 参数可以按以下方式使用:

n = 10**6
while n > 0:
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state = n)

    #whatever I'm going to to with this split 
    n-=1
Run Code Online (Sandbox Code Playgroud)

然后我希望能够重现分裂。我可以转储模型以在另一台笔记本上重现它们吗?这有效吗?

UPD 我根据经验找到了正确的答案。(请指导我是否有特定的方法来回答您自己的问题)。

火车测试分割可以作为模型转储/加载。

joblib.dump(train_test_split, path)
my_train_test_split = joblib.load(path)
Run Code Online (Sandbox Code Playgroud)

对于多个数据集。我在一个循环中在两个不同的数据集上使用它两次,传递唯一的随机状态。我能够使用加载的模型重现每个数据集的分割。这就是我所需要的。

pim*_*314 5

这正是随机状态参数的用途。如果您training_test_split以相同的随机状态调用相同的数据集,那么您每次都会获得相同的分割。为了向自己证明这一点,您可以编写一个简单的脚本来检查

import numpy as np
from sklearn.model_selection import train_test_split

X = np.arange(25)
rs = 42
train, test = train_test_split(X,
                               test_size=0.3,
                               random_state=rs)
for i in range(10):
    new_train, new_test = train_test_split(X,
                                           test_size=0.3,
                                           random_state=rs)
    print(np.all(train == new_train), np.all(test == new_test)) 
Run Code Online (Sandbox Code Playgroud)

输出:

(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
Run Code Online (Sandbox Code Playgroud)