Выбор функций с помощью sklearn

машинное обучение
Выбор функций с помощью sklearn

Это 24-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

задний план

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

Что такое выбор признаков?

Выбор признаков является важной проблемой в разработке признаков, и его цель состоит в том, чтобыНайдите оптимальное подмножество функций. Выбор признаков может исключить нерелевантные (нерелевантные) или избыточные (избыточные) признаки, тем самым уменьшив количество признаков,Цель повышения точности модели и сокращения времени выполнения. С другой стороны, выбор действительно релевантных функций упрощает модель, помогая понять процесс генерации данных. Мы часто слышим, что «данные и функции определяют верхний предел машинного обучения, а модели и алгоритмы лишь приближают этот верхний предел», что свидетельствует о его важности.

Зачем делать отбор по характеристикам?

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

  1. собрать больше данных
  2. Введение штрафа за сложность через регуляризацию
  3. Выберите простую модель с меньшим количеством параметров
  4. Уменьшить размерность данных (есть два способа уменьшить размерность: выбор признаков и извлечение признаков)

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

Общий процесс выбора признаков

  1. Создание подмножеств: поиск подмножеств функций, предоставление подмножеств функций для функции оценки
  2. Функция оценки: оценить качество подмножества признаков.
  3. Критерий остановки: связанный с функцией оценки, как правило, порог, поиск может быть остановлен после того, как функция оценки достигнет определенного стандарта.
  4. Процесс проверки: проверьте достоверность выбранного подмножества объектов в наборе данных проверки.

Однако, когда количество функций велико, пространство поиска будет очень большим, и поиск оптимальных функций по-прежнему требует определенного соответствующего опыта.

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

По форме выделения признака его можно разделить на три категории:

  • Фильтр (метод фильтрации): по发散性или相关性Оцените каждую функцию, установите порог или количество функций, которые будут выбраны для скрининга.
  • Обертка: в соответствии с целевой функцией (часто оценкой эффекта прогнозирования) выберите несколько функций за раз или исключите несколько функций.
  • Embedded (встроенный метод): сначала используйте некоторые модели машинного обучения для обучения, получите весовые коэффициенты каждого признака и выберите признаки в соответствии с коэффициентами от большего к меньшему (аналогично фильтру, но коэффициенты получаются путем обучения)

Методы выбора функций в sklearn

Удалить функции с низкой дисперсией — VarianceThreshold

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

Предположим, у нас есть набор данных с логическими функциями, а затем мы хотим удалить те функции, где более 80% выборок равны 0 (или 1). Булевы функции — это случайные величины Бернулли с дисперсией p(1-p), код показан ниже.

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)))
result = sel.fit_transform(X)
print(X, "\n" ,result)

VarianceThreshold удаляет первый столбец, а соотношение 0 в первом столбце составляет 5/6, что превышает 4/5.

Одномерный выбор признаков — SelectKBest/SelectPercentile/GenericUnivariateSelect

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

sklearn рассматривает выбор функций как повседневную операцию преобразования:

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

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

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

iris = load_iris()
X, y = iris.data, iris.target
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
print(X.shape, X_new.shape)
# (150, 4) (150, 2)

Согласно FPR значения p ниже альфа были выбраны в соответствии с критерием хи-квадрат.

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectFdr, chi2
X, y = load_breast_cancer(return_X_y=True)

X_new = SelectFdr(chi2, alpha=0.01).fit_transform(X, y)
X.shape, X_new.shape
# ((569, 30), (569, 16))

Для одномерного выбора признаков, если это проблема классификации, вы можете использоватьchi2(критерий хи-квадрат),f_classif(значение F дисперсионного анализа),mutual_info_classif(взаимная информация).

  • chi2: тест хи-квадрат, классический тест хи-квадрат предназначен для проверки корреляции между качественными независимыми переменными и качественными зависимыми переменными;
  • f_classif: дисперсионный анализ, расчет значения F дисперсионного анализа (ANOVA) (средний квадрат между группами / средний квадрат внутри групп);
  • Mutual_info_classif: Взаимная информация, метод взаимной информации может фиксировать любую статистическую зависимость, но, поскольку это непараметрический метод, для точной оценки требуется больше выборок.

