Linux (armv7l) 上的多处理池中的 Scikit-learn train_test_split 不起作用
Scikit-learn train_test_split inside multiprocessing pool on Linux (armv7l) does not work
当在 Rasbperry Pi 3 上 运行ning Python 时,我在多处理池中使用 train_test_split 遇到了一些奇怪的行为。
我有这样的东西:
def evaluate_Classifier(model,Features,Labels,split_ratio):
X_train, X_val, y_train, y_val = train_test_split(Features,Labels,test_size=split_ratio)
...
iterations=500
pool = multiprocessing.Pool(4)
results = [pool.apply_async(evaluate_Classifier, args=(w,Current_Features,Current_Labels,0.35)) for i in range(iterations)]
output = [p.get() for p in results]
pool.close()
pool.join()
现在上面的代码在 Windows 7 Python 3.5.6 上完美运行,事实上,4 个线程中的每一个都会有一个差异 train/test 拆分。
然而,当我 运行 它在 Raspberry Pi 3 (scikit-learn 0.19.2) 上时,似乎 4 个线程以完全相同的方式拆分数据,因此所有线程产生完全相同的结果。接下来的 4 个线程将再次拆分数据(这次不同),但它们之间的方式仍然完全相同,依此类推....
我什至尝试将 train_test_split 与 random_state=np.random.randint 一起使用,但它没有帮助。
知道为什么这在 Windows 上有效但在 raspberry Pi 3 上它似乎不能正确并行化吗?
非常感谢
与其设置随机状态,不如在拆分之前尝试打乱数据。您可以通过设置参数来做到这一点:shuffle=True。
shuffle 默认打开,所以即使 shuffle=True 也没有什么区别。
如果可能的话,我还想在并行函数中拆分数据。
实际上,一些挖掘我发现这是因为 Windows 和 Linux 如何处理子进程的多线程和资源等等。
上述问题的最佳解决方案是执行以下操作:
def evaluate_Classifier(model,Features,Labels,split_ratio,i):
X_train, X_val, y_train, y_val = train_test_split(Features,Labels,test_size=split_ratio,random_state=i)
...
iterations=500
pool = multiprocessing.Pool(4)
results = [pool.apply_async(evaluate_Classifier, args=(w,Current_Features,Current_Labels,0.35, i)) for i in range(iterations)]
output = [p.get() for p in results]
pool.close()
pool.join()
这会很有效,为了在代码的不同运行之间增加一点随机性,我们可以在函数之外使用一些随机数生成器而不是 i
当在 Rasbperry Pi 3 上 运行ning Python 时,我在多处理池中使用 train_test_split 遇到了一些奇怪的行为。
我有这样的东西:
def evaluate_Classifier(model,Features,Labels,split_ratio):
X_train, X_val, y_train, y_val = train_test_split(Features,Labels,test_size=split_ratio)
...
iterations=500
pool = multiprocessing.Pool(4)
results = [pool.apply_async(evaluate_Classifier, args=(w,Current_Features,Current_Labels,0.35)) for i in range(iterations)]
output = [p.get() for p in results]
pool.close()
pool.join()
现在上面的代码在 Windows 7 Python 3.5.6 上完美运行,事实上,4 个线程中的每一个都会有一个差异 train/test 拆分。
然而,当我 运行 它在 Raspberry Pi 3 (scikit-learn 0.19.2) 上时,似乎 4 个线程以完全相同的方式拆分数据,因此所有线程产生完全相同的结果。接下来的 4 个线程将再次拆分数据(这次不同),但它们之间的方式仍然完全相同,依此类推....
我什至尝试将 train_test_split 与 random_state=np.random.randint 一起使用,但它没有帮助。
知道为什么这在 Windows 上有效但在 raspberry Pi 3 上它似乎不能正确并行化吗?
非常感谢
与其设置随机状态,不如在拆分之前尝试打乱数据。您可以通过设置参数来做到这一点:shuffle=True。
shuffle 默认打开,所以即使 shuffle=True 也没有什么区别。 如果可能的话,我还想在并行函数中拆分数据。
实际上,一些挖掘我发现这是因为 Windows 和 Linux 如何处理子进程的多线程和资源等等。 上述问题的最佳解决方案是执行以下操作:
def evaluate_Classifier(model,Features,Labels,split_ratio,i):
X_train, X_val, y_train, y_val = train_test_split(Features,Labels,test_size=split_ratio,random_state=i)
...
iterations=500
pool = multiprocessing.Pool(4)
results = [pool.apply_async(evaluate_Classifier, args=(w,Current_Features,Current_Labels,0.35, i)) for i in range(iterations)]
output = [p.get() for p in results]
pool.close()
pool.join()
这会很有效,为了在代码的不同运行之间增加一点随机性,我们可以在函数之外使用一些随机数生成器而不是 i