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

> *Как только вы называете признаки фичами, знайте что все многолетние труды российских ученых в области машинного обучения прошли зря.* © К. В. Воронцов
>
>

Пусть есть куча признаков:

x
1

,

x
2

,
…
,

x
n

{\displaystyle x\_1,x\_2,\dots,x\_n}

, их очень много, хотим уменьшить их число. Можем применять два метода — отбор признаков (selection):

f
(

x

1

,

x

2

,
…
,

x

n

# )
(

x

i

1

,

x

i

2

,
…
,

x

i

m

)

{\displaystyle f(x\_{1},x\_{2},\dots ,x\_{n})=(x\_{i\_{1}},x\_{i\_{2}},\dots ,x\_{i\_{m}})}

, где

i
∈
[
1
,
n
]

{\displaystyle i \in [1,n]}

 — набор индексов наиболее оптимальных признаков. Второй метод — выделение признаков (extraction):

f
(

x

1

,

x

2

,
…
,

x

n

# )
(

f

1

,

f

2

,
…
,

f

m

)

{\displaystyle f(x\_{1},x\_{2},\dots ,x\_{n})=(f\_{1},f\_{2},\dots ,f\_{m})}

, где

f

i

,
# i

1
,
m

¯

{\displaystyle f\_{i},i={\overline {1,m}}}

 — новые признаки полученные на основе старых. В обоих случаях считаем

n
≫
m

{\displaystyle n\gg m}

. Далее про первый метод.

# F
{

f

1

,

f

2

,
…
,

f

n

}

{\displaystyle F=\{f\_{1},f\_{2},\dots ,f\_{n}\}}

 — набор признаков,

y

{\displaystyle y}

 - целевая переменная.

F
~

=
F
∖
{

f

i

}

{\displaystyle {\widetilde {F}}=F\backslash \{f\_{i}\}}

, (

i

{\displaystyle i}

 — фиксировали). Тогда признак

f
i

{\displaystyle f\_i}

 является:

* Сильно релевантным: если

p
(
y

F
~

)
≠
p
(
y

F
)

{\displaystyle p(y|{\widetilde {F}})\neq p(y|F)}

, т.е. отсутствие признака изменяет распределение целевой переменной.
* Слабо релевантным: если

p
(
y

F
~

# )
p
(
y

F
)

{\displaystyle p(y|{\widetilde {F}})=p(y|F)}

, но

∃
S
⊂

F
~

:
p
(
y

f

i

,
S
)
≠
p
(
y

S
)

{\displaystyle \exists S\subset {\widetilde {F}}:p(y|f\_{i},S)\neq p(y|S)}

, т.е. он не является сильно релевантным, но если из

F
~

{\displaystyle \widetilde{F}}

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

∀
S
⊂

F
~

:
p
(
y

f
,
S
# )
p
(
y

S
)

{\displaystyle \forall S\subset {\widetilde {F}}:p(y|f,S)=p(y|S)}

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

Отбор признаков заключается в том чтобы отбросить все нерелевантные и некоторые слабо релевантные признаки, так чтобы в новом множестве все признаки были сильно релевантными (в идеале, на практике это очень сложно).

## Алгоритм отбора по важности признаков

Пусть

I
(

f

i

)

{\displaystyle I(f\_{i})}

 — важность (importance)

i

{\displaystyle i}

-го признака,

J
(
F
)

{\displaystyle J(F)}

 — метрика точности (score) получаемая при обучении и валидации на наборе признаков

F

{\displaystyle F}

. Отсортируем признаки по величине важности:

I
(

f

1

)
⩽
I
(

f

2

)
⩽
⋯
⩽
I
(

f

n

)

{\displaystyle I(f\_{1})\leqslant I(f\_{2})\leqslant \dots \leqslant I(f\_{n})}

. Теперь можно отбирать признаки следующим образом:

* F
~

=
{

f

1

,

f

2

,
…
,

f

m

}

{\displaystyle {\widetilde {F}}=\{f\_{1},f\_{2},\dots ,f\_{m}\}}
* F
~

=

a
r
g
m
a
x

F
∈
S

J
(
F
)

{\displaystyle {\widetilde {F}}={\underset {F\in S}{argmax}}~J(F)}

, где

# S
{
{

f

1

}
,
{

f

1

,

f

2

}
,
…
,
{

f

1

,

f

2

,
…
,

f

n

}
}

{\displaystyle S=\{\{f\_{1}\},\{f\_{1},f\_{2}\},\dots ,\{f\_{1},f\_{2},\dots ,f\_{n}\}\}}

Первый способ выбирает ровно m признаков, второй оптимизирует число признаков.

Для реализации такого алгоритма осталось определить что будет являться важностью признака. Обычно выбирают следующие метрики важности:

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

Все метрики вынесены в отдельную статью и доступны по ссылкам.

## Продвинутые алгоритмы

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

* Алгоритм последовательного отбора признаков
* Генетический алгоритм

Они также вынесены в отдельную статью и также доступны по ссылкам.

## Необходимость

Собственно, зачем все это нужно:

* Увеличить точность классификации (некоторые признаки только ухудшают ситуацию).
* Убрать похожие признаки (иначе они работают как один признак с большим весом).
* Увеличить скорость обучения/прогнозирования.
* Отобрать только реально необходимые признаки для сбора данных в дальнейшем (уменьшает стоимость сбора данных, увеличивает скорость набора объектов для дальнейшего обучения).
* Сделать классификатор и признаки более интерпретируемыми (чтобы ~~мамин~~ датасаентист посмотрел на графички и сразу понял *в чем* *интуиция*).

Когда это не нужно:

* Если метод обучения основан на деревьях, так как они отбирают признаки непосредственно при обучении (деревья, рандомный лес, бустинг и т.д.).
* Если метод обучения использует L1 регуляризацию, так как она также заточена на отбор признаков и минимизацию их количества.
* Если признаки непоказательные и их очень много (например пиксели полноразмерного изображения) а обучаемся например на нейросети, то отбор признаков не имеет особого смысла, и следует перейти к выделению признаков (собственно им и занимается нейросеть),