Бизнес-проблема:

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

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

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

Источник данных:

Чтобы решить проблему переобучения, мы сегодня воспользуемся набором данных Kaggle. Kaggle запустил конкурс Не переоснащай 2. В этой задаче нам предоставляется обучающий набор данных с 250 точками и тестовый набор данных с 19750 точками.

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

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

Существующие решения и идеи:

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

  1. Https://www.kaggle.com/featureblind/robust-lasso-patches-with-rfe-gs

Это ядро ​​решения доступно на Kaggle и обеспечивает 87% -ный рейтинг AUC. Здесь используется RFE (Recursive Feature Extractor), который помогает выбрать лучшие функции. Выбирая основные функции и обучаясь им, мы можем в значительной степени избавиться от переобучения.

Одна из проблем этого ядра заключается в том, что при стандартизации оно также использовало общедоступный набор данных, что могло бы быть возможным для соревнований Kaggle, но не для реального мира. Основное, что мы можем извлечь из этого, - это использование RFE в сочетании с GridSearchCV вместе с надежным auc_score.

  1. Https://www.researchgate.net/post/How_to_Avoid_Overfitting

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

  1. Https://www.kaggle.com/rafjaa/dealing-with-very-small-datasets

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

  1. Https://www.kaggle.com/iloveyyp/logistic-regression-with-rfecv

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

  1. Https://www.kaggle.com/plasticgrammer/don-t-overfit-i-try

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

Наш подход на основе существующих решений:

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

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

Итак, остановимся на теории и начнем с работы. Пора запачкать руки.

Наш набор данных о поездах:

У нас есть 250 точек данных и 302 столбца, включая метки и столбец идентификатора. Наш набор обучающих данных будет содержать только функции от 0 до 299. Следовательно, из этих данных мы будем извлекать наши метки и обучать набор данных.

Теперь, когда у нас есть данные, давайте приступим к нашему EDA.

Сбалансированный или несбалансированный?

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

Распределение среднего значения характеристик в наборе данных:

Среднее значение признаков колеблется от -0,20 до 0,18 соответственно. Также мы видим большинство пунктов в диапазоне от -0,05 до 0,10. Следовательно, среднее распределение характеристик нашего набора данных выглядит как нормальное распределение с небольшим смещением в сторону положительных значений.

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

Распределение стандартного отклонения функций в нашем наборе данных:

Как видно из приведенной выше гистограммы, стандартное отклонение функций в нашем наборе данных находится в диапазоне от 0,92 до 1,10, при этом большинство функций имеют значение стандартного отклонения 1. Следовательно, это дополнительно дает нам лучшее представление о том, что особенности нашего набора данных набор данных происходит из нормального распределения со средним значением, приблизительно равным 0, и стандартным отклонением, равным 1.

Распределение минимальных значений функций в нашем наборе данных:

Минимальные значения находятся в диапазоне от -4,0 до -2,0 с большинством от -3,0 до -2,5. Это дает нам больше информации о нашем наборе данных, что не имеет значения, если наш набор данных меньше -4.0. Мы можем видеть только небольшие значения на гистограмме, которые, вероятно, могут быть выбросами.

Распределение максимальных значений функций в нашем наборе данных:

Максимальные значения колеблются от 2,00 до 3,75. Следовательно, в некотором смысле они симметричны нашим минимальным значениям.

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

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

Модель здания:

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

Выполнение RepeatedStratifiedKFold с KNN для выбора лучших гиперпараметров:

Мы получили лучший гиперпараметр со значением n_neighbors равным 80. Когда мы обучаем нашу модель с этим параметром и отправляем результат в Kaggle, мы получаем оценку auc 0,686.

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

RepeatedStratified KFold с логистической регрессией

Еще одна простая модель классификации - это логистическая регрессия. Итак, давайте выполним RepeatedStratifiedKFold с этим и посмотрим, как работает наша модель:

Когда мы отправляем нашу оценку с параметрами, настроенными с помощью логистической регрессии, мы получаем следующую оценку Kaggle:

Вау, такой отличный прыжок, да. Но означает ли это, что логистическая регрессия лучше, чем KNeighborsClassifier? Смотря как. В любом случае логистическая регрессия работает лучше, чем KNN, не только потому, что она лучше обобщает, но и потому, что она не использует все функции.

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

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

Итак, приступим:

Стратегии выбора функций:

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

  1. Выбор функций с помощью EDA:

Когда мы рисуем диаграмму рассеяния, мы можем определить важность функции, видя, может ли конкретная функция различать метки классов. Например:

Из изображений выше мы видим, что PDF-файл Feature-1 перекрывается для обоих классов. В Feature-2 перекрытие намного меньше, тогда как в Feature-3 ниже определенного значения все точки принадлежат определенному классу.

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

2. Метод корреляции Пирсона:

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

Например:

Пусть x, y, z, a, b, c будут объектами размера в нашем наборе данных. Если существует прямая связь между двумя функциями, мы можем легко использовать одну из них вместо использования обеих.

Если из вышеперечисленных характеристик у нас есть такие отношения, как:

x=2y

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

3. Устранение рекурсивной функции:

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

Это можно реализовать напрямую с помощью библиотеки sklearn.

4. а) Выбор функций на основе модели (регрессия лассо):

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

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

4.b) Выбор функций на основе модели (деревья решений):

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

Сочетание всех функций:

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

Итак, теперь, когда у нас есть наши лучшие функции, позвольте нам выполнить нашу KNN с несколькими функциями и увидеть производительность.

RepeatedStratifiedKFold KNN с топ-50 функциями:

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

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

Результаты для всех моделей:

Что ж, мы поиграли еще немного с разным количеством функций для KNN и LR, и вот результаты, которые мы получили:

Следовательно, LogisticRegression с регуляризацией L1 действительно дает лучшие результаты с auc-оценкой 0,844.

Дальнейшая работа:

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

  1. Создание функции. В этом коде мы увидели, как выбор функции повлиял на нашу модель. Следовательно, помимо выбора лучших функций, вы также можете попробовать создать несколько функций, используя средние, максимальные значения, значения стандартного отклонения и т. Д.
  2. Взвешенный подход. Что ж, вы также можете попробовать объединить результаты нескольких моделей, используя подход взвешенной суммы. Вы можете придать больший вес модели, которая работает лучше, и наоборот.
  3. Классификатор стекирования: здесь мы использовали только простые модели. Вы также можете попробовать классификаторы стекирования. Это также может помочь в улучшении результатов.

Репозиторий GitHub:

Https://github.com/mansi2596/Kaggle-Don-t-Overfit-2

Ссылки:

  1. Https://www.kaggle.com/featureblind/robust-lasso-patches-with-rfe-gs
  2. Https://www.researchgate.net/post/How_to_Avoid_Overfitting
  3. Https://www.kaggle.com/rafjaa/dealing-with-very-small-datasets
  4. Https://www.kaggle.com/iloveyyp/logistic-regression-with-rfecv