如何在sklearn中使用SVC运行RFECV

4
我正在尝试使用SVC作为分类器,使用GridSearchCV执行带交叉验证的递归特征消除(RFECV)。我的代码如下。
X = df[my_features]
y = df['gold_standard']

x_train, x_test, y_train, y_test = train_test_split(X, y, random_state=0)

k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

clf = SVC(class_weight="balanced")
rfecv = RFECV(estimator=clf, step=1, cv=k_fold, scoring='roc_auc')

param_grid = {'estimator__C': [0.001, 0.01, 0.1, 0.25, 0.5, 0.75, 1.0, 10.0, 100.0, 1000.0],
              'estimator__gamma': [0.001, 0.01, 0.1, 1.0, 2.0, 3.0, 10.0, 100.0, 1000.0],
              'estimator__kernel':('rbf', 'sigmoid', 'poly')
       }

CV_rfc = GridSearchCV(estimator=rfecv, param_grid=param_grid, cv= k_fold, scoring = 'roc_auc', verbose=10)

CV_rfc.fit(x_train, y_train)

然而,我遇到了一个错误: RuntimeError: 分类器没有公开 "coef_" 或 "feature_importances_" 属性

是否有解决这个错误的方法?如果没有,我可以使用哪些其他特征选择技术与SVC一起使用?

如有需要,我很乐意提供更多细节。


1
嗨,来自文档:从版本0.17开始更改:弃用decision_function_shape ='ovo'和None。 - BCJuan
1
@BCJuan 我认为问题在于 SVC 不支持 coef_。你有什么建议来解决这个问题吗?或者有没有其他支持 SVC 的特征选择技术的推荐? - EmJ
它不叫做coef_,而是coef0 - BCJuan
2个回答

4
要查看更多的特征选择实现,您可以查看以下链接:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_selection 例如,下一个链接中使用PCA进行k-best特征选择和svc。https://scikit-learn.org/stable/auto_examples/compose/plot_feature_union.html#sphx-glr-auto-examples-compose-plot-feature-union-py 以下是一个使用示例,修改自上面链接以使内容更简单:
iris = load_iris()

X, y = iris.data, iris.target

# Maybe some original features where good, too?
selection = SelectKBest()

# Build SVC
svm = SVC(kernel="linear")

# Do grid search over k, n_components and C:

pipeline = Pipeline([("features", selection), ("svm", svm)])

param_grid = dict(features__k=[1, 2],
                  svm__C=[0.1, 1, 10])

grid_search = GridSearchCV(pipeline, param_grid=param_grid, cv=5, verbose=10)
grid_search.fit(X, y)
print(grid_search.best_estimator_)

它解决了部分问题:错误和问题“我可以与SVC一起使用哪些其他特征选择技术?” - BCJuan
3
如果这是问题的一部分,那么应该写成评论。请提供一个完整的解决方案作为答案。谢谢。 - Jeril
2
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。- 来自审查 - NaN
1
@NaN 这样好些了,还是需要更多的改进吗? - BCJuan

1

嗯...在sklearn 0.19.2中,问题似乎已经得到解决。我的代码与你的类似,但它可以工作:

           svc = SVC(                    
            kernel = 'linear',
            probability = True,
            random_state = 1 ) 
       rfecv = RFECV(
               estimator = svc,
               scoring = 'roc_auc'  
               )

       rfecv.fit(train_values,train_Labels)     
       selecInfo = rfecv.support_                      
       selecIndex = np.where(selecInfo==1)         

3
它可以在“线性”核函数下工作,但默认的“rbf”核函数则无法工作。 - Kyle54

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接