Ни для кого не секрет, что кредитный скоринг — это вполне распространенная практика оценки заемщика. Чтобы условный чернорабочий с зарплатой 40 тысяч не взял 5 ипотек, а страна не превратилась в одну большую "Игру на понижение"...
И, в том числе ни для кого не секрет, что в современном мире лимит кредитной карты начисляет не банковский сотрудник, но нейросеть или попросту алгоритм машинного обучения.
Но кредиты и займы — это не единственные формы обязательств, в любом случае "банкротами" и "неплатильщиками" могут оказаться и крупные компании.
Оценка рисков позволяет привязать, например, степень надежности облигаций (расписка о возвращении денег) через понимание потенциального успеха компании.
Может завтра местное ООО "Пивторгном" обанкротится и от занятых 2млн рублей останется лишь 1? Подобные скоринги компаний называются failure score (индекс финансового риска, ИФР).
Тем более скорингу подвергаются компаний на наличие мошеннических схем – fraud score (индекс должной осмотрительности, ИДО) – так называется подобная система оценки компаний наподобии автомойки Уолтера Уайта...
В этой статье мы коснемся, прежде всего, кредитного скоринга и узнаем, почему условным "молодым" взрослым не выдавали даже минимальные кредиты...
Традиционные системы скоринга: линейная регрессия
До недавнего времени большинство моделей оценки кредитного риска основывались на анализе прошлых платежных схем с использованием статистических алгоритмов: линейная и логистическая регрессия.
Эти традиционные модели кредитного скоринга работали путем нахождения весов для cтатичных факторов, влияющих на кредитоспособность заемщика.
Линейная регрессия просто моделирует зависимость между зависимой переменной (в данном случае, вероятностью дефолта) и одной или несколькими независимыми переменными, например, уровнем дохода, возрастом, кредитной историей).
Модель строится на основе минимизации суммы квадратов ошибок между предсказанными и фактическими значениями зависимой переменной.
Получается, что условный семьянин-отец с доходом 50к рублей не получал кредитный лимит в 500 тысяч рублей по понятным причинам. Но банки стремятся заработать на заемщиках: нужно больше клиентов, но меньше дефолтов. Это противоречие вынуждает банки постоянно совершенствовать системы скоринга.
Если молодой человек 19 лет, достаточно обстоятельный и ответственный, живет с родителями и берет кредит, которая превышает его зарплату в два раза — он вполне способен погасить задолженность.
С другой стороны, мужчина с престижной зарплатой не сможет даже оплатить минимальный платеж из-за развитой лудомании. В реальной жизни "добросовестность" не определяется исключительно уровнем дохода или возрастом.
Финансовая организация задаёт параметры оценки заёмщика: возраст, семейный статус, место проживания, работы, наличие собственности, требования к кредитной истории, размеру дохода, но и результаты судебных разбирательств, налоговая отчетность... И это зачастую не все дополнительные данные.
Банковский софт анализирует гораздо более разнородные показатели: кроме платёжеспособности он прогнозирует поведение заёмщика, оценивает уровень его финансовой дисциплины, ситуацию в семье (наличие детей, например), карьерные перспективы. То, о чем мы говорили выше.
Несмотря на свою простоту и интерпретируемость, линейная регрессия имеет ограниченную применимость в контексте кредитного скоринга, так как часто не может адекватно захватывать сложные, нелинейные зависимости в данных, о которых ниже пойдет речь.
Логистическая регрессия, в отличие от линейной, используется для бинарной классификации — она вычисляет вероятность наступления события, дефолта.
Логистическая регрессия моделирует логарифм шансов наступления события как линейную комбинацию независимых переменных.
А независимые переменные – те самые легко определимые возраст и пол, уровень дохода.
Этот метод, в отличие от метода наименьших квадратов, который используется в линейной регрессии, лучше подходит для задач, где зависимая переменная является категориальной (как в нашем случае).
В контексте кредитного скоринга зависимая переменная представляет собой бинарный индикатор, который указывает на факт дефолта (или его отсутствие) по кредиту.
Допустим, у нас есть таблица, которая содержит следующие колонки:
Возраст (Age): Возраст клиента.
Доход (Income): Годовой доход клиента.
Кредитная история (Credit_History): Информация о том, есть ли у клиента предыдущие кредитные задолженности (0 — нет, 1 — есть).
Овердрафт (Overdraft): Информация о том, использует ли клиент овердрафт (0 — нет, 1 — да).
Платежеспособность (Creditworthy): Целевая переменная, обозначающая, вернет ли клиент кредит вовремя (0 — нет, 1 — да).
Последний показатель – вероятность дефолта.
Возраст | Доход | Кредитная история | Овердрафт | Платежеспособность |
25 | 30000 | 0 | 0 | 1 |
45 | 60000 | 1 | 1 | 0 |
35 | 50000 | 0 | 0 | 1 |
50 | 70000 | 1 | 0 | 0 |
29 | 40000 | 0 | 1 | 1 |
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
# Создаем DataFrame
data = {
'Возраст': [25, 45, 35, 50, 29],
'Доход': [30000, 60000, 50000, 70000, 40000],
'Кредитная история': [0, 1, 0, 1, 0],
'Овердрафт': [0, 1, 0, 0, 1],
'Платежеспособность': [1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)
# Определяем независимые переменные (features) и зависимую переменную (target)
X = df[['Возраст', 'Доход', 'Кредитная история', 'Овердрафт']]
y = df['Платежеспособность']
# Разделяем данные на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Создаем модель логистической регрессии
model = LogisticRegression()
# Обучаем модель
model.fit(X_train, y_train)
# Делаем прогнозы
y_pred = model.predict(X_test)
# Оценка модели
print("Матрица ошибок:")
print(confusion_matrix(y_test, y_pred))
print("\nОтчет о классификации:")
print(classification_report(y_test, y_pred))
# Печать коэффициентов модели
print("Коэффициенты модели:")
print(f"Коэффициенты: {model.coef_}")
print(f"Свободный член: {model.intercept_}")
# Визуализация коэффициентов
features = X.columns
coefficients = model.coef_.flatten()
plt.figure(figsize=(10, 6))
plt.bar(features, coefficients)
plt.xlabel('Факторы')
plt.ylabel('Коэффициенты')
plt.title('Коэффициенты модели логистической регрессии')
plt.show()
# Построение графика зависимости вероятности от возраста
# Создаем данные для предсказания
age_range = np.linspace(20, 60, 100)
X_age = np.zeros((100, X.shape[1])) # Инициализация массива с нулями
X_age[:, 0] = age_range # Устанавливаем возраст
X_age[:, 1] = np.mean(df['Доход']) # Используем среднее значение дохода
X_age[:, 2] = np.mean(df['Кредитная история']) # Используем среднее значение кредитной истории
X_age[:, 3] = np.mean(df['Овердрафт']) # Используем среднее значение овердрафта
# Прогнозируем вероятность
probabilities = model.predict_proba(X_age)[:, 1]
# Построение графика
plt.figure(figsize=(10, 6))
plt.plot(age_range, probabilities, color='blue', marker='o')
plt.xlabel('Возраст')
plt.ylabel('Вероятность возврата кредита вовремя')
plt.title('Зависимость вероятности от возраста')
plt.grid(True)
plt.show()
Выводимые коэффициенты позволяют понять влияние каждого фактора на вероятность дефолта, что имеет критическое значение для принятия решений в области кредитования.
С точки зрения жизненной мудрости – примитивный подход. Мы приводим крайне упрощенный пример, в реальности предоставляемые банками данные еще предстоит поправлять – в них зачастую много пропусков, а датасет смещен.
Важно отметить, что логистическая регрессия предполагает отсутствие мультиколлинеарности среди предикторов, так как высокая корреляция между независимыми переменными может привести к нестабильным оценкам коэффициентов.
Да и в целом, как мы знаем, высокая размерность (внушительное число параметров) приводит к своеобразным проблемам с обучаемостью.
А это проблема с точки зрения выяснения взаимозависимостей и исследовательской работы для банков. А, как мы знаем, банку нужно как можно больше закономерностей, чтобы кредитовать “на первый взгляд” даже неплатежеспособных клиентов.
Достаточно просто определить вероятность дефолта заемщика — коэффициенты модели можно трактовать как изменение логарифма шансов наступления, но и этого недостаточно, чтобы набрать много добросовестных кредитных клиентов.
Причем возникают проблемы при добавлении новых данных.
Конечно, зачастую банки используют не только чистую логистическую регрессию, но и условный градиентный бустинг с ансамблированием нейронок.
Вполне адекватным выбором при подсчете классического скоринга может выступать и деревья решений или случайный лес. Даже с достаточной глубиной деревьев можно относительно просто интерпретировать модель и подсмотреть разбития.
Условно, оборачиваемые средства каким-нибудь “посредником” казино – схема пустого перегона денег, который не говорит о владельце должным счетом ничего. Тут подключается дополнительный скоринг, который определяет “перегонщиков” денег и блокирует банковские кабинеты по ФЗ-115. В этом смысле система скоринга гораздо разветленнее: нужно отделить мошенников, неплатежеспособных клиентов, “дропов” и т. д.
Хотя логистическая регрессия практически всегда остается завершающим звеном единой модели скоринга в банке — она работает как конечная предсказательная модель, а не как стартовая.
Логистическая регрессия также требует балансировки выборки, особенно в случае, когда количество дефолтов значительно меньше, чем количество успешных кредитов.
А ведь это проблема… Банк старается выдавать кредиты платежеспособным и ответственным клиентам, поэтому число дефолтов в банковской практике значительно ниже, чем число позитивных кейсов.
Особенность банковской системы приводит к изначально неуравновешенному датасету. К слову, именно поэтому банки любят создавать “эксперименты” и выдавать кредиты сомнительным заемщикам, как бы проясняя дополнительные паттерны.
Впрочем, традиционный скоринг применялся много лет, ведь информацию о поведении пользователя брать было неоткуда: у нас его паспортные данные, транзакции, переходящие с карты на карту средства, небольшой список имущества... Что еще?
Да ничего. С появлением интернета, кучи данных в открытых источниках о человеке – банки получили доступ к продвинутому скорингу. Вот только… как интерпретировать столь много сложных и неструктурированных данных?
Теперь проблемой становится определение “предикторов”, тех самых признаков, которые станут мерилом и покажут настоящее лицо заемщика. Но дело касается не только интерпретации некоторых сырых данных, но и последовательных.
Причем транзакции сами по себе хранят внушительное число закономерностей, которые даже чуткий глаз банковского сотрудника определить не сможет. Тут должны вступить другие модели – нейросети, которые бы отыскивали последовательные данные.
Итого: банки определяют вероятности дефолтов классически через логистические регрессии, деревья решений или попросту ансамблирование нейронок через тот же градиентный бустинг. Но обычно такие методы поддерживают только готовые, статичные и структурированные табличные данные. Никаких транзакций, истории кредитования.
Из-за этого поведенческие “факторы” куда-то уплывают и мы получаем иногда “безответственных” богатеев в списках одобренных к кредитованию…
С появлением смартфонов, доступностью интернета стали доступны новые типы данных.
Теперь данные могут быть полуструктурированными, неструктурированными и по-настоящему Big, но они могут обеспечить детализированное понимание клиента и его кредитоспособности.
Речь о том же Behavioral-scoring – он оценивает кредитоспособность клиента на основе его текущего поведения и использования кредитных продуктов.
Хотя некоторые банки активно заявляют о работе личного отдела по заботе о "клиентах" с просрочками – в реальности вторичную или первичную оценку проводят именно модели машинного обучения.
Бустинговая модель на табличных данных учитывает статические характеристики клиентов: демографические данные, уровень доходов, длительность занятости и другие факторы, не зависящие от времени.
А Behavioral или попросту поведение – всегда временное понятие.
А амбассадором решений проблем последовательных, временных данных остается рекуррентная архитектура. Поэтому с течением, как ни странно, времени банки стали интегрировать нейросети.
Реккурентные сети на последовательных данных заемщиков…
Речь идет о модели на карточных транзакциях, модели на транзакциях расчетного счета и модели на данных кредитных историй.
В дополнение к этим последовательным моделям разрабатывается бустинговая модель на табличных данных. Они почти всегда работают в тандеме. Тут же статья от Альфа-Банка с единой нейросетью для кредитного скоринга, где конечным звеном в цепочке ансамбля моделей остается логистическая регрессия, которая работает с выводами других нейронок.
Поэтому единая сеть выстраивается по принципу ансамблирования дерева решений и RNN. Задача банка охватить наибольший объем данных, принимать решения из большего числа факторов. Нужно как можно больше выданных кредитов, как можно меньше дефолтов.
Модель на карточных транзакциях фокусируется на анализе покупок и платежей, совершаемых клиентами с использованием их кредитных или дебетовых карт.
Используются рекуррентные нейронные сети (RNN) или их более сложные варианты: долгосрочная краткосрочная память (LSTM) или сети с гейтированным рекуррентным блоком (GRU) используются повсеместно.
Напоминаем, что ключевой минус рекуррентных нейронок – постепенный процесс забывания данных, а значит при большом числе “операций” с кредитками можно случайно потерять парочку разрушительных просрочек клиента. LSTM и GRU частично решают эту проблему.
В случае с подсчетом транзакций модели выявляют паттерны в поведении клиентов, которые сигнализируют о потенциальных финансовых затруднениях или, наоборот, о стабильности их финансового состояния.
Например, резкое увеличение расходов или частые задержки платежей могут быть индикаторами повышенного риска дефолта. Или, наоборот, постоянный оборот средств сигнализирует о незаконной предпринимательской деятельности или буквально “оборотке”. Как мы знаем, оборот не равно чистая прибыль.
После приема на расчетный счет ИП средств, можно вычислить долю поступаемых оттуда денег на личные карты и “прикинуть”, сколько предприниматель может вывести из своего оборота. Очень умозрительный пример, но показательный.
Тем более, банки уведомлены, куда клиент отправляет свои деньги, когда оплачивает что-то карточкой. Условный бар “Доски” и транзакций на 100тыс. с учетом зарплаты в 140 тыс. может наводить на интересные мысли.
Модель на транзакциях расчетного счета анализирует движения средств на банковских счетах клиентов, включая депозиты, снятия средств, переводы и другие операции.
Важно учитывать как регулярные паттерны (например, ежемесячные зарплатные поступления), так и аномалии (например, крупные снятия средств или частые переводы на счета третьих лиц), которые указывают на изменения в финансовом положении клиента.
Модель на данных кредитных историй анализирует последовательности событий, связанных с кредитной деятельностью клиентов, таких как выдача кредитов, график их погашения, случаи просрочек и реструктуризации долгов.
Данные получают из ОКБ, НБКИ и Эквифакса, т.е из бюро кредитных историй. Все в формате многомерных массивов, который интерпретируются в эмбендинги, с которыми уже можно работать.
В процессе интерпретации применяются сложные нелинейные функции активации, по типу ReLU или ELU, что позволяет модели выявлять и классифицировать скрытые паттерны и аномалии, указывающие на потенциальные кредитные риски.
Для начала, предположим, что у нас есть данные о транзакциях клиентов в виде временных рядов. Например, данные включают нформацию о суммах транзакций, типах транзакций и временных метках.
Необходимо преобразовать данные в формат, удобный для подачи в RNN. Например, мы можем использовать последовательности транзакций за неделю, где каждая транзакция имеет несколько признаков (например, сумма транзакции, тип и т.д.).
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
# Загрузка и подготовка данных
def load_and_preprocess_data(file_path):
data = pd.read_csv(file_path)
# Преобразование временных меток
data['timestamp'] = pd.to_datetime(data['timestamp'])
data.set_index('timestamp', inplace=True)
# Нормализация данных
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
return data_scaled
data_scaled = load_and_preprocess_data('transactions.csv')
# Создание последовательностей для RNN
sequence_length = 7 # Неделя
generator = TimeseriesGenerator(data_scaled, data_scaled, length=sequence_length, batch_size=32)
Теперь создадим модель RNN. Мы будем использовать LSTM (Long Short-Term Memory) ячейки, поскольку они хорошо справляются с задачами, связанными с долгосрочной зависимостью.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# Определение модели
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(sequence_length, data_scaled.shape[1])))
model.add(Dense(1)) # Выходной слой для предсказания кредитного рейтинга
model.compile(optimizer='adam', loss='mean_squared_error')
# Обучение модели
model.fit(generator, epochs=20)
Тоже крайне упрощенный пример, тем не менее, примерно показать скоринг можно.
Хоть и нейросети – топ для нынешнего скоринга банков. Но и у классических систем есть плюс. Традиционные модели относительно прозрачны, как те же деревья решений.
“Прошлый год прошел под знаком GDPR. В Общем регламенте ЕС по защите данных говорится: «Вы должны объяснить, как вы обрабатываете данные, в «краткой, прозрачной, понятной и легкодоступной форме, используя ясный и простой язык”.
Поэтому банки могут объяснить, как данные использовались или обрабатывались. А вот с использованием нейронок, американской компании сложно понять, почему 50 негритянских семей не получили ипотеку и остались без заветного жилья.
Нейросети ошибаются и тоже могут быть предвзятыми – молодые взрослые остаются без ипотеки и тянут лямку снятия жилья. Если в нашей стране выдача ипотеки сопровождается “потным” подсчетом переплаты за квартиру в пять раз, то для некоторых стран получение кредитов – вопрос серьезный.
Проблема черного ящика – настоящая проблема, так как рекомендательную систему сложно обвинить в политической дискриминации, а вот банк со своим ансамблем CNN – вполне.
End-to-end модели или тотальный контроль
Очевидно, что ансамблирование нейронок (фактические тупое логическое суммирование предсказаний) – небольшой костыль.
Мир сложен и разнообразен, поэтому логистические регрессии могут получать на вход данные совершенно противоречивые. Тут, по кредитной истории, очевидно, что наш клиент завалит кредит и не ответит на звонки коллекторов. А по транзакциям, наш товарищ, наконец, встал на ноги…
Хотя обычно вероятностям на основе транзакций присваиваются меньшие коэффициенты значимости – иногда они важнее других параметров, особенно табличных. Поэтому банки заинтересованы в создании непрерывной сети, end-to-end модели без простого логического суммирования.
Хотя Альфа-Банк решил эту проблему интересным способом: не создавали end-to-end модель, но и не суммировали score отдельных нейронок/классических моделей – они переводили результаты работы нейронок в эмбендинги, куда зашивалась дополнительная информация.
Лишь после получения числа эмбендингов работы разных моделей – из них составлялась регрессия, которая формировала совокупность коэффициентов и выводила конкретный score.
Но банки стремятся универсализировать свои модели, искать больше закономерностей, чтобы дать как можно больше кредитов и получить, как можно меньше дефолтов.