使用多处理-Pool-with -sklearn-,代码运行但核心不显示任何工作

问题描述 投票:3回答:1

我正在尝试对大约31 000行和1000列进行一些机器学习。这需要很长时间,所以我认为我可以并行化工作,所以我把它变成了一个功能,并尝试在我的Windows 10上使用jupyter笔记本上的工具。但它只是工作,当我在任务管理器上查看我的核心时,他们不工作。代码有问题还是不支持?

from sklearn.model_selection import train_test_split
X_dev, X_test, y_dev, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import Imputer
from sklearn.metrics import accuracy_score
from multiprocessing import Pool
from datetime import datetime as dt

def tree_paralel(x):
    tree = DecisionTreeClassifier(criterion="gini", max_depth= x, random_state=1)  
    accuracy_ = []
    for train_idx, val_idx in kfolds.split(X_dev, y_dev):

        X_train, y_train, = X_dev.iloc[train_idx], y_dev.iloc[train_idx]
        X_val, y_val = X_dev.iloc[val_idx], y_dev.iloc[val_idx] 

        X_train = pd.DataFrame(im.fit_transform(X_train),index = X_train.index)
        X_val = pd.DataFrame(im.transform(X_val), index = X_val.index)
        tree.fit(X_train, y_train)
        y_pred = tree.predict(X_val)
        accuracy_.append(accuracy_score(y_val, y_pred))
    print("This was the "+str(x)+" iteration", (dt.now() - start).total_seconds())
    return accuracy_

然后使用多处理工具:

kfolds = KFold(n_splits=10)
accuracy = []
im = Imputer()

p = Pool(5)

input_ = range(1,11)
output_ = []
start = dt.now()
for result in p.imap(tree_paralel, input_):
    output_.append(result)
p.close()
print("Time:", (dt.now() - start).total_seconds())
python python-3.x machine-learning scikit-learn python-multiprocessing
1个回答
0
投票

这是使用交互式python时的一个已知问题。 引用the note from Using a pool of workers文档中的multiprocessing部分:

注意:此程序包中的功能要求子项可以导入__ main__模块。这在编程指南中有所涉及,但值得在此指出。这意味着某些示例(例如multiprocessing.pool.Pool示例)在交互式解释器中不起作用。

另见multiprocessing Programming Guidelines

顺便说一句,我没有得到你需要用你的代码完成的任务。不使用GridSearchCVn_jobs=5解决您的问题(并大大简化您的代码)?

© www.soinside.com 2019 - 2024. All rights reserved.