Время прочтения: 4 мин.

Введение

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

  • Математическое преобразование
  • Групповое преобразование
  • Счет количества признаков

Создание новых признаков может поспособствовать улучшению моделей в следующих аспектах:

  • Снижение скорости расчета или требуемого объема данных.
  • Улучшение интерпретируемость модели.
  • Повышение точности предсказаний.

В данном материале будет рассмотрен процесс создания и отбора уже имеющихся признаков.

Для сравнения результатов точности модели будет использоваться показатель RMSLE (среднеквадратичная логарифмическая ошибка).

model = XGBRegressor()
log_y = np.log(y)
score = cross_val_score(model, X, log_y, cv=5, scoring="neg_mean_squared_error")
score = -1 * score.mean()
score = np.sqrt(score)

Взаимная информация (Mutual Information)

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

Пример реализации представлен на наборе данных цен на недвижимость, размещенного на портале Kaggle. (ссылка)

Импорт библиотеки:

from sklearn.feature_selection import mutual_info_regression

Все дискретные признаки должны иметь тип данных integer.  Проверим дополнительно выполнение этого условия:

discrete_features = X.dtypes == int

Расчет показателя взаимной информации:

mi_sc = mutual_info_regression(X, y, discrete_features=discrete_features, random_state=0)
mi_sc= pd.Series(mi_scores, name="MI Scores", index=X.columns)
mi_sc = mi_scores.sort_values(ascending=False)

Стоит учесть, что для расчета взаимной информации, следует обработать пропуски в данных, а также категориальные переменные заменить на числовые (например с помощью команды df[‘название столбца’].factorize())

Выведем признаки с самым большим значением показателя MI:

mi_sc.head(8)

Выведем признаки с самым маленьким значением MI:

mi_sc.tail(8)

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

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

Удалим неинформативный признаки следующей командой:

X = X.loc[:, mi_sc > 0.0]

Создание новых признаков

Математическое преобразование

Создадим новый признак, который показывает количество ванных комнат, приходящихся на одну спальню:

X['bath_to_bedr'] = (X['FullBath'] + X['HalfBath']) / X.TotRmsAbvGrd

Счет количества признаков

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

porch_cols = ["EnclosedPorch", "Threeseasonporch",
    "WoodDeckSF", "OpenPorchSF", "ScreenPorch"]

Методом gt проверяем, чтобы значения в столбцах были больше нуля и переводим в булевые значения. Метод sum суммирует значения, принимающие True:

X["Types_of_Porch"] = X[porch_cols].gt(0.0).sum(axis=1)

Групповое преобразование

Создадим признак, который отражает среднее значение жилой площади дома в данном районе.

X["Med_LivArea"] = X.groupby("Neighborhood")["GrLivArea"].transform("median")

Результаты

После проведенных преобразований был рассчитан показатель RMSLE, значение которого улучшилось:

Вывод

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

Экспериментируйте, применяйте различные подходы и повышайте качество работы ваших моделей. Успехов!

Примечание: Картинка сгенерирована нейросетью ruDALL-E.