Spec-Zone.ru › scikit-learn

1.13. Выбор признаков

Классы в модуле sklearn.feature_selection могут использоваться для выбора признаков/сведения размерности на наборах данных, чтобы улучшить точность оценки алгоритмов или повысить их производительность на очень высокоразмерных наборах данных.

1.13.1. Удаление признаков с низкой дисперсией

VarianceThreshold — это простой базовый подход к выбору признаков. Он удаляет все признаки, дисперсия которых не достигает определенного порога. По умолчанию он удаляет все признаки с нулевой дисперсией, то есть признаки, имеющие одинаковое значение во всех образцах.

В качестве примера, предположим, что у нас есть набор данных с булевыми признаками, и мы хотим удалить все признаки, которые равны единице или нулю (включены или выключены) более чем в 80% образцов. Булевые признаки являются бернуллиевскими случайными величинами, и дисперсия таких величин определяется следующим образом:

\[\mathrm{Var}[X] = p(1 - p)\]

следовательно, мы можем выбрать порог .8 * (1 - .8):

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

Как и ожидалось, VarianceThreshold удалил первый столбец, у которого вероятность \(p = 5/6 > .8\) содержать ноль.

1.13.2. Выбор признаков по одному

Выбор признаков по одному работает путем выбора лучших признаков на основе статистических тестов по одному признаку. Он может рассматриваться как этап предварительной обработки для алгоритма. Scikit-learn предоставляет функции выбора признаков как объекты, реализующие метод transform:

  • SelectKBest удаляет все, кроме \(k\) признаков с наивысшими оценками
  • SelectPercentile удаляет все, кроме указанного пользователем процента признаков с наивысшими оценками
  • используя общие статистические тесты по одному признаку: ошибка первого рода SelectFpr, ошибка ложного открытия SelectFdr или ошибка семейства SelectFwe.
  • GenericUnivariateSelect позволяет выполнять выбор признаков по одному с настраиваемой стратегией. Это позволяет выбрать лучшую стратегию выбора признаков по одному с помощью поиска гиперпараметров.

Например, мы можем использовать F-критерий для извлечения двух лучших признаков для набора данных следующим образом:

>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import f_classif
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(f_classif, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)

Эти объекты принимают на вход функцию оценки, которая возвращает оценки и p-значения по одному признаку (или только оценки для SelectKBest и SelectPercentile):

  • Для регрессии: r_regression, f_regression, mutual_info_regression
  • Для классификации: chi2, f_classif, mutual_info_classif

Методы, основанные на F-критерии, оценивают степень линейной зависимости между двумя случайными величинами. С другой стороны, методы взаимной информации могут учитывать любой вид статистической зависимости, но, будучи непараметрическими, они требуют большего количества образцов для точного оценивания. Обратите внимание, что тест \(\chi^2\) следует применять только к неотрицательным признакам, таким как частоты.

Выбор признаков с разреженными данными

Если вы используете разреженные данные (т.е. данные, представленные в виде разреженных матриц), chi2, mutual_info_regression, mutual_info_classif будут обрабатывать данные без их уплотнения.

Предупреждение

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

Примечание

SelectPercentile и SelectKBest также поддерживают выбор признаков без учителя. Необходимо предоставить score_func где y=None. score_func должен использовать внутренне X для вычисления оценок.

Примеры

  • Выбор признаков по одному
  • Сравнение F-критерия и взаимной информации

1.13.3. Рекурсивное устранение признаков

Учитывая внешний алгоритм, который присваивает веса признакам (например, коэффициенты линейной модели), цель рекурсивного устранения признаков (RFE) заключается в отборе признаков путем рекурсивного рассмотрения все меньших и меньших наборов признаков. Сначала алгоритм обучается на начальном наборе признаков, и важность каждого признака определяется либо через определенный атрибут (например, coef_, feature_importances_) либо через вызываемую функцию. Затем наименее важные признаки удаляются из текущего набора признаков. Эта процедура повторяется рекурсивно на усеченном наборе до тех пор, пока не будет достигнуто необходимое число подлежащих отбору признаков.

RFECV выполняет RFE в цикле перекрестной проверки, чтобы найти оптимальное количество признаков. Подробнее, количество выбранных признаков настраивается автоматически путем обучения селектора RFE на различных разбиениях перекрестной проверки (предоставленных параметром cv). Производительность селектора RFE оценивается с использованием scorer для различного количества выбранных признаков и агрегируется. Наконец, оценки усредняются по слоям, и количество выбранных признаков устанавливается в количество признаков, которые максимизируют оценку перекрестной проверки.

Примеры

  • Рекурсивное устранение признаков: пример рекурсивного устранения признаков, показывающий важность пикселей в задаче классификации цифр.
  • Рекурсивное устранение признаков с перекрестной проверкой: пример рекурсивного устранения признаков с автоматической настройкой количества выбранных признаков с помощью перекрестной проверки.

1.13.4. Выбор признаков с помощью SelectFromModel

SelectFromModel — это мета-преобразователь, который может быть использован совместно с любым оценщиком, который присваивает важность каждому признаку через определённый атрибут (такой как coef_, feature_importances_) или с помощью вызываемого объекта importance_getter после обучения. Признаки считаются неважными и удаляются, если соответствующая важность значений признаков ниже предоставленного параметра threshold. Помимо указания порога численно, существуют встроенные эвристики для нахождения порога с использованием строкового аргумента. Доступные эвристики — «среднее», «медиана» и числовые множители этих значений, такие как «0,1*среднее». В сочетании с критерием threshold можно использовать параметр max_features для установки ограничения на количество выбираемых признаков.

