我正在运行机器学习分类算法。 数据已清理,标准化和平衡。
我试图在sklearn的RandomForestClassifier上运行网格搜索,以解决APS Scania Dataset的问题。
在用例中,我需要为分类中的每个错误指定不同的成本。为此,我有一个自定义评分功能,我想在超参数优化中使用它。
我的问题是,当我使用n_jobs = 1运行Grid或RandomSearchCV时,它花费的时间太长,但可以运行。当然,我想使用更多的处理能力。
如果我尝试将n_jobs值设置为大于1,如下面的代码所示,则会出现错误:
“ AttributeError:无法在<模块'主要'(内置)>上获取属性'negative_cost_metric'””
...
“ sklearn.externals.joblib.externals.loky.process_executor.BrokenProcessPool:任务无法反序列化。请确保该函数的参数都是可拾取的。”
在读取https://github.com/scikit-learn/scikit-learn/issues/12250和https://github.com/scikit-learn/scikit-learn/issues/12413之后,我尝试将函数分离到另一个文件中,这继续向我抛出错误:
“ UserWarning:无法清除临时文件夹”
如果您这次有什么问题的建议,我将不胜感激。
def cost_metric(y_true, y_pred):
cost_1 = -10
cost_2 = -500
tn, fp, fn, tp = confusion_matrix(y_true=y_true, y_pred=y_pred).ravel()
return (cost_1 * fp + cost_2 * fn)
#Data cleaning, other importations, undersampling, preparing X_train, X_test, y_train and y_test, etc.
RF=RandomForestClassifier()
n_jobs=4
custom_score_function = make_scorer(cost_metric)
opt = GridSearchCV(RF,param_grid=parameters, cv=3, scoring=custom_score_function, n_jobs=n_jobs, pre_dispatch=1*n_jobs, verbose=1)
opt.fit(X_train, y_train)
best = opt.best_estimator_
clf=clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
cost= cost_metric(y_test, y_pred)