Правильный выбор

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

  1. Очистка данных
  2. Фильтрация/выбор функций

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



Выбор функции

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

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

Корреляция между функциями

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

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

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

хорошо…

  1. Это излишне увеличивает размерность данных. Это увеличивает время обучения и мы можем столкнуться с проблемой проклятия размерности.
  2. Хотя в большинстве моделей сохранение функции может не сделать модель «хуже», однако такие сильно коррелированные переменные по-разному влияют на разные модели. Это может внести путаницу в модель и, следовательно, снизить производительность.

Если вы найдете мою работу полезной, поддержите меня на Kofi. Нажмите на изображение ниже.

Алгоритмы

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

Вот почему существуют специальные алгоритмы, которые решают за вас, какие переменные оставить, а какие удалить. Мы поговорим о 2 таких алгоритмах.

Выбор характеристик Боруты

Алгоритм Boruta Feature selection был впервые представлен как пакет для R. Это очень полезный алгоритм, который определяет свои собственные пороговые значения и предоставляет вам наиболее точные функции из предоставленного набора данных.

Полное объяснение и реализацию Боруты можно найти здесь:



Борута перемешивает предоставленные входные функции (каждый столбец функций отдельно), а затем объединяет их (называемые теневыми функциями) с исходными данными. После этого полный набор данных обучается с использованием классификатора Random Forest. Этот классификатор возвращает важность функции для всего ввода. Затем Борута устанавливает пороговое значение как наиболее сильное перетасованное (теневое) свойство.

Любая реальная функция, уровень важности которой ниже, чем самая важная функция в перетасовке, отбрасывается. У Boruta есть пакет Python, который поможет вам рассчитать функции. Ниже представлена ​​демонстрация того, как это работает.

# install the package
!pip install boruta
# import important libraries
import pandas as pd
from boruta import BorutaPy
from sklearn.ensemble import RandomForestRegressor
import numpy as np

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

#load data
heart_data = pd.read_csv("healthcare-dataset-stroke-data.csv")
# converting to numeric
heart_data["gender"] = pd.factorize(heart_data["gender"])[0]
heart_data["ever_married"] = pd.factorize(heart_data["ever_married"])[0]
heart_data["work_type"] = pd.factorize(heart_data["work_type"])[0]
heart_data["Residence_type"] = pd.factorize(heart_data["Residence_type"])[0]
heart_data["smoking_status"] = pd.factorize(heart_data["smoking_status"])[0]
# additional cleaning
heart_data.dropna(inplace =True)
heart_data.drop("id", axis =1, inplace = True)
heart_data.head()

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

Теперь давайте запустим алгоритм Боруты.

X = heart_data.drop("stroke", axis = 1)
y = heart_data["stroke"]
# we will use the randomforest algorithm
forest = RandomForestRegressor(n_jobs = -1,max_depth = 10)
# initialize boruta
boruta = BorutaPy(estimator = forest, n_estimators = 'auto',max_iter = 50,)
# Boruta accepts np.array 
boruta.fit(np.array(X), np.array(y))
# get results
green_area = X.columns[boruta.support_].to_list()
blue_area = X.columns[boruta.support_weak_].to_list()
print('Selected Features:', green_area)
print('Blue area features:', blue_area)

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

Выбор функции mRMR

MRMR расшифровывается как Максимальная релевантность, минимальная избыточность. Пока Boruta просматривает функции, чтобы найти наиболее важные, MRMR следит за тем, чтобы выбранные функции не только обеспечивали минимальную корреляцию между входными функциями, но и имели высокую корреляцию с выходной переменной. .

Впервые этот алгоритм был представлен в следующей статье.

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

Я объясню детали алгоритма в отдельном посте. А пока давайте посмотрим на его реализацию на Python.

Установите пакет python, используя следующую команду

!pip install mrmr_selection

Вы можете найти полную документацию для этого пакета в их официальном репозитории Github здесь.

Использование довольно простое.

from mrmr import mrmr_classif
selected_features = mrmr_classif(X=X, y=y, K=2)

Я установил K равным 2, чтобы посмотреть, совпадают ли выбранные функции с тем, что нам возвращает Борута.

print(selected_features)

И да, у нас есть точно такие же функции, как и у алгоритма Боруты выше. Однако, что делает MRMR гибким, так это то, что если вы считаете, что двух функций может быть недостаточно для получения лучшего результата, вы можете использовать столько, сколько хотите.

Выполним еще несколько прогонов.

# top 4 features
top_4 = mrmr_classif(X=X, y=y, K=4)
# top 6 features
top_6 = mrmr_classif(X=X, y=y, K=6)
print("Best 4 features:", top_4)
print("Best 6 features:", top_6)

Заключение

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

Поддержите меня на Кофи. Нажмите на изображение ниже.

Чтобы узнать больше о машинном обучении, вы можете прочитать следующие статьи.