Если это проблема регрессии, вы можете использоватьf_regression(значение F коэффициента корреляции),mutual_info_regression(взаимная информация)

  • f_regression: коэффициент корреляции, вычислить коэффициент корреляции между каждой переменной и целевой переменной, а затем вычислить значение F и значение P.
  • взаимная_информация_регрессия: взаимная информация, взаимная информация измеряет информацию, совместно используемую X и Y: она измеряет степень, в которой знание одной из этих двух переменных снижает неопределенность другой.

предупреждать

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

Устранение рекурсивных признаков — RFE (устранение рекурсивных признаков)

Рекурсивное удаление признаковПрисвойте веса функциям с учетом внешней оценки(например, коэффициенты линейной модели), котораяметод упаковки.

Цель рекурсивного устранения признаков (RFE) состоит в том, чтобыРекурсивно рассматривать все меньшие и меньшие наборы функцийдля выбора функций.

Во-первых, оценщик получается путем обучения на начальном наборе признаков, и важность каждого признака может быть определена любым конкретным атрибутом (таким какcoef_,feature_importances_)получить.

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

RFECVВыполните RFE, используя метод перекрестной проверки, чтобы найти оптимальное количество функций.

В приведенном ниже примере показаны корреляции пикселей в задаче классификации цифр.

from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.feature_selection import RFE
import matplotlib.pyplot as plt

# Load the digits dataset
digits = load_digits()
X = digits.images.reshape((len(digits.images), -1))

y = digits.target

# (1797, 8, 8) 1797 (1797, 64) (1797,)
print(digits.images.shape, len(digits.images), X.shape, y.shape) 

# 创建RFE对象并对每个像素进行排序
svc = SVC(kernel="linear", C=1)

rfe = RFE(estimator=svc, n_features_to_select=1, step=1)
rfe.fit(X, y)

print(digits.images[0].shape) # (8, 8)

ranking = rfe.ranking_.reshape(digits.images[0].shape)

# Plot pixel ranking
plt.matshow(ranking, cmap=plt.cm.Blues)
plt.colorbar()
plt.title("Ranking of pixels with RFE")
plt.show()

rankingпредставляет порядок функций,ranking_[i]Представляет ранжирование i-го признака. Лучший оцененный атрибут оценивается как 1.

image.png

В следующем примере количество выбранных функций автоматически настраивается посредством перекрестной проверки.

import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
from sklearn.datasets import make_classification

# 使用3个信息丰富的特征构建分类任务
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)

print(X.shape, y.shape) # (1000, 25) (1000,)

# Create the RFE object and compute a cross-validated score.
svc = SVC(kernel="linear")

# “准确度”评分与正确分类数成正比
min_features_to_select = 1  # Minimum number of features to consider

rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),
              scoring='accuracy',
              min_features_to_select=min_features_to_select)
rfecv.fit(X, y)

# Optimal number of features : 3
print("Optimal number of features : %d" % rfecv.n_features_)

# 画出特征数与交叉验证分数的对比
plt.figure()
plt.xlabel("Number of features selected") 
plt.ylabel("Cross validation score (nb of correct classifications)")
plt.plot(range(min_features_to_select,
               len(rfecv.grid_scores_) + min_features_to_select),
         rfecv.grid_scores_)
plt.show()

grid_scores_представляет собой оценку перекрестной проверки, например,grid_scores_[i]Оценка CV, соответствующая i-му подмножеству признаков. Это означает, что первая оценка — это оценка для всех функций, а вторая оценка — это оценка, когда набор функций удаляется поровну. Количество удаляемых признаков в каждом равно значению параметра step. По умолчанию значение равно 1.

image.png

Обучите базовую модель и выберите функции с более высокими весовыми коэффициентами — SelectFromModel.

SelectFromModel — это метаконвертер, который представляет собойВстроенный метод, можно сравнить с теми, уcoef_илиfeature_importances_Атрибуты используются с моделью. еслиcoef_ илиfeature_importances_Ниже порога мы считаем функцию неважной. В дополнение к указанию порогов также можно использовать эвристику. Допустимые эвристики включают среднее значение, медиану или умножение на коэффициент, например: 0,1*среднее.

Пример SelectFromModel показан ниже Сначала загрузите набор данных.

from sklearn.datasets import load_diabetes

diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target

Используемый нами набор данных о диабете состоит из 10 признаков от 442 пациентов с диабетом.

Затем, поcoefficientsПосмотреть важность функции.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LassoCV

lasso = LassoCV().fit(X, y)
importance = np.abs(lasso.coef_)
feature_names = np.array(diabetes.feature_names)
plt.bar(height=importance, x=feature_names)
plt.title("Feature importances via coefficients")
plt.show()

