Spec-Zone.ru › scikit-learn

1.13. Отбор признаков

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

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

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

Предположим, например, что у нас есть набор данных с булевыми признаками и мы хотим удалить все признаки, принимающие значение 1 или 0 (включено или выключено) более чем в 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. Помимо численного задания порога, доступны встроенные эвристики для его определения с помощью строкового аргумента. Доступны эвристики «mean», «median» и кратные этим значениям, заданные вещественным числом, например «0.1*mean». Вместе с критерием 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 и др., Сравнительное исследование методов отбора признаков для больших наборов данных.

Примеры

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

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–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/modules/feature_selection.html

Spec-Zone.ru

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