如何正确计算我的 SVM 的最佳 C 和 gamma?

Posted

技术标签:

【中文标题】如何正确计算我的 SVM 的最佳 C 和 gamma?【英文标题】:How to correctly compute the optimal C and gamma for my SVM? 【发布时间】:2018-03-07 17:36:34 【问题描述】:

我正在尝试为我的 SVM 计算最佳 C 和 Gamma。尝试运行我的脚本时出现此错误:

ValueError: Invalid parameter max_features for estimator SVC. Check the list of available parameters withestimator.get_params().keys().

我通过the docs 了解n_estimators 的实际含义,以便我知道我应该在那里填写哪些值。但这对我来说并不完全清楚。有人可以告诉我这个值应该是多少,以便我可以运行我的脚本来找到最佳的 C 和 gamma?

我的代码:

if __name__=='__main__':

    fname = "/home/John/labels.csv"
    labels = pd.read_csv(fname, header=None).as_matrix()[:, 1]
    labels = map(itemgetter(1),
                 map(os.path.split,
                     map(os.path.dirname, labels))) 

    fname = "/home/John/reps.csv" 
    embeddings = pd.read_csv(fname, header=None).as_matrix()
    le = LabelEncoder().fit(labels)
    labelsNum = le.transform(labels)
    nClasses = len(le.classes_)


    svcClassifier = SVC(kernel='rbf', probability=True, C=10, gamma=10)
    #classifier = OneVsRestClassifier(svcClassifier).fit(embeddings, labelsNum)
    param_grid =  
        'n_estimators': [200, 700],
        'max_features': ['auto', 'sqrt', 'log2']
    

    CV_rfc = GridSearchCV(estimator=svcClassifier, param_grid=param_grid, cv= 5)
    CV_rfc.fit(embeddings, labelsNum)
    print CV_rfc.best_params_

尝试后,我手动发现C=10gamma=10 的效果最好。然而,我想使用这个函数来找出最佳值应该是什么。

我的代码被这篇帖子所吸引:How to get Best Estimator on GridSearchCV (Random Forest Classifier Scikit)

【问题讨论】:

如果某个答案对您有帮助,请投票 (meta.stackexchange.com/questions/173399/…),以便其他用户也知道哪个答案对您有帮助。 【参考方案1】:

SVC 类没有参数 max_featuresn_estimators,因为这些是您用作代码基础的 RandomForest 的参数。如果您想针对Cgamma 优化模型,您可以尝试使用:

param_grid =  
    'C': [0.1, 0.5, 1.0],
    'gamma': [0.1, 0.5, 1.0]

此外,我还建议您在sklearn 框架中搜索最佳kernel,可以是rbflinearpoly

编辑:此处的值只是任意值,旨在说明一般方法。您应该在此处添加许多不同的值,这取决于您的情况。并且其范围也取决于您的情况。

【讨论】:

您是如何得出 C 和 Gamma 的这些值的?就我而言,伽玛似乎是 10,而 C 给出了迄今为止最好的结果。 @traducerad 这些只是任意值。您应该在此处添加许多不同的值,这在很大程度上取决于您的情况。我的代码只是一个示例,如何使用GridSearch 搜索SVCCgamma 这个列表是否应该只包含它可以选择的所有值?例如:[0.1, 0.2, ..., 9.8, 9.9, 10]? 在我的例子中,10 给出了最好的值。所以很奇怪,它返回 0.1 并导致错误的分类。 @traducerad 是的。从一个更广泛的值(如[0.5, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0])开始,以了解错误情况的形状,然后选择更精细的值(如0.1 步骤),总是一个好主意。如果这已经回答了您的原始问题,请将我的回答标记为答案并投票,以便其他用户从中受益。

以上是关于如何正确计算我的 SVM 的最佳 C 和 gamma?的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制新数据的预测与 R 中的 gee、lme、glmer 和 gamm4 相匹配?

找到 C 和 gamma 的值以优化 SVM

如何使用 libSVM(RBF 内核)在网格搜索后选择 C ​​和 gamma 以获得最佳泛化效果?

Sklearn:如何获得对训练数据进行分类的均方误差

SVM如何计算文档分类中测试文档的tf-df?

调整 SVM 回归的参数