Python,pandas,jupyter,scikit-learn。
我需要:
现在我正在使用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)
对于多个数据集。我在一个循环中,在两个不同的数据集上使用它两次,传递独特的随机状态。并且我能够使用加载的模型为每个数据集重现拆分。这就是我所需要的一切。
答案 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
元组与原始完整数据集一起应该没问题。
此外,列出所有正在使用的软件包的确切版本号是明智的。