image.png

Функции выбираются с помощью метода SelectFromModel, поскольку мы хотим выбрать только 2 функции, мы устанавливаем этот порог на коэффициент, немного превышающий третью по важности функцию.

from sklearn.feature_selection import SelectFromModel
from time import time

threshold = np.sort(importance)[-3] + 0.01

tic = time()
sfm = SelectFromModel(lasso, threshold=threshold).fit(X, y)
toc = time()
print("Features selected by SelectFromModel: "
      f"{feature_names[sfm.get_support()]}")
print(f"Done in {toc - tic:.3f}s")

# Features selected by SelectFromModel: ['s1' 's5']
# Done in 0.067s

Последовательный выбор функций — SequentialFeatureSelector

Последовательный выбор признаков (SFS) может быть прямым или обратным выбором признаков. Это такжеметод упаковки.

Forward SFS — это жадный процесс, который итеративно находит лучшие новые функции для добавления к выбранному набору функций.

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

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

Часто выбор вперед и выбор назад не дают одного и того же результата.

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

SFS отличается от (RFE и SelectFromModel) тем, что Базовая модель не требует раскрытия атрибутов coef_ или feature_importes_.

Однако по сравнению с другими методами он может быть медленнее, учитывая, что нужно оценить больше моделей.

Например, при обратном выборе итерация от m объектов к m - 1 объектам с использованием k-кратной перекрестной проверки требует подбора m*k моделей, в то время как RFE требует только одного подбора, а SelectFromModel всегда выполняет только один подбор без итерации.

Короче говоря, используйтеSequentialFeatureSelectionС точки зрения выбора функций SFS — это жадный процесс, и на каждой итерации мы выбираем лучшие новые функции для добавления к нашему выбору на основе оценки перекрестной проверки. То есть мы начинаем с 0 функций и выбираем лучшую с наивысшим баллом. Этот процесс повторяется до тех пор, пока мы не достигнем желаемого количества выбранных признаков. Мы также можем пойти в обратном направлении (обратная SFS), т. е. начать со всех признаков и жадно выбирать их для удаления по одному.

Мы проиллюстрируем оба метода здесь.


from sklearn.feature_selection import SequentialFeatureSelector

tic_fwd = time()
sfs_forward = SequentialFeatureSelector(lasso, n_features_to_select=2,
                                        direction='forward').fit(X, y)
toc_fwd = time()

tic_bwd = time()
sfs_backward = SequentialFeatureSelector(lasso, n_features_to_select=2,
                                         direction='backward').fit(X, y)
toc_bwd = time()

print("Features selected by forward sequential selection: "
      f"{feature_names[sfs_forward.get_support()]}")
print(f"Done in {toc_fwd - tic_fwd:.3f}s")
print("Features selected by backward sequential selection: "
      f"{feature_names[sfs_backward.get_support()]}")
print(f"Done in {toc_bwd - tic_bwd:.3f}s")

# Features selected by forward sequential selection: ['bmi' 's5']
# Done in 2.177s
# Features selected by backward sequential selection: ['bmi' 's5']
# Done in 6.433s

Суммировать

В этой статье в основном описываются три типа методов выбора функций (метод фильтрации, метод упаковки, метод встраивания) и наиболее часто используемые методы выбора функций в sklearn. Конкретные методы заключаются в следующем:

своего рода метод Функции
VarianceThreshold метод фильтрации Метод выбора дисперсии удаляет те признаки, дисперсия которых не достигает порога.
SelectKBest/SelectPercentile/GenericUnivariateSelect метод фильтрации Метод коэффициента корреляции, выбор признаков с помощью одномерного статистического теста, выбор теста хи-квадрат, метод взаимной информации и т. д.
RFE/RFECV метод упаковки Рекурсивно обучайте базовую модель, удаляя наименее важные функции из текущего набора функций.
SelectFromModel Встроенный метод Для обучения базовой модели и выбора признаков с более высокими весовыми коэффициентами существуют методы выбора признаков, основанные на условиях штрафа, и методы выбора признаков, основанные на древовидных моделях.
SequentialFeatureSelector метод упаковки Путем прямого выбора функций или обратного выбора функций на каждой итерации мы выбираем лучшие новые функции для добавления к нашему выбору на основе оценки перекрестной проверки.

Справочная статья