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_ когда ядро ​​не является линейным.

Другие вопросы по тегам