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

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

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

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

Мы будем использовать Jupyter Notebook, чтобы написать короткую программу на Python, охватывающую следующие действия:

  • Сбор данных
  • Исследование и очистка данных
  • Важность функции
  • Сюжет и визуализации

Итак, приступим.

Шаг 1. Получение данных

Мы можем использовать данные Lending club, доступные в открытом доступе, имея реальные точки данных по кредитованию и дефолту. После загрузки данных (файлов csv) их можно загрузить в соответствующую папку в блокноте Jupyter.

Примечание. Если у вас нет записной книжки Jupyter, настоятельно рекомендуется загрузить / установить и anaconda (https://www.anaconda.com/download/).

Шаг 2. Анализ и очистка данных

Импортируйте необходимые пакеты и прочтите набор данных

Отбросьте нерелевантные поля

Проведите базовые исследования

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

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

Преобразуйте критические категориальные значения в соответствующие числа, используя фиктивную

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

Поле процентных ставок кажется полностью испорченным, и нам нужно это исправить.

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

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

plt.hist(df['loan_amnt'],histtype='bar', align='mid', color='red', label=None, stacked=False, normed=None,data=df)

plt.figure(figsize=(10,6))
df[df['loan_status']==0]['int_rate'].hist(alpha=0.5,color='blue',bins=30,label='loan_status=0')
df[df['loan_status']==1]['int_rate'].hist(alpha=0.5,color='orange',bins=30,label='loan_status=1')
plt.legend()
plt.xlabel('int_rate')

Шаг 3. Важно использовать случайные леса

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

#### Use Random Forests for Plot the Importance of Features
print(__doc__)
from sklearn.datasets import make_classification
from sklearn.ensemble import ExtraTreesClassifier
X=np.array(df.drop('loan_status',axis=1))
y=np.array(df['loan_status'])
# Build a forest and compute the feature importances
forest = ExtraTreesClassifier(n_estimators=250,
                              random_state=0)
forest.fit(X, y)
importances = forest.feature_importances_
std = np.std([tree.feature_importances_ for tree in forest.estimators_],
             axis=0)
indices = np.argsort(importances)[::-1]
# Print the feature ranking
print("Feature ranking:")
for f in range(X.shape[1]):
    print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))
Feature ranking:
1. feature 20 (0.124970)
2. feature 24 (0.074578)
3. feature 23 (0.070656)
4. feature 19 (0.067598)
5. feature 18 (0.066329)
6. feature 16 (0.055700)
7. feature 17 (0.054894)
8. feature 25 (0.053542)
9. feature 0 (0.044944)
10. feature 1 (0.044642)
11. feature 2 (0.044474)
12. feature 4 (0.043504)
13. feature 105 (0.027864)
14. feature 3 (0.019966)
15. feature 106 (0.015091)
16. feature 21 (0.015081)
17. feature 104 (0.012508)
18. feature 121 (0.012266)
19. feature 107 (0.008324)
20. feature 111 (0.006282)
21. feature 22 (0.006171)
22. feature 108 (0.005095)
23. feature 110 (0.003950)
24. feature 112 (0.003154)
25. feature 49 (0.002939)
26. feature 118 (0.002719)
27. feature 109 (0.002582)
28. feature 7 (0.002469)
29. feature 77 (0.002402)
30. feature 56 (0.002310)
31. feature 72 (0.002296)
32. feature 79 (0.002294)
33. feature 55 (0.002291)
34. feature 52 (0.002280)
35. feature 66 (0.002280)
36. feature 70 (0.002266)
37. feature 6 (0.002249)
38. feature 84 (0.002242)
39. feature 65 (0.002238)
40. feature 68 (0.002235)
41. feature 9 (0.002233)
42. feature 67 (0.002215)
43. feature 58 (0.002212)
44. feature 51 (0.002210)
45. feature 71 (0.002208)
46. feature 14 (0.002203)
47. feature 15 (0.002199)
48. feature 62 (0.002198)
49. feature 69 (0.002175)
50. feature 57 (0.002153)
51. feature 60 (0.002148)
52. feature 45 (0.002145)
53. feature 5 (0.002130)
54. feature 83 (0.002115)
55. feature 12 (0.002114)
56. feature 73 (0.002112)
57. feature 82 (0.002102)
58. feature 85 (0.002088)
59. feature 50 (0.002071)
60. feature 33 (0.002038)
61. feature 10 (0.001880)
62. feature 78 (0.001859)
63. feature 59 (0.001828)
64. feature 120 (0.001733)
65. feature 63 (0.001660)
66. feature 27 (0.001549)
67. feature 32 (0.001509)
68. feature 61 (0.001481)
69. feature 117 (0.001448)
70. feature 64 (0.001417)
71. feature 11 (0.001401)
72. feature 115 (0.001389)
73. feature 8 (0.001366)
74. feature 119 (0.001329)
75. feature 13 (0.001158)
76. feature 80 (0.001037)
77. feature 100 (0.000837)
78. feature 76 (0.000823)
79. feature 97 (0.000781)
80. feature 116 (0.000766)
81. feature 113 (0.000741)
82. feature 99 (0.000681)
83. feature 81 (0.000679)
84. feature 44 (0.000572)
85. feature 26 (0.000486)
86. feature 40 (0.000466)
87. feature 102 (0.000458)
88. feature 43 (0.000440)
89. feature 42 (0.000400)
90. feature 98 (0.000398)
91. feature 38 (0.000395)
92. feature 101 (0.000348)
93. feature 41 (0.000345)
94. feature 48 (0.000344)
95. feature 35 (0.000343)
96. feature 103 (0.000343)
97. feature 39 (0.000342)
98. feature 37 (0.000333)
99. feature 34 (0.000305)
100. feature 47 (0.000272)
101. feature 53 (0.000272)
102. feature 46 (0.000271)
103. feature 36 (0.000264)
104. feature 31 (0.000135)
105. feature 54 (0.000131)
106. feature 75 (0.000103)
107. feature 30 (0.000052)
108. feature 29 (0.000045)
109. feature 74 (0.000034)
110. feature 28 (0.000004)
111. feature 114 (0.000000)
112. feature 93 (0.000000)
113. feature 91 (0.000000)
114. feature 90 (0.000000)
115. feature 89 (0.000000)
116. feature 96 (0.000000)
117. feature 88 (0.000000)
118. feature 87 (0.000000)
119. feature 95 (0.000000)
120. feature 86 (0.000000)
121. feature 94 (0.000000)
122. feature 92 (0.000000)

Выполнение этого шага может занять значительное время в зависимости от размера. Так что наберитесь терпения :-)

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

Шаг 4 - График и визуализации

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

# Plot the feature importances of the forest
plt.figure()
plt.title("Feature importances")
plt.bar(range(X.shape[1]), importances[indices],
       color="r", yerr=std[indices], align="center")
plt.xticks(range(X.shape[1]), indices)
plt.xlim([-1, X.shape[1]])
plt.show()

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

# Plot to show the most important 10 Features
p = importances[indices][:10]
q=indices[:10]
plt.figure()
plt.title("Feature importances")
plt.bar(range(10), p,
    color="r", yerr=std[q], align="center")
plt.xticks(range(10), q)
plt.xlim([-1,10])
plt.show()

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

Спасибо за прочтение - если вы нашли эту статью интересной и хотели бы оставаться на связи, вы можете найти меня в Twitter здесь или LinkedIn