Прогнозирование дефолта по ссуде с помощью набора данных Berka

Комплексный проект машинного обучения с реальными банковскими данными

Таблица содержания

· Введение
· О наборе данных
· Импортировать набор данных в базу данных
· Подключить Python к базе данных MySQL
· Извлечение функций
· Преобразование признаков
· Моделирование
· Заключение и дальнейшие направления
· Обо мне

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

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

Введение

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

О наборе данных

Berka Dataset или набор финансовых данных PKDD’99 — это набор реальной анонимной финансовой информации из чешского банка, используемой для PKDD’99 Discovery Challenge. Доступ к набору данных можно получить на моей странице GitHub.

В наборе данных 8 необработанных файлов включают 8 таблиц:

  • аккаунт (4500 объектов в файле ACCOUNT.ASC) — каждая запись описывает статические характеристики аккаунта.
  • клиент (5369 объектов в файле CLIENT.ASC) — каждая запись описывает характеристики клиента.
  • расположение (5369 объектов в файле DISP.ASC) — каждая запись связывает клиента с учетной записью, т.е. это отношение описывает права клиентов на управление учетными записями.
  • постоянное поручение (6471 объект в файле ORDER.ASC) — каждая запись описывает характеристики платежного поручения.
  • транзакция (1056320 объектов в файле TRANS.ASC) — каждая запись описывает одну транзакцию по счету.
  • ссуда (682 объекта в файле LOAN.ASC) — каждая запись описывает ссуду, предоставленную для данной учетной записи.
  • кредитная карта (892 объекта в файле CARD.ASC) — каждая запись описывает кредитную карту, выданную для учетной записи.
  • демографические данные (77 объектов в файле DISTRICT.ASC) — каждая запись описывает демографические характеристики района.
  • Каждая учетная запись имеет как статические характеристики (например, дату создания, адрес филиала), указанные в отношении «счет», так и динамические характеристики (например, дебетовые или кредитовые платежи, остатки), указанные в отношениях «постоянный заказ» и «транзакция».
  • Отношение «клиент» описывает характеристики лиц, которые могут манипулировать счетами.
  • Один клиент может иметь несколько учетных записей, большее количество клиентов может управлять одной учетной записью; клиенты и счета связаны между собой отношением «диспозиция».
  • Отношения «кредит» и «кредитная карта» описывают некоторые услуги, которые банк предлагает своим клиентам.
  • К счету может быть выпущено более одной кредитной карты.
  • На счет может быть предоставлено не более одного кредита.
  • Отношение «демографические данные» дает некоторую общедоступную информацию об округах (например, уровень безработицы); из этого можно получить дополнительную информацию о клиентах.

Импортировать набор данных в базу данных

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

Здесь я написал запросы SQL для импорта файлов необработанных данных в базу данных MySQL для простых и быстрых манипуляций с данными (например, функций выбора, объединения и агрегирования) с данными.

См. также:  Symfony 4 Doctrine не может подключиться к Docker MySQL

Выше фрагмент кода показывает, как создать базу данных банка и импортировать таблицу Account. Он состоит из трех этапов:

  • Создать и использовать базу данных
  • Создать таблицу
  • Загрузить данные в таблицу

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

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

Подключить Python к базе данных MySQL

Опять же, если вы решите импортировать данные непосредственно в Python с помощью Pandas, этот шаг не является обязательным. Но если вы создали базу данных и познакомились с набором данных с помощью некоторых манипуляций с данными SQL, следующим шагом будет перенос подготовленных таблиц в Python и выполнение там анализа данных. Один из способов — использовать MySQL Connector for Python для выполнения SQL-запросов в Python и создания Pandas DataFrames, используя результаты. Вот мой подход:

После изменения информации базы данных, такой как хост, база данных, пользователь, пароль, мы можем инициировать экземпляр соединения, выполнить запрос и преобразовать его в Pandas DataFrame:

