我正在尝试对大约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时的一个已知问题。
引用the note from Using a pool of workers文档中的multiprocessing
部分:
注意:此程序包中的功能要求子项可以导入__ main__模块。这在编程指南中有所涉及,但值得在此指出。这意味着某些示例(例如multiprocessing.pool.Pool示例)在交互式解释器中不起作用。
另见multiprocessing Programming Guidelines。
顺便说一句,我没有得到你需要用你的代码完成的任务。不使用GridSearchCV
与n_jobs=5
解决您的问题(并大大简化您的代码)?