SVC的网格搜索问题 - 如何排除故障?

时间:2017-07-11 13:26:00

标签: machine-learning scikit-learn classification svm

我正在努力寻找Support Vector classification的最佳超参数。到目前为止,Grid Search对于这样的任务工作得很好,但是对于SVC,它似乎到处都是墙。

只有少量C参数建议的最小尝试才能生效并产生结果:

param_grid = {
    'C' : [0.01, 0.1, 1, 10],
}
classifier = SVC()
grid_search = GridSearchCV(estimator=classifier, param_grid=param_grid, scoring='f1', 
                           error_score=0, n_jobs=-1, verbose=42)
grid_search.fit(data[0], np.ravel(data[1]))

同样,gammacoef0shrinking等其他参数不会产生任何问题。

然而,任何涉及搜索内核函数的东西似乎都在无限处理。即使只是添加另一个选择,也会导致Python占用所有可用的处理器,以完成一些不完整的不良工作(至少不会在10分钟左右)。

param_grid = {
    'C' : [0.01, 0.1, 1, 10],
    'kernel': ['rbf', 'linear'],
}

令我感到困惑的是它开始没问题,在第一分钟内产生了良好的输出,然后看起来似乎停止做任何事情,同时仍然使冷却器全速运转。详细输出如下所示:

Fitting 3 folds for each of 8 candidates, totalling 24 fits
[CV] kernel=rbf, C=0.01 ..............................................
[CV] kernel=rbf, C=0.01 ..............................................
[CV] kernel=rbf, C=0.01 ..............................................
[CV] kernel=linear, C=0.01 ...........................................

[...]/python3/lib/python3.5/site-packages/sklearn/metrics/classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples.
  'precision', 'predicted', average, warn_for)

[CV] ............... kernel=rbf, C=0.01, score=0.564932, total=   0.9s
[CV] kernel=linear, C=0.01 ...........................................
[CV] ............... kernel=rbf, C=0.01, score=0.574120, total=   0.8s
[CV] kernel=linear, C=0.01 ...........................................
[CV] ............... kernel=rbf, C=0.01, score=0.000000, total=   0.9s
[CV] kernel=rbf, C=0.1 ...............................................

[Parallel(n_jobs=-1)]: Done   1 tasks      | elapsed:    1.3s
[Parallel(n_jobs=-1)]: Done   2 tasks      | elapsed:    1.4s
[Parallel(n_jobs=-1)]: Done   3 tasks      | elapsed:    1.5s

[CV] ................ kernel=rbf, C=0.1, score=0.555556, total=   1.0s
[CV] kernel=rbf, C=0.1 ...............................................

[Parallel(n_jobs=-1)]: Done   4 tasks      | elapsed:    2.9s

[CV] ................ kernel=rbf, C=0.1, score=0.564932, total=   1.1s
[CV] kernel=rbf, C=0.1 ...............................................

[Parallel(n_jobs=-1)]: Done   5 tasks      | elapsed:    4.5s

[CV] ................ kernel=rbf, C=0.1, score=0.574120, total=   1.0s
[CV] kernel=linear, C=0.1 ............................................

[Parallel(n_jobs=-1)]: Done   6 tasks      | elapsed:    5.9s

njobs设置为任何其他数字会产生类似的结果:计算的一部分快速完成且没有抱怨,然后它似乎卡住并使用所有可用的CPU而没有任何明显的进展。

此外,只给出一个内核选择会产生不同的结果。虽然rbfsigmoid工作正常并在几秒钟内完成,polylinear显然会卡住。

我很茫然 - 这里有什么问题,如何有效地运行网格搜索?我的data由超过5000个实例组成,每个实例具有12个数字特征。这些类是0或1,分布相同。可能那太多了吗?如果是这样,为什么有些搜索工作得很好而且只有某些内核函数才会出现问题?

编辑看起来这是我正在使用的数据的问题。到目前为止,唯一有帮助的是对特征进行规范化(所有值都在0到1的范围内)。

现在,通常建议对支持向量方法进行规范化,因为它们不是规模不变的,所以无论如何我都是这样做的。但我认为它是一种提高性能的方法,而不是它工作的必要预防措施,就像在这种情况下似乎。

我现在能够解决这个问题,但我仍然很好奇是否有人知道数据可能出现什么问题以及如何将其提供给支持向量算法。

1 个答案:

答案 0 :(得分:1)

我使用了我的数据并且我修改了一些代码。它在Windows 8中为我运行以下代码。

<强>代码:

import pandas as pd
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC


if __name__=='__main__':

    data= pd.read_csv('Prior Decompo2.csv', header=None)
    X, y = data.iloc[0:, 0:26].values, data.iloc[0:,26].values

    param_grid = {'C' : [0.01, 0.1, 1, 10], 'kernel': ('rbf', 'linear')}
    classifier = SVC()
    grid_search = GridSearchCV(estimator=classifier, param_grid=param_grid, scoring='accuracy', n_jobs=-1, verbose=42)
    grid_search.fit(X,y)

更改#1:

我添加了if __name__=='__main__':

更改#2:

使用kernel的括号:

param_grid = {'C' : [0.01, 0.1, 1, 10], 'kernel': ('rbf', 'linear')}

重要提示:

'kernel': ['rbf', 'linear'],之后发布的代码中,您有一个根本不需要的逗号!

更改#3:

GridSearchCV内使用其他评分,例如: scoring='accuracy'

grid_search = GridSearchCV(estimator=classifier, param_grid=param_grid,scoring='accuracy', n_jobs=-1, verbose=42)

结果是:

enter image description here

您可以在图片中清楚地看到linearrbf都经过了测试。