РИСК ПО УМОЛЧАНИЮ ДЛЯ ДОМАШНЕГО КРЕДИТА - Конечный пример использования машинного обучения - ЧАСТЬ 2: Разработка и моделирование функций

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

- Проф. Эндрю Нг.

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

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

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

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

P.S. - Пожалуйста, обратите внимание, что я не смог бы охватить здесь каждую часть предварительной обработки данных и проектирования функций и их коды ради объема этого блога. Для получения полного кода и объяснений я прошу читателей пройти через репозиторий GitHub, где я объяснил каждую строку кода с соответствующими комментариями и пометками.

Оглавление

  1. Очистка и предварительная обработка данных
  2. Функциональная инженерия
  3. Выбор функции
  4. Разные темы
  5. Моделирование машинного обучения
  6. Результаты и сравнение моделей.
  7. Представление Kaggle
  8. Будущая работа
  9. Конечные заметки
  10. использованная литература

1. Очистка и предварительная обработка данных

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

👉 Очистка данных

а. Для функций DAYS мы видели некоторые записи, имеющие значение 365243.0, которое при преобразовании в годы соответствует более 1000 лет. Мы также обнаружили некоторые ссуды, относящиеся к очень длительным периодам времени, которые, по нашему мнению, не добавят особой стоимости, и поэтому мы сохранили только те записи, которые лежат в пределах 50 лет от текущей даты.

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

c. В обучающих данных мы видели некоторые строки со значением CODE_GENDER «XNA», хотя в тестовых данных такой категории не было, поэтому мы удалили эти записи из обучающих данных.

Приведенная ниже суть резюмирует удаление всех ошибочных точек из данных.

👉 Предварительная обработка данных

Что касается предварительной обработки, мы отсортировали таблицы, содержащие временные данные, в порядке возрастания периода времени. Мы заполнили категориальные пропущенные значения значением ‘XNA’ и преобразовали поле REGION_RATING_CLIENT в тип ‘object’. Мы также преобразовали DAYS_BIRTH в годы, разделив на 365.

2. Разработка функций

После очистки данных мы переходим к проектированию функций, где мы используем наше понимание данных, чтобы предложить новые способы и функции для преобразования наших данных. В нашем наборе данных было около 220 необработанных объектов, а после разработки функций у нас осталось около 1600 объектов. Отчасти это произошло из-за того, что в реляционных таблицах выполнялись различные виды агрегирования, чтобы объединить их с основной таблицей. Ниже мы обсуждаем стратегию разработки функций:

👉 Было несколько таблиц, таких как bureau.csv, previous_applications.csv и т.д., которые содержали данные о предыдущих займах текущих заявителей. Таким образом, для каждого текущего кандидата в этих таблицах было несколько строк, имеющих отношение "один ко многим". Чтобы их можно было объединить с основной таблицей, нам нужно было агрегировать их по текущему идентификатору приложения, то есть SK_ID_CURR, для которого мы использовали среднее, максимальное, минимальное, сумма и аналогичные функции агрегирования. Мы также агрегировали некоторые из наиболее часто встречающихся категорий, например, Тип контракта предыдущих займов, чтобы лучше понять тенденцию для каждой категории.

👉 Также были некоторые таблицы, относящиеся к предыдущим кредитам текущих клиентов, в которых были записи для транзакций за каждый месяц, например installments_payments.csv, для которых нам сначала нужно было агрегировать по предыдущему идентификатору приложения, то есть SK_ID_PREV или SK_ID_BUREAU , а затем по текущему идентификатору приложения, то есть SK_ID_CURR . Для таких таблиц агрегирование также производилось по предыдущему идентификатору приложения для некоторых ограниченных периодов времени, например, за последние 2 года, чтобы уловить более позднюю тенденцию.

👉 Для категориальных функций мы использовали Label Encoding для столбцов, которые, по нашему мнению, имели порядковое поведение, в то время как мы использовали One-Hot Encoding для остальных. Мы также использовали кодирование отклика для категориальных функций основных application_{train/test}.csv таблиц, чтобы не увеличивать размерность, поскольку древовидные алгоритмы имеют очень высокую временную сложность обучения для многомерных данных.

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

👉 Для вменения пропущенных значений мы испробовали несколько методов, таких как вменение с помощью средних, медиан, режимов, вменение на основе модели, а также вменение на основе кластерного среднего, но оказалось, что простое вменение с помощью 0 дает лучшие результаты, чем любой из эти сложные методы вменения. Это может означать, что с помощью других методов вменения мы пытались ввести шаблон, которого на самом деле не было в наборе данных. Единственным исключением является то, что вменение отсутствующих значений EXT_SOURCE функций с помощью XGBoostRegressor привело к значительным улучшениям перекрестной проверки и результатов тестирования.

Теперь мы рассмотрим некоторые из инженерных функций, получивших наивысшие оценки.

1️⃣ EXT_SOURCE особенности

Из самого EDA мы заметили, что особенности EXT_SOURCE имели высокую корреляцию с Target, а также выглядели дискриминационными между неплательщиками и неплательщиками. Это также наблюдалось на основе модели «Важность функций», в которой функции, созданные на основе этих функций, получили самые высокие оценки среди всех функций.

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

Затем мы создаем некоторые функции из необработанных EXT_SOURCE функций, используя умножение, деление и сложение.

2️⃣ TARGET_NEIGHBORS_500_MEAN

Эта функция была вдохновлена ​​описанием решения победителем. В этой функции мы используем среднее целевых значений 500 ближайших соседей для каждой точки данных из текущей таблицы приложения. Для вычисления ближайших соседей использовались следующие функции: EXT_SOURCE_1, EXT_SOURCE_2, EXT_SOURCE_3 и CREDIT_ANNUITY_RATIO.

3️⃣ Кодирование ответа для категориальных функций

Мы использовали кодировку ответа для кодирования категориальных характеристик application_{train/test}.csv. Кодирование ответа в основном означает кодирование категориальных переменных таким образом, чтобы закодированное значение представляло вероятность принадлежности точки данных к определенной метке класса для данной категории.

Это отличный способ кодирования категориальных переменных, когда мы не хотим, чтобы размеры закодированных функций резко увеличивались, как в случае One-Hot Encoding, когда количество категорий очень велико.

4️⃣ Функции экспоненциально-взвешенного скользящего среднего на основе времени (EWMA)

Поскольку мы обсуждали некоторые функции, имеющие временные данные, мы полагали, что было бы разумным решением вычислить некоторую форму скользящих средних для этих функций, чтобы зафиксировать тенденцию данных. Для этой цели мы использовали метод экспоненциально-взвешенного скользящего среднего, который уделяет больше внимания недавним значениям, а также содержит информацию о прошлых данных. Мы использовали разные значения «λ» для разных функций, основываясь на интуиции, основанной на предметной области. Функции агрегирования, выполняемые для этих функций, были в основном ‘LAST’ и ‘MEAN’.

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

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

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

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

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

а. Удаление пустых функций

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

б. Рекурсивный выбор функций

В этом методе мы использовали классификатор LightGBM и рекурсивно подогнали его к обучающим данным и выбрали важные функции на каждой итерации. Мы использовали стратифицированное K-Fold CV с K = 3 и использовали внеконкурсные прогнозы для оценок перекрестной проверки.

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

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

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

c. Окончательная важность модельных функций

Этот метод выбора функций использовался на более поздних этапах, где мы получили важность функции из нашей модели Fine-Tuned XGBoost, и на основе глубокого анализа и тестирования этого анализа с оценками Test и CV мы выбрали 600 лучших функций из 1236 функций. . Этот сокращенный набор функций будет весьма полезен для уменьшения сложности тестирования во время производства.

4. Разные темы

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

а. Пороговое смещение для несбалансированных наборов данных

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

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

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

Вышеупомянутое уравнение можно переписать как:

Таким образом, вычисляя значение J-статистики для каждого порога с использованием FPR и TPR, полученных из кривой ROC, мы можем получить оптимальный порог, установив порог с максимальным значением J-статистики. Вышеупомянутый метод можно выполнить, используя всего 3 строки кода, как показано ниже:

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

б. Байесовская оптимизация для настройки гиперпараметров

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

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

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

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

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

c. Стратифицированная перекрестная проверка K-Fold и внеконкурсные прогнозы

На протяжении всего тематического исследования мы использовали стратифицированное K-Fold CV с K = 3 или 4, а также внесли прогнозирование для оценок перекрестной проверки.

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

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

Однако для методов Boosting, поскольку мы использовали Early Stopping Критерии для каждой свертки, количество базовых учащихся для каждой свертки будет разным, и, таким образом, мы усредняем тестовые прогнозы по тестовым данным по каждой свертке для окончательных тестовых прогнозов. Изображение ниже описывает то же самое графически.

5. Моделирование машинного обучения.

Всего мы использовали 11 моделей для этого тематического исследования, каждая из которых приведена ниже.

  1. Случайная модель
  2. Модель доминирующего класса
  3. SGD LogisticRegression со штрафом L2
  4. SGD Линейный SVM
  5. RandomForestClassifier
  6. ExtraTreesClassifier
  7. XGBoostClassifier
  8. XGBoostClassifier - 600 функций
  9. СветГБМКлассификатор
  10. Классификатор стекирования
  11. Смешивание моделей

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

Для настройки гиперпараметров мы использовали RandomizedSearchCV для всех базовых моделей машинного обучения и ансамблей RandomForestClassifier и ExtraTreesClassifier. Однако для методов XGBoost и LightGBM, поскольку количество настраиваемых гиперпараметров велико, мы использовали байесовскую оптимизацию.

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

1. SGD LinearSVM

Машины опорных векторов, более известные как SVM, - это дискриминационная модель, которая пытается найти оптимальное Margin Maximizing Hyperplane между метками положительного и отрицательного классов. Это геометрически мотивированный алгоритм, который очень похож на логистическую регрессию, но обычно имеет лучшее обобщение, чем последний.

  • Мы заметили, что показатели ROC-AUC для обучения и CV и показатели отзыва лучше, чем у случайных моделей, и, таким образом, модель работает разумно.
  • Однако значение Precision здесь очень низкое, что связано с компромиссом Precision-Recall и на самом деле нормально, как обсуждалось ранее.

2. LightGBMClassifier

Когда дело доходит до ансамблей, методы Boosting всегда являются горячим кандидатом, поскольку они обычно показывают лучшую производительность среди своих аналогов. Мы также испытали это в нашем тематическом исследовании, в котором алгоритмы Gradient Boosting Decision Tree показали одни из лучших характеристик.

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

  • Из результатов мы видим, что показатели ROC-AUC для поездов и CV значительно выше, чем у линейного SVM. Эту же закономерность можно наблюдать и в частных и в публичных рейтингах.
  • Мы также видим, что значение Recall также чрезвычайно велико.
  • Эта модель входит в 10,65% лучших частных лидеров конкурса.

3. XGBoostClassifier (все функции)

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

Тем не менее, мы подумали о том, чтобы попробовать XGBoost и посмотреть, работает ли он лучше, чем LightGBM.

  • Мы наблюдаем, что, хотя оценка CV ROC-AUC для XGBoost ниже, чем у LightGBM, однако разница между оценками Train и CV значительно меньше. Это может означать меньшее переоснащение по сравнению с моделью LightGBM.
  • Оценка отзыва CV также выше, чем у LightGBM, что подтверждается значительно большим количеством истинных положительных результатов.
  • Частные и общедоступные результаты также показывают лучшую производительность по сравнению с LightGBM, что можно объяснить меньшим переобучением данных обучения.
  • Одна только эта модель дает нам процентиль 7,26% в частной таблице лидеров.

4. XGBoostClassifier (600 лучших функций)

Выбор функций с помощью XGBoost

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

На изображении слева мы замечаем, что есть точка изгиба около 40 функций, которые имеют значительно более высокую важность, чем остальные функции. Если мы попробуем выделить первые 100 функций и проведем анализ остальных функций, мы увидим точку перегиба примерно у 600 функций.

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

  • Мы наблюдаем, что разрыв между CV и Train ROC-AUC Score еще больше сократился, что означает немного меньшую переборку по сравнению с моделью со всеми 1236 функциями.
  • Мы также заметили, что Recall улучшился, а точность уменьшилась очень незначительно. Вышеупомянутый момент также можно понять, посмотрев на Матрицу путаницы, которая теперь сообщает о большем количестве истинных положительных результатов.
  • Частный рейтинг также улучшился за счет удаления этих функций. Это означает, что могли быть некоторые шумные функции, которые вызывали снижение производительности.
  • На данный момент эта модель является лучшей на основе Private Score. Сейчас мы находимся примерно в 6,3% лучших в частной таблице лидеров.

Важность функции из модели XGBoost

На изображении ниже показаны 50 основных характеристик с точки зрения коэффициента усиления Джини, наблюдаемого в модели XGBoost.

  • Мы замечаем, что наивысшие оценки действительно имеют EXT_SOURCE features.
  • Функция TARGET_NEIGHBORS_500_MEAN также занимает третье место по количеству оценок.
  • Мы также видим некоторые функции экспоненциального скользящего среднего веса в списке из 50 лучших функций.

5. Укладка и смешивание

Поскольку мы все равно работали над Ensembles, мы подумали о том, чтобы попробовать и Stacking. Для этого мы использовали базовые прогнозы вне складок из 5 базовых моделей, а именно LogisticRegression, LinearSVM, RandomForestClassifier, LightGBMClassifier и XGBoostClassifier (600 функций), а также использовали байесовский оптимизированный классификатор LightGBMC в качестве мета-классификатора. Неудивительно, что наложение работает хуже, чем наша лучшая модель XGBoost.

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

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

  • CV ROC-AUC - самый высокий среди всех остальных моделей. Однако количество истинно положительных результатов и оценка отзыва довольно низки.
  • Эта смешанная модель имеет наивысший частный рейтинг, но разница составляет всего 0,00002, что не так уж важно и осуществимо, учитывая вычислительную дороговизну этой модели.

6. Результаты и сравнение моделей.

На изображении ниже представлены результаты, полученные на Train, CV и Test Dataset для каждой из моделей.

Из приведенного выше изображения мы можем сделать следующие выводы:

  1. Лучшей моделью, учитывая частную таблицу лидеров Kaggle, была модель смешивания, которая входит в 6,24% лучших. Тем не менее, единственная лучшая модель XGBoost находится всего на 0,00002 от этой модели, что составляет 6,30%.
  2. Оценки CV и Private ROC-AUC довольно близки друг к другу, что позволяет предположить, что CV Score можно использовать в качестве меры для определения частного рейтинга.
  3. Наибольшее количество отзывов CV было получено для StackingClassifier, за которым следует XGBoostClassifier для сокращенного набора функций.

7. Представление Kaggle

Снимок экрана с представлением Kaggle нашей лучшей модели встроен ниже.

Если мы посмотрим на частную таблицу лидеров, то наша оценка находится на уровне 449 из 7190 команд, что является 6.24 percentile наивысшим рейтингом.

8. Будущая работа

Несмотря на то, что мы закончили изучение конкретного случая, есть еще пара вещей, которые мы имели в виду, но не могли попробовать из-за ограничений по времени и ресурсам.

  1. Одна вещь, которую мы пытались реализовать, но не смогли продолжить, - это последовательный прямой выбор функций для выбора наилучшего набора функций. Учитывая количество функций, это имело очень высокую временную сложность, и из-за недоступности сильных вычислительных возможностей мы не могли реализовать это.
  2. Мы полагаем, что в данном примере мы не использовали концепцию наложения должным образом. Мы можем достичь еще более высоких результатов, выполняя суммирование различных базовых классификаторов, которые будут обучены различным наборам функций, вероятно, около 15–20 базовых классификаторов, что может дать очень хорошие результаты.

9. Конец примечания

На этом заканчивается наша вторая часть серии. Мы уже рассмотрели наиболее важные части этого тематического исследования. Однако название Сквозное тематическое исследование не будет оправдано, пока мы не развернем его. Одна из самых упускаемых из виду частей машинного обучения - это развертывание моделей. Если модель не подлежит развертыванию в производстве, она ни на что не годна. Следовательно, в последней части этой серии (ссылка) мы рассмотрим, как бесплатно развернуть модель с помощью Flask API на сервере AWS.

В случае каких-либо сомнений или вопросов читатели могут оставлять комментарии в самом сообщении блога или связываться со мной в LinkedIn.

Весь проект можно найти в моем репозитории GitHub, расположенном ниже.



10. Ссылки

  1. Кодирование ответа для категориальных данных
  2. Концептуальное объяснение байесовской оптимизации гиперпараметров для машинного обучения
  3. Исследование экспоненциально взвешенной скользящей средней
  4. Нежное введение в смещение пороговых значений для несбалансированной классификации
  5. Начиная науку о данных с kaggle.com
  6. Https://www.kaggle.com/jsaguiar/lightgbm-7th-place-solution?select=submission_
  7. AppliedAICourse