sklearn - 在multiply运行中保存train_test_split分裂/状态?

时间:2017-12-18 16:28:10

标签: 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

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

UPD 我凭经验找到了正确的答案。 (请告诉我是否有特定方式回答您自己的问题)。

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

joblib.dump(train_test_split, path)
my_train_test_split = joblib.load(path)

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

2 个答案:

答案 0 :(得分:2)

这正是随机状态参数的用途。如果在具有相同随机状态的同一数据集上调用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)) 

<强>输出:

(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)
(True, True)

答案 1 :(得分:0)

你可以添加

import cpickle as pkl # module for serialization

并在循环中

# put all the content in a dict
tostore=dict(zip(['X_train', 'X_test', 'y_train', 'y_test' ], [train, test, y_train, y_test))
# open a file with context manager
with open('REP'+str(n),'wb') as filestore: 
    pkl.dump(tostore,filestore) # write dict to file

这应该保证所有必需的训练/测试集的持久性。 您可以使用pkl.load()重新加载数据。

但是,我建议你转储训练好的模型,因为原则上每个模型可能依赖于其他随机数生成器而不是你期望的(取决于你使用的ML框架)。如果是sklearn,则应该在需要时安全地设置随机状态。

理想情况下,fitted models, randomstate元组与原始完整数据集一起应该没问题。

此外,列出所有正在使用的软件包的确切版本号是明智的。