为什么 SVM 网格搜索需要更长的时间?

数据挖掘 机器学习 深度学习 预测建模 特征选择 超参数
2022-03-09 15:58:13

我有一个包含 5K 条记录和 60 个特征的数据集,专注于二进制分类。请在下面找到我的代码以进行 SVM 参数调整。它运行的时间比Xgb. LRRf提到的其他算法在几分钟(10-15 分钟)内返回结果,而 SVM 运行超过 45 分钟。

问题

1) SVM 通常较慢且需要较长时间吗?

2)我下面的代码有问题吗?

3)如何使网格搜索更快?

from sklearn.svm import SVC
param_grid = {'C': [0.001,0.01,0.1,1,10,100,1000],  
              'gamma': [1, 0.1, 0.01, 0.001, 0.0001], 
              'kernel': ['linear', 'rbf','poly'],
              'class_weight':['balanced']}
svm=SVC()
svm_cv=GridSearchCV(svm,param_grid,cv=5)
svm_cv.fit(X_train_std,y_train)
2个回答

简单来说,SVM 的优化问题是二次阶的。只需检查文档的第一行

“拟合时间至少与样本数量成二次方关系,超过数万个样本可能不切实际。”

1)我会引用诺亚韦伯的回答

拟合时间至少与样本数量成二次方关系,超过数万个样本可能不切实际。

2)没有错,但你完全在寻找一个空间

7 * 5 * 3 * 1 * 5(折)= 525

这是相当大的。

3)为了提高你的训练,你可以在一个子样本中进行训练,或者只是减少搜索空间,我通常使用以下函数:

def fit_cv_subsample (pipe_cv, X, y, n_max = 10_000):
    '''
    This function fits a CV in a subsample of the first n_max rows
    returns the trained pipe and the best estimator
    '''
    X_sub = X[0:n_max]
    y_sub = y[0:n_max]
    pipe_cv.fit(X_sub,y_sub)
    #pipe_cv.best_estimator_.fit(X,y)
    return pipe_cv, pipe_cv.best_estimator_
results, best_model = fit_cv_subsample(svm_c, X, y)