Конвейер ANOVA SVM#

Этот пример показывает, как выбор признаков может быть легко интегрирован в конвейер машинного обучения.

Мы также показываем, что вы можете легко проверить часть конвейера.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Мы начнем с генерации набора данных для бинарной классификации. Затем мы разделим набор данных на два подмножества.

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(
    n_features=20,
    n_informative=3,
    n_redundant=0,
    n_classes=2,
    n_clusters_per_class=2,
    random_state=42,
)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

Распространённая ошибка при выборе признаков — поиск подмножества дискриминативных признаков на полном наборе данных, вместо использования только обучающего набора. Использование scikit-learn Pipeline предотвращает такую ошибку.

Здесь мы продемонстрируем, как построить конвейер, где первым шагом будет отбор признаков.

При вызове fit на обучающих данных, будет выбран подмножество признаков, и индекс этих выбранных признаков будет сохранен. Селектор признаков затем уменьшит количество признаков и передаст это подмножество классификатору, который будет обучен.

from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.pipeline import make_pipeline
from sklearn.svm import LinearSVC

anova_filter = SelectKBest(f_classif, k=3)
clf = LinearSVC()
anova_svm = make_pipeline(anova_filter, clf)
anova_svm.fit(X_train, y_train)
Pipeline(steps=[('selectkbest', SelectKBest(k=3)), ('linearsvc', LinearSVC())])
В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы показать HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может отображаться, попробуйте загрузить эту страницу с помощью nbviewer.org.


После завершения обучения мы можем делать прогнозы на новых, невидимых выборках. В этом случае селектор признаков выберет только наиболее дискриминативные признаки на основе информации, сохранённой во время обучения. Затем данные будут переданы классификатору, который сделает прогноз.

Здесь мы показываем итоговые метрики через отчёт о классификации.

from sklearn.metrics import classification_report

y_pred = anova_svm.predict(X_test)
print(classification_report(y_test, y_pred))
              precision    recall  f1-score   support

           0       0.92      0.80      0.86        15
           1       0.75      0.90      0.82        10

    accuracy                           0.84        25
   macro avg       0.84      0.85      0.84        25
weighted avg       0.85      0.84      0.84        25

Имейте в виду, что вы можете проверить шаг в конвейере. Например, нас может интересовать параметры классификатора. Поскольку мы выбрали три признака, мы ожидаем получить три коэффициента.

anova_svm[-1].coef_
array([[0.75788833, 0.27161955, 0.26113448]])

Однако мы не знаем, какие признаки были выбраны из исходного набора данных. Мы могли бы действовать несколькими способами. Здесь мы инвертируем преобразование этих коэффициентов, чтобы получить информацию об исходном пространстве.

anova_svm[:-1].inverse_transform(anova_svm[-1].coef_)
array([[0.        , 0.        , 0.75788833, 0.        , 0.        ,
        0.        , 0.        , 0.        , 0.        , 0.27161955,
        0.        , 0.        , 0.        , 0.        , 0.        ,
        0.        , 0.        , 0.        , 0.        , 0.26113448]])

Мы видим, что признаки с ненулевыми коэффициентами являются выбранными признаками на первом шаге.

Общее время выполнения скрипта: (0 минут 0.016 секунд)

Связанные примеры

Рекурсивное исключение признаков с перекрестной проверкой

Рекурсивное исключение признаков с перекрестной проверкой

Основанный на модели и последовательный отбор признаков

Основанный на модели и последовательный отбор признаков

Пользовательская стратегия повторного обучения для поиска по сетке с кросс-валидацией

Пользовательская стратегия повторного обучения для поиска по сетке с кросс-валидацией

Одномерный отбор признаков

Одномерный отбор признаков

Галерея, созданная Sphinx-Gallery