Недавно я работал над All State Claim Severity Challenge, одним из самых популярных рекрутинговых заданий Kaggle. В этом посте я поделюсь своим решением этой задачи, начиная с анализа данных, создания новых функций и результатов различных моделей машинного обучения.

ОГЛАВЛЕНИЕ

1. Постановка задачи и набор данных
2. Метрика производительности
3. Исследовательский анализ данных
4. Преобразование признаков
5. Разработка признаков
6. Модели машинного обучения

ОПРЕДЕЛЕНИЕ ПРОБЛЕМЫ И НАБОР ДАННЫХ:

AllState, страховая компания в США, хотела автоматизировать процесс прогнозирования убытков, чтобы у застрахованного не было проблем с транзакциями.

Набор данных, предоставленный для этого соревнования, состоял из двух файлов: train.csv и test.csv. Признаки были полностью замаскированы 116 категориальными признаками (категории были представлены в виде алфавитов) и 14 числовыми признаками. Задача состояла в том, чтобы предсказать значение потерь (претензию) для набора тестовых данных, что сделало это проблемой регрессии.

ПОКАЗАТЕЛЬ ЭФФЕКТИВНОСТИ:

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

АНАЛИЗ ИССЛЕДОВАТЕЛЬСКИХ ДАННЫХ

Приведенные данные анализировались в трех частях:

1. ПОТЕРЯ

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

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

2. КАТЕГОРИЧЕСКИЕ ПРИЗНАКИ

В основном существовало два типа категориальных признаков: бинарные и многоуровневые.

Большинство бинарных категориальных признаков имели на одну категорию больше числа, чем на другую. Фактически, были функции, в которых около 99,9% данных принадлежало одной категории. Такие функции добавляют меньше ценности модели и, следовательно, были исключены.

Многоуровневые категориальные объекты имеют от трех до 326 категорий. Даже здесь они следовали аналогичной схеме: одна категория явно доминировала над другими категориями.

3. ЧИСЛЕННЫЕ ХАРАКТЕРИСТИКИ

Все числовые переменные находились в диапазоне от 0 до 1. Одномерные графики показали промежуточные пики с хвостовым распределением. Диаграмма рассеяния между потерями и каждым числовым признаком была построена с большинством признаков, имеющих логарифм потерь от 4 до 10.

Рассчитывался коэффициент корреляции Пирсона между каждой парой числовых признаков. Были две пары: (cont1 и cont9) и (cont11 и cont12), которые имели высокое значение корреляции более 0,9.

Для определения множественной колинеарности среди числовых признаков использовался коэффициент инфляции дисперсии (VIF). В этом методе каждый числовой признак пытается выразить через другие числовые признаки с помощью регрессии, и вычисляется значение R². VIF рассчитывается следующим образом:

Более высокое значение VIF указывает на то, что признак может быть более точно выражен другими признаками. Это итеративный метод, т. е. функция с наивысшим VIF отбрасывается, а регрессия повторяется. Как правило, объекты со значением VIF больше 5 удаляются. Результаты метода VIF были аналогичны результатам корреляции Пирсона.

Код для всего EDA можно указать здесь: AllStateClaimEDA

ПРЕОБРАЗОВАНИЕ ФУНКЦИЙ

Категориальные признаки должны быть преобразованы в числовые значения. Было много категориальных функций (например, cat90), у которых было несколько категорий только в тестовых данных, а не в данных поезда. Если необходимо использовать такие методы, как горячее кодирование и кодирование меток, то необходимо объединить наборы обучающих и тестовых данных, что приведет к утечке данных. Чтобы решить эту проблему, было выполнено лексическое кодирование. В этом методе алфавиты были преобразованы в соответствующие им числовые значения, аналогичные преобразованию из числовых в двоичные.

Eg: AC=1*26¹+3*26⁰=29

РАЗРАБОТКА ОСОБЕННОСТЕЙ

1. Особенности СВД

Разложение по одному значению — это метод, который разлагает матрицу на три компонента: U, Σ, V, где U (левая сингулярная матрица) и V (правая сингулярная матрица) представляют данные в другой перспективе, а Σ (единственное число) представляет силу каждого перспектива.

Например: рассмотрим матрицу со строками, представляющими разных пользователей, столбцами с разными фильмами, а значениями в матрице являются рейтинги, присвоенные пользователями разным фильмам. При применении SVD к этой матрице матрица U будет представлять предпочтения каждого пользователя к различным жанрам (триллер, криминал, романтика), матрица V будет представлять жанр, к которому, вероятно, принадлежит каждый фильм, а Σ представляет силу каждого жанра. . Таким образом, SVD преобразует данные в различные понятия (признаки), которые моделям машинного обучения трудно обнаружить.

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

Еще один прием – использование формулы Гавиша-Донохо для нахождения оптимального значения усечения. Фрагмент кода для расчета того же самого показан ниже:

Скалярное произведение уменьшенных матриц U и Σ используется в качестве признаков поезда, а скалярное произведение тестовых данных и преобразование уменьшенного V используется в качестве тестовых признаков.

