Кредитный риск: кластеризация неконтролируемых клиентов

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

Итак, если с одной стороны предоставление кредита является одним из доходов банка (из-за интересов), с другой - это связано с заметным риском. Вот почему много времени и денег вкладывается в анализ истории клиентов, их привычек и вероятности погашения долга.

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

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

Как видите, мы говорим о контролируемом обучении: исторические данные снабжены ярлыками (кредитоспособность или некредитоспособность), поэтому алгоритм будет обучаться на обучающем наборе и оцениваться на тестовом наборе.

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

Итак, начнем. Набор данных, который я собираюсь использовать, - это набор данных German Credit Risk, доступный на Kaggle здесь.

import pandas as pd
df=pd.read_csv(r'german_credit_data.csv')
df=df.dropna()
df=df.drop(['Unnamed: 0'],axis=1)

После импорта и очистки набора данных мне нужно немного его изменить. Действительно, нам предоставляются столбцы с категорией, такие как Пол или Цель, однако алгоритмы представляют собой математические операции, и для них нужны числа, а не строки. Следовательно, я продолжу процедуру кодирования OneHot. Я не буду здесь объяснять идею, но я предоставлю полное объяснение с примерами в этой статье.

df=pd.get_dummies(df,prefix=['Sex','Housing','Saving Account','Checking account','Purpose'], drop_first=True)

Теперь, прежде чем применять наш алгоритм кластеризации, мы должны вспомнить, что, вообще говоря, нам нравятся простые модели. Итак, здесь у нас есть 19 функций (изначально их было 10, но с кодировкой OneHot стало 19), описывающих наших клиентов, но нужны ли нам все они? Нельзя ли уменьшить количество функций, не подрывая модель с точки зрения потери информации?

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

Теперь предположим, что мы хотим уменьшить нашу размерность с 19 до 2:

from sklearn.decomposition import PCA 
pca = PCA(2)  
projected = pca.fit_transform(features)
print(features.shape)
print(projected.shape)

Как видите, из 19 функций мы сейчас обрабатываем только 2.

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

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
wcss = []
K = range(1,15)
for k in K:
    km = KMeans(n_clusters=k)
    km = km.fit(projected)
    wcss.append(km.inertia_)
plt.plot(K, wcss, 'bx-')
plt.xlabel('Number of centroids')
plt.ylabel('WCSS')
plt.title('Elbow Method For Optimal k')
plt.show()

Как видите, оптимальное значение k находится где-то между 3 и 4. Для простоты модели положим k = 3. Итак, давайте посмотрим, как будет работать наш алгоритм:

#converting our projected array to pandas df
pca=pd.DataFrame(projected)
pca.columns=['First component','Second Component']
#build our algorithm with k=3, train it on pca and make predictions
kmeans = KMeans(n_clusters=3, random_state=0).fit(pca)
y_kmeans = kmeans.predict(pca)
#plotting the results 
plt.scatter(pca['First component'], pca['Second Component'], c=y_kmeans, s=50, alpha=0.5,cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=50)
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=50)

Как видите, наш алгоритм сгруппировал наших клиентов по трем категориям в соответствии с их характеристиками (которые были сохранены в основном в первых двух основных компонентах).

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

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