使用 scikit-learn 对 SVR 进行递归特征消除和网格搜索

Posted

技术标签:

【中文标题】使用 scikit-learn 对 SVR 进行递归特征消除和网格搜索【英文标题】:Recursive Feature Elimination and Grid Search for SVR using scikit-learn 【发布时间】:2020-07-23 08:30:04 【问题描述】:

我正在使用 SVR 解决预测问题,我想做特征选择以及超参数搜索。我正在尝试同时使用 RFECV 和 GridSearchCV,但我的代码收到错误。

我的代码如下:

def svr_model(X, Y):
estimator=SVR(kernel='rbf')
param_grid=
    'C': [0.1, 1, 100, 1000],
    'epsilon': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10],
    'gamma': [0.0001, 0.001, 0.005, 0.1, 1, 3, 5]


selector = RFECV(estimator, step = 1, cv = 5)

gsc = GridSearchCV(
    selector,
    param_grid,
    cv=5, scoring='neg_root_mean_squared_error', verbose=0, n_jobs=-1)

grid_result = gsc.fit(X, Y)


best_params = grid_result.best_params_

best_svr = SVR(kernel='rbf', C=best_params["C"], epsilon=best_params["epsilon"], gamma=best_params["gamma"],
               coef0=0.1, shrinking=True,
               tol=0.001, cache_size=200, verbose=False, max_iter=-1)

scoring = 
           'abs_error': 'neg_mean_absolute_error',
           'squared_error': 'neg_mean_squared_error',
           'r2':'r2'

scores = cross_validate(best_svr, X, Y, cv=10, scoring=scoring, return_train_score=True, return_estimator = True)
return scores

错误是

ValueError: Invalid parameter C for estimator RFECV(cv=5,
  estimator=SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1,
                gamma='scale', kernel='rbf', max_iter=-1, shrinking=True,
                tol=0.001, verbose=False),
  min_features_to_select=1, n_jobs=None, scoring=None, step=1, verbose=0). Check the list of available parameters with `estimator.get_params().keys()`.

我是使用机器学习的新手,非常感谢任何帮助。

【问题讨论】:

我已经尝试了 DavidS 和 musterschüler 在此线程 link 上提出的两个答案,但仍然收到其他错误 请包括这些试验和错误(更新您的帖子);用estimator__Cselector__estimator__C 替换C 怎么样? 【参考方案1】:

网格搜索运行selector,并使用param_grid 中传递的不同参数组合进行初始化。但在这种情况下,我们希望网格搜索初始化 selector 中的估计器。这是通过使用字典命名样式<estimator>__<parameter> 来实现的。关注docs了解更多详情。

工作代码

estimator=SVR(kernel='linear')
selector = RFECV(estimator, step = 1, cv = 5)

gsc = GridSearchCV(
    selector,
    param_grid=
        'estimator__C': [0.1, 1, 100, 1000],
        'estimator__epsilon': [0.0001, 0.0005],
        'estimator__gamma': [0.0001, 0.001],

    cv=5, scoring='neg_mean_squared_error', verbose=0, n_jobs=-1)

grid_result = gsc.fit(X, Y)

代码中的另外两个错误

    neg_root_mean_squared_error 不是有效的评分方法 rbf 内核不返回特征重要性,因此如果你想使用RFECV,你不能使用这个内核

【讨论】:

谢谢指教。我实际上不知道 RFECV 不适用于 RBF 内核,显然它们也不适用于 MLPRegressor。

以上是关于使用 scikit-learn 对 SVR 进行递归特征消除和网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

预测:使用 SVR 模块对未来事件进行时间序列预测

Scikit-Learn SVR 预测总是给出相同的值

python机器学习库scikit-learn:SVR的基本应用

SciKit Learn SVR 运行时间很长

使用日期时间索引在 Python 中进行时间序列预测

02-35 scikit-learn库之支持向量机