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]))

同样,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 的范围内)。

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

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

【问题讨论】:

你的数据量不是很大,所以应该不是问题。你的数据是可分离的吗?这些特征是否正确地捕捉到了这种可分离性?如果不是,那么对于大型 Cs 来说,这将是有道理的,它需要花费很多时间 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)

结果是:

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

【讨论】:

谢谢,看起来像我想要的!但是该解决方案对我不起作用。在介绍这些步骤之前,您是否能够重现错误?到目前为止,它看起来确实可能与数据有关。我已确保我所有的库都具有最新版本。我尝试通过 IDE(而不是笔记本)运行脚本。我更改了系统并在 Mac 和 Windows 机器上运行脚本,结果相同。到目前为止,唯一有帮助的是规范化功能。所有内核运行平稳,数据在0-1范围内,执行快速稳定。 @danny 在介绍我的步骤和使用我的数据之前,我收到关于 score='f1' 的错误,所以当我更改为 score='accuracy' 时,它对我的​​数据运行良好。你能做同样的事情并告诉我吗?如果这对您不起作用,则错误与您的数据有关。还要确保您使用了我发布的更改 #2! 我一次完成了所有的更改,没有任何组合对我有用。 @danny 那么我猜你的数据有问题。如果你规范化你的特征是不是很糟糕?如果没有,那么就正常化,你就解决了你的问题 是的,看起来就是这个原因。这不一定是坏事(这是我计划的一个方向),但我宁愿先在原始数据上测试这些东西。尝试找出使某些内核功能出现如此多错误的数据可能会很有趣,但我不确定是否有时间这样做。谢谢现在,这真的帮助我从各个角度看待问题!

以上是关于SVC 的网格搜索问题 - 如何排除故障?的主要内容,如果未能解决你的问题,请参考以下文章

电脑故障排除

管道和网格搜索的 SKLearn 错误

具有特定验证数据的网格搜索

支持向量机的机器学习网格搜索

AUC 的网格搜索查找参数

RandomSearchCV 超慢 - 故障排除性能增强