Примеры использования см. в разделах ниже.

Примеры

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

1.13.4.1. Выбор признаков на основе L1

Линейные модели с штрафом L1 имеют разреженные решения: многие из их оценённых коэффициентов равны нулю. Когда цель состоит в уменьшении размерности данных для использования с другим классификатором, их можно использовать вместе с SelectFromModel для выбора ненулевых коэффициентов. В частности, разреженные оценщики, полезные для этой цели, — это Lasso для регрессии и LogisticRegression и LinearSVC для классификации:

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)

Для SVM и логистической регрессии параметр C контролирует разреженность: чем меньше C, тем меньше признаков выбирается. Для Lasso, чем выше параметр alpha, тем меньше признаков выбирается.

Примеры

  • Lasso на плотных и разреженных данных.
Восстановление L1 и сжатое представление

Для подходящего значения alpha, Lasso может полностью восстановить точный набор ненулевых переменных, используя всего несколько наблюдений, при условии выполнения определенных специфических условий. В частности, количество выборок должно быть «достаточно большим», или L1-модели будут работать случайным образом, где «достаточно большое» зависит от количества ненулевых коэффициентов, логарифма количества признаков, величины шума, наименьшего абсолютного значения ненулевых коэффициентов и структуры матрицы дизайна X. Кроме того, матрица дизайна должна обладать определенными специфическими свойствами, например, не быть слишком коррелированной. О использовании Lasso для восстановления разреженных сигналов см. этот пример по сжатому представлению: Сжатое представление: реконструкция томографии с L1-приоритетом (Lasso).

Нет общего правила выбора параметра alpha для восстановления ненулевых коэффициентов. Он может быть задан с помощью перекрестной проверки (LassoCV или LassoLarsCV), хотя это может привести к недообученным моделям: включение небольшого количества нерелевантных переменных не ухудшает качество предсказания. BIC (LassoLarsIC) в свою очередь, имеет тенденцию устанавливать высокие значения alpha.

Ссылки

Richard G. Baraniuk «Сжатое представление», IEEE Signal Processing Magazine [120] Июль 2007 http://users.isr.ist.utl.pt/~aguiar/CS_notes.pdf

1.13.4.2. Выбор признаков на основе деревьев

Оценщики на основе деревьев (см. модуль sklearn.tree и леса деревьев в модуле sklearn.ensemble) могут быть использованы для вычисления важностей признаков на основе неоднородности, которые, в свою очередь, могут быть использованы для отбрасывания нерелевантных признаков (в сочетании с мета-преобразователем SelectFromModel):

>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier(n_estimators=50)
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_  
array([ 0.04...,  0.05...,  0.4...,  0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape               
(150, 2)

Примеры

  • Важность признаков с лесом деревьев: пример на синтетических данных, демонстрирующий восстановление фактически значимых признаков.
  • Важность перестановки против важности признаков случайного леса (MDI): пример, обсуждающий недостатки использования важностей признаков на основе неоднородности в качестве замены для важности признаков.

1.13.5. Последовательный отбор признаков

Последовательный отбор признаков [sfs] (SFS) доступен в преобразователе SequentialFeatureSelector. SFS может быть как прямым, так и обратным:

Прямой SFS — это жадный процесс, который итеративно находит лучший новый признак для добавления к набору выбранных признаков. Конкретно, мы начинаем с нуля признаков и находим один признак, который максимизирует результат кросс-валидации, когда оценочный модуль обучается на этом единственном признаке. После выбора первого признака мы повторяем процедуру, добавляя новый признак к набору выбранных признаков. Процедура останавливается, когда достигается желаемое количество выбранных признаков, как определено параметром n_features_to_select.

Обратный SFS следует той же идее, но работает в обратном направлении: вместо того, чтобы начинать без признаков и жадно добавлять признаки, мы начинаем с всех признаков и жадно удаляем признаки из набора. Параметр direction управляет тем, используется ли прямой или обратный SFS.

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

В общем случае прямой и обратный отбор не дают эквивалентных результатов. Кроме того, один из них может быть намного быстрее другого в зависимости от запрашиваемого числа выбранных признаков: если у нас есть 10 признаков и требуется 7 выбранных признаков, прямой отбор потребует 7 итераций, а обратный отбор — только 3.

SFS отличается от RFE и SelectFromModel тем, что ему не требуется, чтобы базовой модели был доступен атрибут coef_ или feature_importances_. Однако он может быть медленнее, учитывая, что для оценки требуется больше моделей по сравнению с другими подходами. Например, в обратном отборе итерация, переходящая от m признаков к m - 1 признакам с помощью k-кратной кросс-валидации, требует обучения m * k моделей, в то время как RFE потребует только одного обучения, а SelectFromModel всегда выполняет только одно обучение и не требует итераций.

Ссылки

[sfs]

Ferri et al, Сравнительное исследование методов отбора признаков для больших данных.

Примеры

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

1.13.6. Отбор признаков как часть конвейера

Отбор признаков обычно используется как предварительная обработка перед непосредственным обучением. Рекомендуемый способ сделать это в scikit-learn — использование Pipeline:

clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)

В этом примере используется LinearSVC в связке с SelectFromModel для оценки важности признаков и выбора наиболее релевантных признаков. Затем RandomForestClassifier обучается на преобразованном выходе, т. е. используя только релевантные признаки. Аналогичные операции можно выполнить с другими методами отбора признаков и классификаторами, предоставляющими способ оценки важности признаков. Подробности см. в примерах использования Pipeline.

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/modules/feature_selection.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API