Spec-Zone.ru › scikit-learn
Примечание
Перейти в конец , чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Конвейер 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)
Распространённая ошибка при отборе признаков — поиск подмножества информативных признаков по всему набору данных вместо использования только обучающей выборки. Использование Pipeline из scikit-learn позволяет избежать этой ошибки.
Здесь мы покажем, как создать конвейер, первым шагом которого будет отбор признаков.
При вызове 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.
Параметры steps steps: список кортежей Список кортежей (название шага, оцениватель), которые должны быть объединены в последовательном порядке. Для совместимости с API scikit-learn все шаги должны определять `fit`. Все шаги, кроме последнего, также должны определять `transform`. Подробнее см. :ref:`Объединение оценивателей <combining_estimators>`. [('selectkbest', ...), ('linearsvc', ...)] transform_input transform_input: список строк, по умолчанию None Названия параметров :term:`метаданных`, которые должны быть преобразованы конвейером перед передачей шагу, который их использует. Это позволяет преобразовывать некоторые аргументы, передаваемые в ``fit`` (кроме ``X``), на шагах конвейера вплоть до шага, которому они нужны. Требование определяется посредством :ref:`маршрутизации метаданных <metadata_routing>`. Например, это можно использовать для передачи проверочной выборки через конвейер. Этот параметр можно задать, только если включена маршрутизация метаданных. Её можно включить с помощью ``sklearn.set_config(enable_metadata_routing=True)``. .. добавлено в версии:: 1.6 None memory memory: строка или объект с интерфейсом joblib.Memory, по умолчанию None Используется для кэширования обученных преобразователей конвейера. Последний шаг никогда не кэшируется, даже если он является преобразователем. По умолчанию кэширование не выполняется. Если указана строка, она задаёт путь к каталогу кэширования. Включение кэширования приводит к клонированию преобразователей перед обучением. Поэтому нельзя напрямую изучить экземпляр преобразователя, переданный конвейеру. Используйте атрибут ``named_steps`` или ``steps``, чтобы изучить оцениватели внутри конвейера. Кэширование преобразователей полезно, если обучение занимает много времени. См. :ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py` пример включения кэширования. None verbose verbose: bool, по умолчанию False Если значение True, по завершении каждого шага будет выводиться время, затраченное на его обучение. False
Обученные атрибуты Имя Тип Значение n_features_in_ n_features_in_: int Количество признаков, обнаруженных при :term:`обучении`. .. добавлено в версии:: 0.24 int 20 pvalues_ pvalues_: array-подобный объект формы (n_features,) p-значения оценок признаков; значение None, если `score_func` вернула только оценки. ndarray[float64](20,) [0.71,0.36,0. ,...,0.64,0.4 ,0.02] scores_ scores_: array-подобный объект формы (n_features,) Оценки признаков. ndarray[float64](20,) [ 0.14, 0.86,104.06,..., 0.22, 0.73, 6.08]
Параметры penalty penalty: {'l1', 'l2'}, по умолчанию='l2' Задает норму, используемую при штрафовании. Штраф l2 является стандартным для SVC. Штраф l1 приводит к разреженным векторам ``coef_``. 'l2' loss loss: {'hinge', 'squared_hinge'}, по умолчанию='squared_hinge' Задает функцию потерь. 'hinge' — стандартная функция потерь SVM (используется, например, классом SVC), а 'squared_hinge' — это квадрат функции потерь hinge. Сочетание ``penalty='l1'`` и ``loss='hinge'`` не поддерживается. 'squared_hinge' dual dual: «auto» или bool, по умолчанию=«auto» Выбирает алгоритм для решения двойственной или прямой задачи оптимизации. Предпочтительно использовать dual=False, когда n_samples > n_features. `dual="auto"` автоматически выберет значение параметра на основе значений `n_samples`, `n_features`, `loss`, `multi_class` и `penalty`. Если `n_samples` < `n_features` и оптимизатор поддерживает выбранные `loss`, `multi_class` и `penalty`, для dual будет установлено значение True, в противном случае — False. .. versionchanged:: 1.3 Опция `"auto"` добавлена в версии 1.3 и станет значением по умолчанию в версии 1.5. 'auto' tol tol: float, по умолчанию=1e-4 Допуск для критерия остановки. 0.0001 C C: float, по умолчанию=1.0 Параметр регуляризации. Сила регуляризации обратно пропорциональна C. Значение должно быть строго положительным. Наглядную визуализацию влияния масштабирования параметра регуляризации C см. в разделе :ref:`sphx_glr_auto_examples_svm_plot_svm_scale_c.py`. 1.0 multi_class multi_class: {'ovr', 'crammer_singer'}, по умолчанию='ovr' Определяет стратегию многоклассовой классификации, если `y` содержит более двух классов. ``"ovr"`` обучает n_classes классификаторов «один против всех», тогда как ``"crammer_singer"`` оптимизирует общую целевую функцию по всем классам. Хотя `crammer_singer` представляет теоретический интерес, поскольку является состоятельным, на практике он используется редко: он редко обеспечивает более высокую точность и требует больше вычислений. Если выбран ``"crammer_singer"``, параметры loss, penalty и dual игнорируются. 'ovr' fit_intercept fit_intercept: bool, по умолчанию=True Следует ли подгонять свободный член. Если задано True, вектор признаков дополняется свободным членом: `[x_1, ..., x_n, 1]`, где 1 соответствует свободному члену. Если задано False, свободный член не будет использоваться в вычислениях (то есть предполагается, что данные уже центрированы). True intercept_scaling intercept_scaling: float, по умолчанию=1.0 Если `fit_intercept` равно True, вектор экземпляра x становится ``[x_1, ..., x_n, intercept_scaling]``; то есть к вектору экземпляра добавляется «синтетический» признак с постоянным значением, равным `intercept_scaling`. Свободный член становится произведением intercept_scaling на вес синтетического признака. Обратите внимание, что liblinear внутри алгоритма штрафует свободный член, рассматривая его как любой другой элемент вектора признаков. Чтобы уменьшить влияние регуляризации на свободный член, параметру `intercept_scaling` можно задать значение больше 1; чем выше значение `intercept_scaling`, тем меньше влияние регуляризации на него. Тогда веса принимают вид `[w_x_1, ..., w_x_n, w_intercept*intercept_scaling]`, где `w_x_1, ..., w_x_n` обозначают веса признаков, а вес свободного члена масштабируется с помощью `intercept_scaling`. Такое масштабирование позволяет применить к свободному члену другой режим регуляризации по сравнению с остальными признаками. 1 class_weight class_weight: dict или 'balanced', по умолчанию=None Устанавливает для параметра C класса i значение ``class_weight[i]*C`` для SVC. Если значение не задано, предполагается, что вес всех классов равен единице. Режим "balanced" использует значения y для автоматической корректировки весов обратно пропорционально частотам классов во входных данных по формуле ``n_samples / (n_classes * np.bincount(y))``. None verbose verbose: int, по умолчанию=0 Включает подробный вывод. Обратите внимание, что этот параметр использует настройку времени выполнения в liblinear для всего процесса; при включении она может работать некорректно в многопоточной среде. 0 random_state random_state: int, экземпляр RandomState или None, по умолчанию=None Управляет генерацией псевдослучайных чисел для перемешивания данных при двойственном покоординатном спуске (если ``dual=True``). Если ``dual=False``, базовая реализация :class:`LinearSVC` не использует случайность, и ``random_state`` не влияет на результаты. Передайте целое число, чтобы получать воспроизводимые результаты при нескольких вызовах функции. См. :term:`глоссарий <random_state>`. None max_iter max_iter: int, по умолчанию=1000 Максимальное число выполняемых итераций. 1000
Атрибуты обученной модели Имя Тип Значение classes_ classes_: ndarray формы (n_classes,) Уникальные метки классов. ndarray[int64](2,) [0,1] coef_ coef_: ndarray формы (1, n_features), если n_classes == 2, иначе (n_classes, n_features) Веса, присвоенные признакам (коэффициенты в прямой задаче). ``coef_`` — свойство только для чтения, производное от ``raw_coef_``, которое соответствует внутреннему расположению данных в памяти liblinear. ndarray[float64](1, 3) [[0.76,0.27,0.26]] intercept_ intercept_: ndarray формы (1,), если n_classes == 2, иначе (n_classes,) Константы в функции принятия решения. ndarray[float64](1,) [-0.06] n_features_in_ n_features_in_: int Количество признаков, обнаруженных во время :term:`обучения`. .. versionadded:: 0.24 int 3 n_iter_ n_iter_: int Максимальное число итераций, выполненных для всех классов. int 5
После завершения обучения мы можем выполнить предсказание для новых, ранее не встречавшихся примеров. В данном случае селектор признаков выберет только наиболее различающие признаки на основе информации, сохраненной во время обучения. Затем данные будут переданы классификатору, который выполнит предсказание.
Здесь мы приводим итоговые метрики в виде отчета о классификации.
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.024 секунды)