GridSearchCV 在 windows 上冻结任何 n_jobs

GridSearchCV freezes on windows with any n_jobs

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

我给它提供的数据: float64 numpy 形状数组,从 (2448, 1024) 变化到 (7956, 1024)

我已经尝试过的事情:

我无法按照 https://github.com/dmlc/xgboost/issues/2163#issuecomment-314524070 中的建议 运行 以下代码,因为我 运行 在 Windows.[=20 上使用我的代码=]

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)

尝试在 __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 任务管理器,看看 运行ning 时发生了什么。查看您的 CPU 百分比、RAM 并查看 windows 进程。通常你想看到的是你的 CPU 变得非常高,你应该在进程列表中看到几个名为 Python 的进程。它可能会冻结,因为您使用完整的 CPU.

另一种可能性是 n_jobs 尚未在 f1 计分中实现。您可以尝试在没有 n_jobs 语句的情况下 运行ning 您的代码,如下所示:

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)

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