Код для всего Feature Engineering можно найти здесь: AllStateClaimFeatureEngineering

МОДЕЛИ МАШИННОГО ОБУЧЕНИЯ

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

1. ЛИНЕЙНАЯ РЕГРЕССИЯ ОПОРНОГО ВЕКТОРА (LINEAR SVR):

Данные были нормализованы с использованием StandardScalar Sklearn. Два гиперпараметра, C и эпсилон, были определены с помощью RandomSearchCV. Было обнаружено, что наилучшие значения равны C=0,01 и эпсилон=0,01. Модель вернула значение MAE поезда, равное 1272. Был применен метод выбора признаков, называемый Рекурсивное устранение признаков. В этом методе функции рекурсивно удаляются, а лучшие функции сохраняются. Этот метод незначительно улучшил значение MAE. Однако значение MAE для набора тестовых данных Kaggle было высоким — 1417, что указывает на то, что линейные модели могут работать неудовлетворительно.

2. РЕГРЕССОР КНН:

Единственный гиперпараметр, который нужно настроить, — это количество ближайших соседей (значение k). Данные были разделены на две части: обучение и перекрестная проверка (cv) и нормализованы. Для разных значений k модель knn аппроксимировалась по данным поезда и оценивалась по данным cv. Кривые потерь поезда и вариатора были получены, как показано ниже:

Наилучшее значение k было найдено равным 23. Хотя для расчета этой модели потребовалось много времени, MAE на данных теста Kaggle был улучшен до 1330.

3. СЛУЧАЙНЫЙ ЛЕС

Random Forest, модель мешков на основе дерева, использовалась для вычисления потерь. Хотя Random Forest имеет очень малое время вычисления (из-за набора условий if-else) и высокую степень параллелизации (дерево может быть построено независимо от других деревьев), у него очень большое время обучения (чтобы определить наилучшее разделение, он просматривает каждый функция и каждое значение в функции). Основными гиперпараметрами, которые необходимо настроить, являются количество оценок и глубина дерева. Чтобы обучить случайный лес со 100 деревьями, каждое из которых имеет глубину 50 и учитывать только 50 000 выборок за раз, потребовалось около трех часов. Ожидание не прошло даром, поскольку был получен значительно улучшенный тест Kaggle MAE 1221.

4. XGBOOST-ОДИНАРНАЯ МОДЕЛЬ

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

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

б. subsample и colsample_bytree: Subsample указывает процент строк, а colsample_bytree указывает процент функций, которые следует учитывать при построении деревьев решений. Подвыборка, равная 1, и colsample_bytree, равная 0,3, давали меньшую ошибку поезда и резюме и, следовательно, были учтены.

в. eta: eta (также называемый параметром усадки) относится к величине веса-возраста, придаваемой каждому дереву. Эта=0,1 оказалась оптимальной.

С этими гиперпараметрами модель XGBoost была обучена на 1500 раундов с ранней остановкой на 25 раундах (обучение будет остановлено, если в течение 25 раундов не будет улучшения в счете). Тест Kaggle MAE для этой модели был впечатляющим 1130. Что еще более важно, большинство важных функций были функциями СВД и функциями дальности.

5. XGBOOST- 5-кратная модель:

Поскольку в модели XGBoost много рандомизации, построение 5 моделей и усреднение прогноза каждой модели даст лучшие результаты. В этом методе данные поезда были разделены на 5 раз с использованием метода Sklearn’s Kfold. 4 раза использовались для обучения и один раз для перекрестной проверки, таким образом, было построено 5 моделей. Что еще более важно, каждая точка данных является частью набора данных train и cv в какой-то момент времени, что позволяет проводить обучение на всем наборе данных. Полученный тест Kaggle MAE был лучшим среди всех моделей с результатом 1124 балла.

Код для построения всей Модели можно найти здесь: AllStateClaimModel

БУДУЩАЯ РАБОТА

  1. Я пытался использовать модели ансамбля, но они не давали таких высоких результатов, как модели XGBoost. Буду работать над улучшением показателей моделей ансамбля.
  2. Я также хотел бы попробовать модели Keras (глубокая нейронная сеть), так как многие отдельные модели Keras дали высокие баллы в испытании Kaggle.

ССЫЛКА

  1. https://arxiv.org/pdf/1305.5870.pdf: формула Гавиша-Донохо для поиска наилучшего значения усечения для функций SVD.
  2. https://www.kaggle.com/c/allstate-claims-severity/discussion/26414: сообщение Майкла Магуайра о создании различных функций.
  3. https://www.kaggle.com/modkzs/lexical-encoding-feature-comb: идея Modkzs о преобразовании категориальных функций с помощью лексического кодирования.
  4. https://www.appliedaicourse.com/: при выполнении этого тематического исследования меня наставляла команда курса Прикладной ИИ.

ССЫЛКА НА ГИТХАБ:

https://github.com/VIVEK-JADHAV/All-State-Claim-Severity

ССЫЛКА В ЛИНКЕДИН:

linkedin.com/in/vivek-rajakumar-jadhav-9363771b3