SVC 的网格搜索问题 - 如何排除故障?
Posted
技术标签:
【中文标题】SVC 的网格搜索问题 - 如何排除故障?【英文标题】:Grid search problems with SVC - how to troubleshoot? 【发布时间】: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 的范围内)。
现在,通常建议对支持向量方法进行归一化,因为它们不是尺度不变的,所以无论如何我都会这样做。但我认为它是一种提高性能的方法,而不是它工作的必要预防措施,就像在这种情况下一样。
我现在可以处理这个问题,但我仍然很好奇是否有人知道数据可能出了什么问题,以及如何将其提供给支持向量算法。
【问题讨论】:
你的数据量不是很大,所以应该不是问题。你的数据是可分离的吗?这些特征是否正确地捕捉到了这种可分离性?如果不是,那么对于大型C
s 来说,这将是有道理的,它需要花费很多时间 link
不知道数据是否可分离。可能不会,至少不是很好,尽管到目前为止 SVC 在数据的一些孤立部分上取得了一些成功。将参数限制为仅'C' : [0.001]
会导致与线性核函数相同的问题,尽管......它经历了四种配置然后停止产生输出,但仍在使用几乎所有的 CPU 资源。
呃,调试这件事并不容易,不幸的是……到目前为止你看到了什么样的准确度?
我的网格搜索使用 f1 来选择最佳分类器。我发现的最佳分数是 SVC(C=10, kernel='rbf', ...)
的 0.61328588575,对所有训练数据运行网格搜索。当我在一些剩余的测试数据上测试这个最好的分类器时,我达到了大约 71% 的准确率。
你能上传你的数据和一个最小的完整示例来重现你所看到的吗?
【参考方案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)
结果是:
您可以在图片中清楚地看到linear
和rbf
都经过测试。
【讨论】:
谢谢,看起来像我想要的!但是该解决方案对我不起作用。在介绍这些步骤之前,您是否能够重现错误?到目前为止,它看起来确实可能与数据有关。我已确保我所有的库都具有最新版本。我尝试通过 IDE(而不是笔记本)运行脚本。我更改了系统并在 Mac 和 Windows 机器上运行脚本,结果相同。到目前为止,唯一有帮助的是规范化功能。所有内核运行平稳,数据在0-1范围内,执行快速稳定。 @danny 在介绍我的步骤和使用我的数据之前,我收到关于 score='f1' 的错误,所以当我更改为 score='accuracy' 时,它对我的数据运行良好。你能做同样的事情并告诉我吗?如果这对您不起作用,则错误与您的数据有关。还要确保您使用了我发布的更改 #2! 我一次完成了所有的更改,没有任何组合对我有用。 @danny 那么我猜你的数据有问题。如果你规范化你的特征是不是很糟糕?如果没有,那么就正常化,你就解决了你的问题 是的,看起来就是这个原因。这不一定是坏事(这是我计划的一个方向),但我宁愿先在原始数据上测试这些东西。尝试找出使某些内核功能出现如此多错误的数据可能会很有趣,但我不确定是否有时间这样做。谢谢现在,这真的帮助我从各个角度看待问题!以上是关于SVC 的网格搜索问题 - 如何排除故障?的主要内容,如果未能解决你的问题,请参考以下文章