Один из наиболее интуитивно понятных способов выбора функций - это выяснить, насколько распределение классов отличается друг от друга. Однако на некоторых интервалах распределение признака по классам может быть разным, а на других интервалах оно может быть практически таким же. Итак, мы можем сделать вывод, что признаки, которые имеют наибольшее количество интервалов, в которых распределение классов различается, являются лучшими функциями. Эта логика реализована в Минимальной неопределенности и исключении выборки (или вскоре 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.