Несмотря на то, что это необязательный шаг, он выгоден с точки зрения скорости, удобства и хорош для экспериментальных целей по сравнению с прямым импортом файлов в Pandas DataFrames. В отличие от других проектов машинного обучения, где нам предоставляется только файл acsv (1 таблица), этот набор данных довольно сложен, и между соединениями таблиц скрыто много полезной информации, поэтому это еще одна причина, по которой я хочу представить способ загрузка данных в базу данных.

Теперь данные находятся на сервере MySQL, и мы подключили его к Python, чтобы мы могли беспрепятственно получать доступ к данным во фреймах данных. Следующие шаги — извлечь функции из таблицы, преобразовать переменные, загрузить их в один массив и обучить модель машинного обучения.

Извлечение функций

Поскольку прогнозирование дефолта по ссуде является проблемой двоичной классификации, нам сначала нужно знать, сколько экземпляров в каждом классе. Если посмотреть на переменную status в таблице Loan, можно выделить 4 различных значения: A, B, C и D.

  • О: Контракт завершен, проблем нет.
  • B: Контракт завершен, заем не выплачен.
  • C: Действующий контракт, пока хорошо.
  • D: Выполняется контракт, клиент в долгах.

Согласно определениям из описания набора данных, мы можем разделить их на бинарные классы: хорошие (A или C) и плохие (B или D). К хорошему классу относятся 606 ссуд, из них 76 — к плохому.

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

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

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

Повторяя процесс экспериментов с существующими функциями и созданными функциями, я наконец подготовил таблицу, которая состоит из 18 столбцов функций и 1 столбца меток. Выбранные функции:

  • сумма: Сумма кредита
  • duration: Срок кредита
  • выплаты: Выплаты по ссуде
  • days_between: дни между созданием учетной записи и выдачей кредита
  • частота: частота выдачи отчетов
  • average_order_amount: Среднее количество постоянных заказов, сделанных учетной записью.
  • average_trans_amount: Средняя сумма транзакций, совершенных учетной записью.
  • average_trans_balance: Средняя сумма баланса после транзакций, совершенных в аккаунте.
  • n_trans: Номер транзакции по счету
  • card_type: Тип кредитной карты, связанной с учетной записью.
  • n_inhabitants: Количество жителей в районе учета
  • average_salary: Средняя зарплата в районе счета.
  • average_unemployment: средний уровень безработицы в районе учета.
  • предприниматель_рейт: Количество предпринимателей на 1000 жителей в районе учета.
  • average_crime_rate: средний уровень преступности в районе, где ведется учет
  • owner_gender: пол владельца аккаунта
  • owner_age: возраст владельца аккаунта
  • same_district: логическое значение, которое указывает, имеет ли владелец ту же информацию об округе, что и учетная запись.
См. также:  Быстрый обратный квадратный корень в Go (и JavaScript) для развлечения

Преобразование функции

После того, как функции извлечены и помещены в большую таблицу, необходимо преобразовать данные, чтобы их можно было вводить в модель машинного обучения органичным способом. В нашем случае у нас есть два типа функций. Один из них числовой, например amount, duration и n_trans. Другой — категориальный, например card_type и owners_gender.

Наш набор данных довольно чистый, и есть какие-либо пропущенные значения, поэтому мы можем пропустить вменение и сразу перейти к масштабированию для числовых значений. Существует несколько вариантов скалеров от scikit-learn, таких как StandardScaler, MinMaxScaler и RobustScaler. Здесь я использовал MinMaxScaler, чтобы изменить масштаб числовых значений между 0 и 1. С другой стороны, типичная стратегия работы с категориальными переменными состоит в использовании OneHotEncoder для преобразования функций в двоичные значения 0 и 1.

Приведенный ниже код представляет собой этапы преобразования функций:

Моделирование

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

Есть много хороших моделей машинного обучения для задач двоичной классификации. Здесь в этом проекте используется модель Random Forest из-за ее приличной производительности и возможности быстрого прототипирования. Подходит исходная RandomForrestClassifier модель, и для представления ее эффективности используются три различных показателя: Точность, Оценка F1 и ROC AUC.

