GridSearchCV在具有任何n_jobs的Windows上冻结

时间:2018-10-06 23:58:37

标签: python windows machine-learning scikit-learn svm

我现在在scikit学习库中使用GridSearchCV方法遇到麻烦。我已经为此苦苦挣扎了一个星期,而且似乎还无法解决。调用它以优化C参数上的线性SVM时,它将保持冻结状态。 奇怪的是,它不仅在分配n_jobs = -1时发生,而且在分配1个n_jobs时也会发生,所以我认为多处理并不是特别的问题。此外,当我给它输入一个形状为X的数组(2448,1024)时,它可以正常工作,但是当我给它输入一个形状为(5202,1024)的数组时,它会完全冻结。

我正在向其提供数据: float64 numpy数组,其形状从可以正常工作的(2448,1024)到(7956,1024)不等

我已经尝试过的事情:

由于我正在Windows上运行代码,因此无法按照https://github.com/dmlc/xgboost/issues/2163#issuecomment-314524070中的建议运行以下代码。

from multiprocessing import pool, get_context
forkserver = get_context('forkserver')
p = forkserver.Pool()

要注意的事情:我正在为它配备f1函数,而不是默认精度,这可能是一个问题,如在这些线程中所见:

以下是一些代码段:

 from sklearn.externals.joblib import parallel_backend

 scaler = StandardScaler()
 X = scaler.fit_transform(fv_train.data) #traininig samples
 y = fv_train.axes[0] #class labels
 X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size = 0.1, train_size = 0.9)


clf = SVC(kernel = 'linear', probability=True)
scoring = ['f1']
C_range = np.linspace(start=1000, stop=10000, num=4, endpoint = True)
param_grid = dict(C = C_range)
grid = GridSearchCV(clf, param_grid = param_grid, scoring = scoring, cv = 3,
                    refit = 'f1', verbose = 42, n_jobs=-1, pre_dispatch=3)
with parallel_backend('threading'):
    grid.fit(X_train, y_train)

2 个答案:

答案 0 :(得分:0)

尝试在__name__ == '__main__'中指定您的代码,从Windows命令行运行它,但不要使用parallel_backend语句。用n_jobs指定GridSearhCV应该自己处理所有多处理。

clf = SVC(kernel = 'linear', probability=True)
scoring = ['f1']
param_grid = {'C': np.linspace(start=1000, stop=10000, num=4, endpoint = True)}
grid = GridSearchCV(clf, param_grid = param_grid, scoring = scoring, cv = 3,
                refit = 'f1', verbose = 42, n_jobs=-1, pre_dispatch=3)
grid.fit(X_train, y_train)

打开Windows任务管理器,看看运行时会发生什么。查看您的CPU百分比,您的RAM和Windows进程。通常,您希望看到的是CPU越来越高,并且应该在进程列表中看到几个称为Python的进程。可能是冻结的,因为您使用了完整的CPU。

另一种可能性是尚未为f1得分实施n_jobs。您可以尝试在不使用n_jobs语句的情况下运行代码,如下所示:

clf = SVC(kernel = 'linear', probability=True)
scoring = ['f1']
param_grid = {'C': np.linspace(start=1000, stop=10000, num=4, endpoint = True)}
grid = GridSearchCV(clf, param_grid = param_grid, scoring = scoring, cv = 3,
                refit = 'f1', verbose = 42, pre_dispatch=3)
grid.fit(X_train, y_train)

答案 1 :(得分:0)

问题在于参数C的值太大。我自己也遇到过一模一样的问题,通过减小C解决了。注意C是正则化参数,这么大的值绝对没有意义. (参考https://stats.stackexchange.com/questions/31066/what-is-the-influence-of-c-in-svms-with-linear-kernel)。并且似乎随着 C 的增加,计算时间呈指数增长。 事实上,根据我的经验,大于 10 的值会持续降低模型的性能。