Смотрите «Дом Дракона» 22 августа в подписке Плюс Мульти с Амедиатекой на Кинопоиске
«Дом Дракона»
Смотрите в подписке Плюс Мульти с Амедиатекой на Кинопоиске
Доступно на Кинопоиске по Подписке Плюс Мульти с Амедиатекой или при наличии Доп. опции "Амедиатека". Условия: clck.ru/FMQND.
Доступно на Кинопоиске по Подписке Плюс Мульти с Амедиатекой или при наличии Доп. опции "Амедиатека". Условия: clck.ru/FMQND.
18+
Личный опыт
MagicScore

Stepwise алгоритм выбора фичей

В текущую эпоху больших данных, при построении классификационных моделей машинного обучения с учителем (supervised learning algorithm), часто возникает вопрос отбора построенных фичей (features), которые следует включить в модель/ Особенно остро возникает эта проблема при генерации тысяч и десятков тысяч переменных. Каким образом возможно отсеять "ненужные" и оставить те, что обладают наибольшей ранжирующей способностью?

В этой статье попробуем ответить на этот вопрос реализуя на языке Python "умный" алгоритм выбора фичей или stepwise selection algorithm.

Проблематика

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

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

Метрика оценки

Поскольку мы рассматриваем классифкационные модели, в частности, модели с двумя исходами, то нашей метрикой оценки качества будет площадь под ROC-кривой (Area Under Curve или ROC AUC). В некоторых реализациях можно встретить оценку по методу наименьших квадратов (Ordinary Least Squares).

Алгоритм

1) Определить множество F всех фичей-кандидатов и целевую переменную (учителя или target).
2) Выбрать среди всех кандидитов ту переменную-фичу f1, модель с которой обладает наибольшим значением ROC AUC.
3) Исключить из множества F фичу f1.
4) Выбрать среди оставшихся кандидитов такую фичу f2, что в комбинации с выбранной ранее даёт модель с наибольшим значением ROC AUC.
5) Повторить 3-4 до тех пор, пока не закончатся переменные или не превысится ограничение на их количество.

Реализация

Для оценки ROC AUC будем использовать python-библиотеку sklearn и классическую логистическую регрессию.

from sklearn import linear_model from sklearn.metrics import roc_auc_score

Сперва реализуем функцию расчёта нашей метрики ROC AUC, которая принимает на вход обучающую выборку, обучает модель и вычисляет показатель:

def auc(variables, target, basetable): X = basetable[variables] y = basetable[target] logreg = linear_model.LogisticRegression() logreg.fit(X, y) predictions = logreg.predict_proba(X)[:, 1] auc = roc_auc_score(y, predictions) return auc

Затем, реализуем функцию отбора кандидата с наибольшим ROC AUC:

def select_next(current_variables, candidate_variables, target, basetable): best_auc = -1 best_variable = None for v in candidate_variables: auc_v = auc(current_variables + [v], target, basetable) if auc_v > best_auc: best_auc = auc_v best_variable = v return best_variable

Наконец, соединяем всё вместе и реализуем stepwise selection алгоритм:

# Определяем переменные кандидаты из таблицы candidate_variables = list(basetable.columns.values) candidate_variables.remove("target") # Инициализируем лист отобранных фичей current_variables = [] # Алгоритм stepwise с ограничением в 5 фичей number_iterations = 5 for i in range(0, number_iterations): next_variable = select_next(current_variables, candidate_variables, ["target"], basetable) current_variables = current_variables + [next_variable] candidate_variables.remove(next_variable) print("Переменная добавленная на шаге %s:\t%s " % (i+1, next_variable)) print(current_variables)

⚠ Замечание

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

Вместо заключения

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

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

Для получения подробного описания сервисов компании MagicScore и интеграции с нами, пожалуйста, пишите в ЛС или оставляйте заявки на нашем сайте.

0
5 комментариев
Artur S

А когда кросс-валидация?

Ответить
Развернуть ветку
MagicScore
Автор

Артур, спасибо за вопрос! Статья на эту тему уже запланирована. Следите за обновлениями. 😊 

Ответить
Развернуть ветку
Сергей Исаков

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

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
MagicScore
Автор

Антон, поправили, спасибо за замечание. А по поводу азов сказать что обязательно будем делать цикл статей от адама и евы☺️

Ответить
Развернуть ветку
Читать все 5 комментариев
null