使用scikit-learn中的rbf内核对SVM使用递归特征消除的ValueError

Dav*_*idS 3 python scikit-learn rfe

我正在尝试在scikit-learn中使用递归功能消除(RFE)功能,但不断收到错误ValueError: coef_ is only available when using a linear kernel.我正在尝试使用rbf内核为支持向量分类器(SVC)执行功能选择.来自网站的这个例子执行得很好:

print(__doc__)

from sklearn.svm import SVC
from sklearn.cross_validation import StratifiedKFold
from sklearn.feature_selection import RFECV
from sklearn.datasets import make_classification
from sklearn.metrics import zero_one_loss

# Build a classification task using 3 informative features
X, y = make_classification(n_samples=1000, n_features=25, n_informative=3,
                       n_redundant=2, n_repeated=0, n_classes=8,
                       n_clusters_per_class=1, random_state=0)

# Create the RFE object and compute a cross-validated score.
svc = SVC(kernel="linear")
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y, 2),
          scoring='accuracy')
rfecv.fit(X, y)

print("Optimal number of features : %d" % rfecv.n_features_)

# Plot number of features VS. cross-validation scores
import pylab as pl
pl.figure()
pl.xlabel("Number of features selected")
pl.ylabel("Cross validation score (nb of misclassifications)")
pl.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
pl.show()
Run Code Online (Sandbox Code Playgroud)

但是,只需将内核类型从线性更改为rbf,如下所示,会产生错误:

print(__doc__)

from sklearn.svm import SVC
from sklearn.cross_validation import StratifiedKFold
from sklearn.feature_selection import RFECV
from sklearn.datasets import make_classification
from sklearn.metrics import zero_one_loss

# Build a classification task using 3 informative features
X, y = make_classification(n_samples=1000, n_features=25, n_informative=3,
                       n_redundant=2, n_repeated=0, n_classes=8,
                       n_clusters_per_class=1, random_state=0)

# Create the RFE object and compute a cross-validated score.
svc = SVC(kernel="rbf")
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y, 2),
          scoring='accuracy')
rfecv.fit(X, y)

print("Optimal number of features : %d" % rfecv.n_features_)

# Plot number of features VS. cross-validation scores
import pylab as pl
pl.figure()
pl.xlabel("Number of features selected")
pl.ylabel("Cross validation score (nb of misclassifications)")
pl.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
pl.show()
Run Code Online (Sandbox Code Playgroud)

这似乎可能是一个错误,但如果有人能发现我做错了什么就会很好.另外,我正在使用scikit-learn版本0.14.1运行python 2.7.6.

谢谢您的帮助!

YS-*_*S-L 9

这似乎是预期的结果.RFECV要求估算器具有coef_表示要素重要性的值:

估计量:对象

具有拟合方法的监督学习估计器,其更新保持拟合参数的coef_属性.重要特征必须对应于coef_数组中的高绝对值.

根据文档,通过将内核更改为RBF,SVC不再是线性的,并且coef_属性变得不可用.

coef_

数组,形状= [n_class-1,n_features]

权重符合特征(原始问题中的系数).这仅适用于线性内核.

当内核不是线性时RFECV尝试访问时,SVC (源)会引发错误coef_.