Примечательно, что точность недостаточна для этого несбалансированного набора данных. Если мы доработаем модель исключительно по точности, тогда она будет в пользу предсказания ссуды как «хорошей ссуды». Оценка F1 — это среднее гармоническое значение между точностью и отзывом, а ROC AUC — это площадь под кривой ROC. Эти два показателя лучше подходят для оценки производительности модели для несбалансированных данных.

В приведенном ниже коде показано, как применить 5-кратную стратифицированную перекрестную проверку на обучающем наборе и вычислить среднее значение каждой оценки:

Acc: 0.8973
F1: 0.1620
ROC AUC: 0.7253

Хорошо видно, что точность высокая, почти 0,9, но оценка F1 очень низкая из-за низкой отзывчивости. Есть место для тонкой настройки модели и стремления к повышению производительности, и одним из методов является поиск по сетке. Присваивая разные значения гиперпараметрам theRandomForestClassifier, таким как n_estimators max_depth min_samples_split и min_samples_leaf, он будет перебирать комбинации гиперпараметров и выводить тот, который имеет лучшую производительность по интересующему нас показателю. Фрагмент кода показан ниже:

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

 

Performance on Train Set:
Acc: 0.9706
F1: 0.8478
ROC AUC: 0.9952
Performance on Test Set:
Acc: 0.8927
F1: 0.2667
ROC AUC: 0.6957

Производительность на поезде отличная: более 2/3 безнадежных ссуд и все хорошие ссуды правильно классифицированы, и все три показателя эффективности выше 0,84. С другой стороны, когда модель используется на тестовом наборе, результат не совсем удовлетворительный: большинство плохих кредитов помечены как «хорошие», а оценка F1 составляет всего 0,267. Имеются данные о переобучении, поэтому следует прилагать больше усилий к таким итерационным процессам, чтобы повысить производительность модели.

См. также:  ошибка R10 при развертывании приложения Flask с докером на heroku

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

  • Средний баланс транзакции
  • Средняя сумма транзакции
  • Сумма займа
  • Средняя заработная плата
  • Количество дней между созданием учетной записи и подачей заявки на кредит

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

Заключение и дальнейшие направления

В этом посте я представил весь конвейер сквозной модели машинного обучения в банковском приложении, прогнозирование дефолта ссуды с реальным банковским набором данных Berka. Я описал набор данных Berka и отношения между каждой таблицей. Были продемонстрированы шаги и коды того, как импортировать набор данных в базу данных MySQL, а затем подключиться к Python и преобразовать обработанные записи в Pandas DataFrame. Функции были извлечены и преобразованы в массив, готовый для использования в моделях машинного обучения. В качестве последнего шага я подобрал модель случайного леса, используя данные, оценил производительность модели и создал список из 5 основных функций, которые играют роль в прогнозировании дефолта по ссуде.

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

  1. Извлечение дополнительных функций. Из-за ограниченного времени невозможно провести тщательное изучение и получить глубокое представление о наборе данных. В наборе данных все еще есть много неиспользуемых функций, а большая часть информации не была полностью усвоена знаниями в банковской сфере.
  2. Попробуйте другие модели: используется только модель случайного леса, но есть много хороших, таких как логистическая регрессия, XGBoost, SVM или даже нейронные сети. Модели также могут быть дополнительно улучшены за счет более точной настройки гиперпараметров или использования методов ансамбля, таких как упаковка в мешки, усиление и суммирование.
  3. Работа с несбалансированными данными. Важно отметить тот факт, что ссуды по умолчанию составляют лишь около 10% от общих ссуд, поэтому в процессе обучения модель предпочтет предсказывать больше отрицательных, чем положительных результатов. . Мы уже использовали оценку F1 и ROC AUC вместо точности. Однако производительность все еще не так хороша, как могла бы быть. Чтобы решить эту проблему, в будущем могут использоваться другие методы, такие как сбор или повторная выборка дополнительных данных.

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

Обо мне

Я специалист по данным в Chapeau AI. Я использую технологии и каждый день осваиваю новые навыки. Вы можете связаться со мной из Medium Blog, LinkedIn или GitHub.

Пожалуйста, смотрите мои другие статьи:

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: