1. Базовая модель
  2. Использование классических моделей машинного обучения
  3. Использование SMOTEBoost и RUSBoost
  4. Классификатор стекирования
  5. Заключительные выводы о моделях
  6. Создание веб-приложения на Streamlit
  7. Развертывание на AWS EC2.
  8. Заключение
  9. использованная литература

Базовая модель

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

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

Установите порог, скажем T. (здесь мы будем использовать T = 0,95)

Выберите случайным образом число от 0 до 1 из однородной случайной величины.

Если выбранное число больше T, вернуть положительный класс.

В противном случае верните отрицательный класс.

Классические модели машинного обучения

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

  • Логистическая регрессия
  • Классификатор KNN
  • Классификатор деревьев решений
  • Классификатор случайного леса
  • Классификатор GBDT (XGBoost)

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

Чтобы получить максимальную производительность от этих моделей, мы собираемся выполнить настройку гиперпараметров с помощью k-кратной перекрестной проверки. Для этого воспользуемся GridSearchCV. Итак, давайте сначала объявим несколько функций, которые помогут нам с настройкой гиперпараметров и оценкой производительности.

1. Обучение использованию вмененного набора данных KNN:

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

  1. Логистическая регрессия

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

2. Классификатор KNN

KNN имеет худшую производительность по сравнению с логистической регрессией, как видно из оценки f1 и затрат на ошибочную классификацию, но он все равно работает лучше, чем базовая модель. Однако предвзятость к негативу все еще существует, и даже больше. Причиной этого может быть то, что многие положительные точки данных класса окружены отрицательными точками данных класса, как мы видели на tSNE-plot во время EDA. Это приведет к тому, что модель на основе соседей, такая как KNN, будет плохо работать, что мы также можем видеть здесь.

3. Классификатор дерева решений

Дерево решений работает лучше, чем все модели до сих пор. Он имеет оценку f1 0,84 (приблизительно) и самую низкую стоимость ошибочной классификации 79 830. Как мы видим, отзыв также выше на 0,58 по сравнению с другими моделями.

4. Классификатор случайного леса

Модель случайного леса имеет оценку f1 0,85 и стоимость ошибочной классификации 77 640.

5. Классификатор XGBoost (GBDT)

Модель XGBoost работает лучше, чем модель случайного леса, с показателем f1 0,88 и стоимостью ошибочной классификации 60 670. У нее также самый высокий рейтинг отзыва среди всех моделей в положительном классе. Модель XGBoost до сих пор показывала лучшие результаты среди всех других моделей.

Вот окончательные показатели производительности для всех ml-моделей в наборе импутированных данных KNN вместе взятых:

2. Обучение работе с вмененным набором данных MICE

Теперь давайте посмотрим на характеристики модели в наборе данных MICE Imputed для получения наилучших значений гиперпараметров.

  1. Логистическая регрессия

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

2. Классификатор KNN

Как и в случае с вмененным набором данных knn, здесь KNN также показывает худшие результаты с оценкой F-1 0,80 и стоимостью ошибочной классификации 96360. Однако его производительность на вмененном наборе данных мышей лучше по сравнению с его производительностью в наборе вмененных данных knn.

3. Классификатор дерева решений

Модель дерева решений, как правило, имеет стоимость ошибочной классификации 79 840 и оценку f1 0,84 для вмененного набора данных мышей. Это лучше, чем для вмененного набора данных knn.

4. Классификатор случайного леса

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

5. Классификатор XGBoost (GBDT)

Модель XGBoost здесь также показывает лучшие результаты с показателем f1 0,88 и стоимостью ошибочной классификации 60 270. Подобно XGBoost в наборе вмененных данных KNN, мы видим, что и здесь XGBoost имеет лучшую производительность и в вмененных наборах данных MICE.

Вот окончательные показатели производительности для всех ml-моделей в наборе импутированных данных MICE вместе взятых:

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

  • Правильно предсказать точку данных отрицательного класса очень просто, и основная задача сводится к правильному предсказанию точек данных положительного класса. Будет выбрана модель, которая лучше всего справится с этим.
  • Как и ожидалось, более сложные модели, такие как Random Forests и XGBoost, лучше других работают для обоих типов наборов данных.
  • Для более простых моделей, таких как логистическая регрессия и KNN, вменение мышей работает лучше, чем вменение knn.
  • Производительность XGBoost и RandomForest более или менее схожа для обоих методов с небольшим улучшением производительности для вмененного набора данных мышей.

Поэтому мы собираемся использовать технику импутации MICE для всех будущих моделей. Несмотря на то, что оба метода работают одинаково для лучших моделей, MICE Imputer быстрее, чем KNN Imputer, поэтому он будет лучшим выбором. Что касается моделей, мы будем использовать классификатор XGBoost.

Глядя на матрицы путаницы всех моделей, мы можем заметить, что существует некоторая систематическая ошибка для отрицательных точек данных класса в моделях из-за дисбаланса классов. Это означает, что мы можем улучшить производительность модели, если каким-то образом устраним эту предвзятость. Один из способов сделать это - поработать с порогами классификации модели. По умолчанию пороговое значение модели составляет 0,5 для положительного класса в сценарии двоичной классификации, т. Е. если модель предсказывает, что вероятность точки, принадлежащей положительному классу, больше, чем 0.5, эта точка данных будет классифицирована как точка данных положительного класса, и наоборот. Уменьшая это пороговое значение, мы могли бы улучшить производительность модели для положительного класса. Однако мы должны помнить, что это улучшение производительности происходит за счет производительности в классе большинства, и поэтому мы не можем слишком сильно ее уменьшить, так как это отрицательно повлияет на производительность. Теперь давайте найдем оптимальное пороговое значение для модели XGBoost для MICE Imputed Dataset. Мы также проведем дополнительную настройку гиперпараметров, чтобы получить более эффективную модель XGBoost.

n_estimators = 20 и max_depth = 5 кажутся лучшим значением. Обучив модель XGBoost с этими значениями, мы получим следующий результат:

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

Минимальный балл составляет 8850 для порога, очень близкого к 0.

Максимальный балл f1 составляет 0,91 для порога, равного 0,15.

Мы собираемся выбрать порог 0,15 для XGBoost, потому что для этого значения стоимость очень низкая (около 20000), а оценка f1 также высока. Используя этот порог для прогнозирования, мы получаем следующие результаты:

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

Использование SMOTEBoost и RUSBoost

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

Методы передискретизации, такие как SMOTE (Техника передискретизации синтетических меньшинств) и,

Методы недодискретизации, такие как Случайная недодискретизация (RUS)

Однако мы не собираемся напрямую использовать эти приемы. Вместо этого мы собираемся использовать две разные модели, которые внутренне используют эти методы для борьбы с дисбалансом классов. Это i) SMOTEBoost и ii) RUSBoost. Чтобы узнать, как использовать эти две модели в Python, обратитесь к this.

  1. SMOTEBoost: SMOTEBoost - это настраиваемый метод ансамбля повышения, который выполняет SMOTE (технология синтетической передискретизации меньшинства) для устранения дисбаланса классов в наборе данных. SMOTE - это сложный метод, который используется для выполнения передискретизации точек данных большинства классов. Это достигается за счет разумного создания синтетических точек данных для класса меньшинства и, следовательно, балансировки набора данных. SMOTE создает синтетические точки данных на линиях, которые соединяют уже существующие точки данных класса меньшинства. SMOTEBoost выполняет SMOTE перед обучением каждого базового ученика с нуля, чтобы создать сбалансированный набор данных для каждого базового ученика, на котором он будет тренироваться. В результате он устраняет дисбаланс классов в наборе данных и улучшает производительность модели.

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

Здесь мы видим, что SMOTEBoost работает немного лучше, чем модель XGBoost. Это означает, что больше точек будет положительным. Однако многие из них получают неправильные ярлыки. Таким образом, SMOTEBoost явно снизил предвзятость к классу большинства, но этого все еще недостаточно.

  1. RUSBoost: RUSBoost - это специальный метод Boosting Ensemble, который выполняет случайную недостаточную выборку (RUS) для устранения несбалансированности классов. RUS - это метод недостаточной выборки, который случайным образом отбрасывает точки данных, принадлежащие классу большинства. Проблема с RUS заключается в том, что при этом отбрасываются точки данных, что в конечном итоге приводит к сокращению информации, доступной модели для обучения. Однако RUSBoost не выполняет RUS для набора данных один раз и сокращает исходный набор данных, вместо этого он выполняет RUS (с заменой) каждый раз, когда обучается базовый ученик. Это не приводит к потере информации, поскольку существует очень высокая вероятность того, что точка данных, отброшенная для одного базового учащегося, будет видна одним или несколькими учащимися в будущем, поэтому общая информация сохраняется.

Мы собираемся обучить модель RUSBoost на наших данных и выполнить настройку гиперпараметров, чтобы добиться от нее максимальной производительности. Для настройки гиперпараметров мы собираемся настроить количество i) базовых учащихся, ii) скорость обучения и iii) соотношение классов после RUS.

Как мы видим, модель имеет очень низкую стоимость 39 040 только для порога по умолчанию. У него отзыв 0,83 для положительного класса. Это действительно увеличивает характеристики модели в положительном классе. Однако, если мы внимательно посмотрим на матрицу неточностей, мы увидим, что модель делает много ложноположительных прогнозов, что приводит к очень низкой точности 0,596 для положительный класс. В результате в целом характеристики модели нельзя считать хорошими, даже если она хорошо работает в положительном классе и имеет более низкий балл ошибочной классификации.

Классификатор стекирования

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

  • Разделите обучающие данные на 2 половины, скажем, D1 и D2.
  • Сделайте k образцов формы D1 с заменой
  • Обучите k моделей на каждом из этих наборов k образцов
  • После обучения сделайте прогнозы на D2 из каждой из k моделей, что даст нам набор данных прогноза len (D2) * k shape.
  • В этом наборе данных обучите мета-классификатор, используя фактические метки классов.
  • Для оценки производительности модели используйте наборы тестов и передайте их каждому из k базовых классификаторов и сделайте пердицитоны с помощью мета-классификатора.
  • Количество базовых моделей и количество точек данных в каждой выборке можно настроить как гиперпараметры.

Для суммирующего ансамбля мы собираемся настроить количество базовых моделей (k) и выборочную долю набора данных для каждой модели (sample_proportion). После настройки модели мы получаем, что k = 10 и sample_proportion = 0,75 дают наилучшую производительность. После этого настраиваем порог классификации модели. Мы получаем следующие графики стоимость против порога классификации и оценка f1 против порога классификации:

  • Наименьшая стоимость составляет 15 190 при пороге, очень близком к 0, что больше по сравнению с другими моделями.
  • Максимальный балл f1 составляет 0,909 и более или менее постоянен во всем диапазоне пороговых значений.
  • Из графика мы можем видеть, что даже для наименьшей ошибки неправильной классификации при пороге, близком к 0, оценка f1 довольно высока. Это может означать, что мета-классификатор имеет смещение в сторону баллов класса 0, учитывая, что используемый нами мета-классификатор является линейным классификатором.

Теперь, используя лучшие значения гиперпараметров и порог прогнозирования, мы получаем следующие показатели производительности для классификатора стекирования:

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

Окончательные выводы о моделях

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

Используемый нами объект MICE Imputer также занимает значительно больше времени для импутации, и его размер на диске также велик (1,3 ГБ, если быть точным). Это будет проблемой, потому что экземпляр AWS EC2, который мы собираемся использовать, имеет только 1 ГБ ОЗУ. Таким образом, что касается вменения, мы собираемся использовать только средний вмененный для всех признаков. После этого мы собираемся аналогичным образом обучить новую модель XGBoost для нового набора данных и настроить ее гиперпараметры и порог прогнозирования таким же образом, как и раньше. Сделав это, я смог получить модель со следующими показателями производительности

Создание веб-приложения с использованием Streamlit

Модель может быть развернута на сервере, в локальной системе или на облачных серверах, таких как экземпляр AWS EC2 и т. Д. Мы собираемся развернуть ее в экземпляре AWS EC2 путем создания веб-приложения с использованием библиотеки Streamlit. Streamlit - это очень простая в использовании библиотека Python, которая позволяет нам очень легко создавать веб-приложения для машинного обучения. Обратитесь к this для получения дополнительной информации о streamlit.

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

if number_of_rows<=10:
    show the datapoints on the screen with class labels
else:
    append the class labels to the original dataset and display a download link for the csv file

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

Теперь давайте посмотрим на код веб-приложения:

  • Основное оптимизированное приложение
  • model_functions, реализующие конвейер прогнозирования

Чтобы узнать, как развернуть оптимизированное веб-приложение на экземпляре aws ec2, обратитесь к этому замечательному блогу Рахула Агравала.

В этом видео мы можем увидеть в действии веб-приложение, развернутое на микро-экземпляре AWS EC2:

Заключение

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

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

Наконец, мы решили, что XGBoost будет лучшей моделью для использования с оптимальным значением порога прогнозирования, а затем создали веб-приложение с использованием streamlit, которое было развернуто на экземпляре AWS EC2.

Полный код можно найти в моем github и не стесняйтесь подключать меня через LinkedIn.

использованная литература

  1. Промышленная задача IDA 2016: использование машинного обучения для прогнозирования сбоев: https://link.springer.com/chapter/10.1007/978-3-319-46349-0_33
  2. Промышленный вызов IDA-2016: https://ida2016.blogs.dsv.su.se/?page_id=1387
  3. Курс прикладного искусственного интеллекта: https://www.appliedaicourse.com/
  4. SMOTEBoost: улучшение прогнозирования класса меньшинства в повышении, Чавла и др .: https://www.researchgate.net/publication/220698913_SMOTEBoost_Improving_Prediction_of_the_Minority_Class_in_Boosting
  5. RUSBoost: гибридный подход к уменьшению дисбаланса классов: https://sci2s.ugr.es/keel/pdf/algorithm/articulo/2010-IEEE%20TSMCpartA-RUSBoost%20A%20Hybrid%20Approach% 20to% 20Alleviating% 20Class% 20Imbalance.pdf
  6. MICE: https://www.youtube.com/watch?v=WPiYOS3qK70&ab_channel=RachitToshniwal