Один из наиболее интуитивно понятных способов выбора функций - это выяснить, насколько распределение классов отличается друг от друга. Однако на некоторых интервалах распределение признака по классам может быть разным, а на других интервалах оно может быть практически таким же. Итак, мы можем сделать вывод, что признаки, которые имеют наибольшее количество интервалов, в которых распределение классов различается, являются лучшими функциями. Эта логика реализована в Минимальной неопределенности и исключении выборки (или вскоре MUSE), реализованном в kydavra как MUSESelector.

Использование MUSESelector из библиотеки Kydavra.

Если вы все еще не установили Kydavra, просто введите следующее в командной строке.

pip install kydavra

Если вы уже установили первую версию kydavra, обновите ее, выполнив следующую команду.

pip install --upgrade kydavra

Затем нам нужно импортировать модель, создать селектор и применить его к нашим данным:

from kydavra import MUSESelector
muse = MUSESelector(num_features = 5)
selected_cols = muse.select(df, 'target')

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

  • num_features (int, по умолчанию = 5): количество функций, сохраняемых во фрейме данных.
  • n_bins (int, default = 20): Количество интервалов для разделения данных для числовых функций.
  • p (float, по умолчанию = 0,2): минимальное значение накопленной суммы вероятностей положительной частоты классов.
  • T (float, по умолчанию = 0,1): минимальный порог примеси класса для корзины, передаваемой селектору.

Мы настоятельно рекомендуем вам поэкспериментировать только с параметром num_features, а для остальных оставить настройки по умолчанию.

Давайте посмотрим на пример:

Теперь мы собираемся протестировать производительность MUSESelector на наборе данных UCI болезни сердца.

Значение cross_val_score по умолчанию -.

0.8239

После применения стандартных настроек модели cross_val_score выбранных столбцов будет.

0.6983164983164983

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

from kydavra import MUSESelector
acc = []
for i in range(1, len(df.columns)-1):
    muse = MUSESelector(num_features=i)
    cols = muse.select(df, 'target')
    X = df[cols].values
    y = df['target'].values
    acc.append(np.mean(cross_val_score(logit, X, y)))

Результат следующий:

[0.5475420875420876,
 0.5991245791245792,
 0.6027609427609428,
 0.691043771043771,
 0.6983164983164983,
 0.6948148148148148,
 0.7428956228956229,
 0.7792592592592593,
 0.804915824915825,
 0.8123905723905723,
 0.8345454545454546,
 0.8233670033670034]

Мы видим, что, исключив один столбец, можно добиться большей точности.

БОНУС:

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

1 - 0.801952861952862
2 - 0.7945454545454546
3 - 0.8092255892255892
4 - 0.8383164983164983
5 - 0.841952861952862
6 - 0.8274074074074076
7 - 0.8236363636363636
8 - 0.8200673400673402
9 - 0.8200673400673402
10 - 0.8274074074074076
11 - 0.842087542087542
12 - 0.8311111111111111

Снова мы видим, что с 11 функциями cross_val_score выше, чем у базовой модели.

Если вы использовали или пробовали Кидавру, мы настоятельно приглашаем вас заполнить эту форму и поделиться своим опытом.

Сделано с ❤ от Sigmoid.

Ресурс: