Кредитный риск: кластеризация неконтролируемых клиентов
Банковское дело - одна из отраслей, активно использующих решения для машинного обучения. В частности, давайте сосредоточимся на области потребительского кредита: это относится к любой операции, в которой участвует частный субъект, которым может быть отдельное лицо, а не семья, и банк. Идея потребительского кредита состоит в том, что банк выиграет от предоставления кредита только в том случае, если клиент не объявит дефолт (то есть не выплатит долг). Действительно, после того, как клиент будет признан кредитоспособным и получит кредит, он вместе с банком составит график погашения, согласно которому он должен будет выплатить не только долг, но и проценты.
Итак, если с одной стороны предоставление кредита является одним из доходов банка (из-за интересов), с другой - это связано с заметным риском. Вот почему много времени и денег вкладывается в анализ истории клиентов, их привычек и вероятности погашения долга.
Для этого банки всегда полагались на статистические модели (особенно скоринговые модели), однако сегодня с помощью алгоритмов машинного обучения их прогнозы относительно будущих выплат намного надежнее.
Первый подход может заключаться в обучении алгоритма на исторических данных о клиентах банка и определении характеристик тех, кто погасил долг, и тех, кто этого не сделал. Затем, когда в банк придет новый клиент, алгоритм оценит его и сообщит, вернет ли он долг.
Как видите, мы говорим о контролируемом обучении: исторические данные снабжены ярлыками (кредитоспособность или некредитоспособность), поэтому алгоритм будет обучаться на обучающем наборе и оцениваться на тестовом наборе.
Однако в этой статье я собираюсь предложить неконтролируемый способ решения проблемы: представьте, что нам предоставляют те же данные, но без какой-либо метки. Что мы хотим сделать, так это сгруппировать наших клиентов и посмотреть, сможем ли мы с помощью этой процедуры получить некоторую релевантную информацию об их кредитоспособности.
Итак, начнем. Набор данных, который я собираюсь использовать, - это набор данных 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)
Как видите, наш алгоритм сгруппировал наших клиентов по трем категориям в соответствии с их характеристиками (которые были сохранены в основном в первых двух основных компонентах).
Следующим шагом аналитика может быть вопрос о причинах такой сегментации и о том, как эти причины могут повлиять на решение банка о предоставлении кредита клиенту определенного кластера.
Сила методов кластеризации заключается в том, что они могут дать релевантные результаты всего за несколько секунд, в то время как анализ всех клиентов вручную занял бы огромное количество времени.