ValueError, использующий рекурсивное исключение возможностей для SVM с ядром rbf в scikit-learn
Я пытаюсь использовать функцию рекурсивного устранения признаков (RFE) в scikit-learn, но продолжаю получать сообщение об ошибке ValueError: coef_ is only available when using a linear kernel
, Я пытаюсь выполнить выбор функции для классификатора опорных векторов (SVC) с использованием ядра 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="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()
Однако простое изменение типа ядра с линейного на 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()
Кажется, это может быть ошибкой, но если кто-то может заметить что-то, что я делаю неправильно, это было бы здорово. Кроме того, я использую Python 2.7.6 с scikit-learn версии 0.14.1.
Спасибо за помощь!
1 ответ
Это похоже на ожидаемый результат. RFECV требует, чтобы оценщик имел coef_
что означает важность функции:
оценка: объект
Контролируемая оценка обучения с методом подгонки, который обновляет атрибут coef_, который содержит подобранные параметры. Важные особенности должны соответствовать высоким абсолютным значениям в массиве coef_.
Изменяя ядро на RBF, SVC больше не является линейным, и coef_
атрибут становится недоступным, согласно документации:
coef_
массив, форма = [n_class-1, n_features]
Веса, присвоенные признакам (коэффициенты в основной задаче). Это доступно только в случае линейного ядра.
SVC (источник) выдает ошибку, когда RFECV пытается получить доступ coef_
когда ядро не является линейным.