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)
我已经尝试过的事情:
- 使用多线程,如
中所建议
- 正在将 n_jobs 的数量减少到 1
- 分配少量 pre_dispatch 个工作。它开始计算前几行冗长的代码,表明它适合的 C,然后冻结。
- 添加 if
__name__ == '__main__'
块,如 https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-37311446 中所建议
- 运行 来自终端的代码,而不是来自我一直在工作的 Jupyter Notebook 的代码
我无法按照 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 函数拟合它,而不是默认精度函数,这可能是个问题,如这些线程中所示:
- https://github.com/scikit-learn/scikit-learn/issues/5115#issue-100597083
- https://github.com/scikit-learn/scikit-learn/issues/2889#issue-28205288
以下是一些代码片段:
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 的值会持续降低模型的性能。
我目前在使用 scikit 学习库中的 GridSearchCV 方法时遇到问题。我已经为此苦苦挣扎了一个星期,而且似乎还无法解决。当调用它来优化 C 参数上的线性 SVM 时,它会一直冻结。 奇怪的是,它不仅在分配 n_jobs=-1 时发生,而且在分配 1 n_jobs 时也会发生,所以我认为多处理不是特别的问题。此外,当我为它提供形状为 (2448, 1024) 的 X 数组时它工作正常,但是当我为它提供形状为 (5202, 1024) 的数组时它完全冻结。
我给它提供的数据: float64 numpy 形状数组,从 (2448, 1024) 变化到 (7956, 1024)
我已经尝试过的事情:
- 使用多线程,如 中所建议
- 正在将 n_jobs 的数量减少到 1
- 分配少量 pre_dispatch 个工作。它开始计算前几行冗长的代码,表明它适合的 C,然后冻结。
- 添加 if
__name__ == '__main__'
块,如 https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-37311446 中所建议
- 运行 来自终端的代码,而不是来自我一直在工作的 Jupyter Notebook 的代码
我无法按照 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 函数拟合它,而不是默认精度函数,这可能是个问题,如这些线程中所示:
- https://github.com/scikit-learn/scikit-learn/issues/5115#issue-100597083
- https://github.com/scikit-learn/scikit-learn/issues/2889#issue-28205288
以下是一些代码片段:
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 的值会持续降低模型的性能。