【发布时间】:2017-12-15 14:18:23
【问题描述】:
我正在尝试为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]))
同样,gamma、coef0 或 shrinking 等其他参数不会产生任何问题。
但是,任何涉及搜索内核函数的事情似乎都在无限地进行。即使只是添加一个其他选项也会导致 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 没有任何明显的进展。
此外,只给一个内核选择会产生不同的结果。虽然rbf 和sigmoid 工作正常并在几秒钟内完成,但poly 和linear 显然卡住了。
我不知所措 - 这里有什么问题,如何有效地运行网格搜索?我的data 包含超过 5000 个实例,每个实例有 12 个数字特征。类别为 0 或 1,均等分布。是不是太过分了?如果是这样,为什么有些搜索工作得很好,而问题只出现在某些内核函数上?
编辑 看来这是我正在使用的数据的问题。到目前为止,唯一有帮助的是规范化特征(所有值都在 0 到 1 的范围内)。
现在,通常建议对支持向量方法进行归一化,因为它们不是尺度不变的,所以无论如何我都会这样做。但我认为它是一种提高性能的方法,而不是它工作的必要预防措施,就像在这种情况下一样。
我现在可以处理这个问题,但我仍然很好奇是否有人知道数据可能出了什么问题,以及如何将其提供给支持向量算法。
【问题讨论】:
-
你的数据量不是很大,所以应该不是问题。你的数据是可分离的吗?这些特征是否正确地捕捉到了这种可分离性?如果不是,那么对于大型
Cs 来说,这将是有道理的,它需要花费很多时间 link -
不知道数据是否可分离。可能不会,至少不是很好,尽管到目前为止 SVC 在数据的一些孤立部分上取得了一些成功。将参数限制为仅
'C' : [0.001]会导致与线性核函数相同的问题,尽管......它经历了四种配置然后停止产生输出,但仍在使用几乎所有的 CPU 资源。 -
呃,调试这件事并不容易,不幸的是……到目前为止你看到了什么样的准确度?
-
我的网格搜索使用 f1 来选择最佳分类器。我发现的最佳分数是
SVC(C=10, kernel='rbf', ...)的 0.61328588575,对所有训练数据运行网格搜索。当我在一些剩余的测试数据上测试这个最好的分类器时,我达到了大约 71% 的准确率。 -
你能上传你的数据和一个最小的完整示例来重现你所看到的吗?
标签: machine-learning scikit-learn classification svm