首页 > 解决方案 > 为什么它只适用于在 SVM 分类器中设置 kernel:'rbf'?

问题描述

    from sklearn.model_selection import GridSearchCV
    from sklearn import svm
    params_svm = {
        'kernel' : ['linear','rbf','poly'],  
        'C' : [0.1,0.5,1,10,100],             
        'gamma' : [0.001,0.01,0.1,1,10]      
    }
    svm_clf = svm.SVC()
    estimator_svm = GridSearchCV(svm_clf,param_grid=params_svm,cv=4,verbose=1,scoring='accuracy')
    estimator_svm.fit(data,labels)
    print(estimator_svm.best_params_)
    estimator_svm.best_score_



/*
   data.shape is (891,9)
   labels.shape is  (891) both are numeric 2-D and 1-D arrays.
*/

当我将 GridSearchCV 与 rbf 一起使用时,它会在 2.7 秒内提供最佳参数组合..!但是当我单独列出包含任何“poly”或“linear”或“rbf”的内核列表时,产生输出需要很长时间,即即使在 15-20 分钟后也不给出输出,这意味着我做错了什么。我是机器学习(监督)的新手。我无法在编码中找到任何错误......我不知道幕后出了什么问题!

谁能向我解释一下,我做错了什么

标签: machine-learningclassificationsvmgrid-searchsupervised-learning

解决方案


不,根据您的代码,您没有做错任何事情。这里有很多因素在起作用

  • SVC 是一个复杂的分类器,它需要计算数据集中每对点之间的距离。
  • 复杂度也随着不同的内核而变化。我不确定,但我认为它O((no_of_samples)^2 * n_features)适用于 rbf 内核,而它O(n_samples*n_features)适用于线性内核。因此,并不是仅仅因为rbf kernel在 15 分钟内工作,那么线性内核也将在相似的时间内工作。

  • 此外,所花费的时间很大程度上取决于数据集和其中存在的数据模式。例如,一个 rbf 内核可能会快速收敛,C = 0.5但对于相同的 C 值,多项式内核可能需要更多的时间来收敛。

  • 此外,如果不使用缓存,运行时间会增加很多。在这个答案中,作者提到它可能会增加到 O(n_samples^3 *n_features)。

  • 这是sklearn 关于 SVM 复杂性的官方文档。有关使用 SVM 的实用技巧,请参阅本节。

  • 您可以设置verbose为 True 以查看分类器的进度及其训练方式。

参考


推荐阅读