Python GridSearchCV在具有任何n_作业的windows上冻结
我目前在使用scikit学习库中的GridSearchCV方法时遇到问题。我已经挣扎了一个星期了,似乎还没想好。当调用它来优化C参数上的线性SVM时,它会一直冻结。 奇怪的是,它不仅在分配n_jobs=-1时发生,而且在分配1个n_jobs时也会发生,所以我不认为多处理是特别的问题。此外,当我给它输入一个X形状数组(24481024)时,它工作正常,但当我给它输入一个形状数组(52021024)时,它完全冻结 我向它提供的数据:float64 numpy数组,形状从(24481024)到(79561024)不等 我已经尝试过的事情:Python GridSearchCV在具有任何n_作业的windows上冻结,python,windows,machine-learning,scikit-learn,svm,Python,Windows,Machine Learning,Scikit Learn,Svm,我目前在使用scikit学习库中的GridSearchCV方法时遇到问题。我已经挣扎了一个星期了,似乎还没想好。当调用它来优化C参数上的线性SVM时,它会一直冻结。 奇怪的是,它不仅在分配n_jobs=-1时发生,而且在分配1个n_jobs时也会发生,所以我不认为多处理是特别的问题。此外,当我给它输入一个X形状数组(24481024)时,它工作正常,但当我给它输入一个形状数组(52021024)时,它完全冻结 我向它提供的数据:float64 numpy数组,形状从(24481024)到(795
- 使用多线程,如中所建议
- 将n_作业的数量减少到1
- 分配少量预分配作业。它开始计算前几行冗长的行,表示它适合C,然后冻结
- 按照中的建议,添加if
块\uuuuu name\uuuuu=='\uuuuu main\uuuuuu'
- 从终端运行代码,而不是从我一直在工作的Jupyter笔记本运行代码
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)
尝试在
\uuuu name\uuu=='\uuuuu main\uuuu'
中指定代码,从windows命令行运行它,但不使用parallel\u backend语句。使用n_作业
指定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
另一种可能是,n_作业尚未用于f1评分。您可以尝试在不使用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)
谢谢我尝试了第一个建议,还将C范围更改为
C_range=np.logspace(-1,2,4,endpoint=True,base=10)
,现在它似乎可以工作了,不过仍然需要很多时间(~2小时)。任务管理器显示CPU为75%,RAM为1GB。您可以验证是否有多个Python进程(任务管理器->进程->按CPU排序->应该有多个Python进程)。如果工作正常,您必须加快速度,那么您唯一能做的就是减少参数网格的大小或交叉验证的数量(但它们似乎合理),或者找到一台更快的计算机(可能是AWS或其他平台上的云计算机)。是的,我确实列出了许多Python进程(大约6或7个)。我还考虑过减少交叉验证中的k-折叠次数,但事实上,它已经比我想要的要低很多(并且比推荐的要低),但由于这个问题,我没有其他选择。我没有听说过AWS,我会去看看,但我正试图将我的培训上传到谷歌云引擎。问题是,我需要这些结果马上,我真的没有时间去学习如何使用它。谢谢你的帮助!