Методы интерпретации прогнозов кредитной модели

~ «Насколько законы математики относятся к реальности, они не точны; и насколько они достоверны, они не относятся к реальности». Эйнштейн

Движение во времени назад или вперед теоретически допустимо за счет комбинации математических схем, смешанных с науками о более высоких измерениях, которые может понять человек. Однако прошлое можно использовать, чтобы заглянуть в будущее с некоторой долей уверенности, поскольку, как это обычно бывает, история повторяется. Это высказывание зависит от человеческой природы, поскольку люди являются основным фактором, создающим историю, поэтому человеческое поведение и действия также можно предвидеть с высокой степенью уверенности. Чтобы зафиксировать эти цепочки мыслей, математические и статистические модели, которые лежат в основе того, как принимаются решения, являются лучшими инструментами для использования прошлых шаблонов, чтобы иметь представление о ближайшем настоящем или, возможно, будущем. Один из способов - основывать решения на сценариях (если и так), где определенный путь можно утопить, используя if & else. Используя эту концепцию, структура if и else может быть расширена для достижения определенного решения. Другой способ — имитировать нервные системы человека, которые связывают сигнальные клетки, которые передают синапсы и провоцируют движение тела человека, а мозг принимает решения о частях тела.

Заявление о нашей миссии

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

  • Модель повышения градиента

Модель повышения градиента

  • Нейронная сеть
  • Логистическая регрессия

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

#Target variable 
loan_status = {'Current': 1, 'Fully Paid':1, 'Late (31-120 days)':0, 'In Grace Period': 1, 'Charged Off': 0, 'Late (16-30 days)': 1, 'Default':0,'Does not meet the credit policy. Status:Fully Paid': 1, 'Does not meet the credit policy. Status:Charged Off':0}

Интерпретация модели

Модель классификации градиентного повышения

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

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

  • Простое дерево решений
  • Подгонка дерева решений к предсказаниям GBM
  • Интерпретация местных наблюдений
  1. Простое дерево решений:
from sklearn.tree import DecisionTreeClassifier
from IPython.display import Image  
from sklearn.externals.six import StringIO  
from sklearn.tree import export_graphviz
import pydotplus
#code to view my feature splitting using dtree
import os
os.environ['PATH'] = os.environ['PATH']+';'+os.environ['CONDA_PREFIX']+r"\Library\bin\graphviz"
dt = DecisionTreeClassifier(max_depth = 5, random_state=1)
# fitting the decision tree model on the training set
dt.fit(X_train, y_train)
plt.figure(figsize=(25,25));
dot_data = StringIO()  
export_graphviz(dt, out_file=dot_data,feature_names=X_train.columns,filled=True,rounded=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
Image(graph.create_png())

2. Сопоставьте прогноз GBM с деревом решений.

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

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

# saving the predictions of Random Forest as new target
new_target = GBModel.predict(X_train)
# defining the interpretable decision tree model
dt_model = DecisionTreeClassifier(max_depth=5, random_state=1)
# fitting the surrogate decision tree model using the training set and new target
dt_model.fit(X_train,new_target)
plt.figure(figsize=(25,25));
dot_data_2 = StringIO()  
export_graphviz(dt_model, out_file=dot_data_2,feature_names=X_train.columns,filled=True,rounded=True)
graph = pydotplus.graph_from_dot_data(dot_data_2.getvalue())  
Image(graph.create_png())

3. LIME (объяснения, не зависящие от локальной интерпретируемой модели)

Лайм объясняет определенное наблюдение локально, по соседству с этим объясняемым предсказанием. Этот пакет очень полезен, когда банк хочет проверить процесс прогнозирования определенного клиента, чтобы узнать, как определенные переменные влияют на вероятность принятия или отклонения этого клиента. Если, например, процентная ставка повлияла на отказ клиента, то уменьшить/увеличить в этой конкретной ситуации.

Исходный код: https://github.com/marcotcr/lime

# import Explainer function from lime_tabular module of lime library
from lime.lime_tabular import LimeTabularExplainer
# creating the explainer function
explainer = LimeTabularExplainer(X_train.values, mode="classification", feature_names=X_train.columns)
# fetching any observation 
customer = 52
X_observation = X_test.iloc[[customer], :]
GBM_model.predict(X_observation)[0]
* 1 
# Model predicted Not Default
# explanation using the gradient boosting
explanation = explainer.explain_instance(X_observation.values[0], best_model.predict_proba)
explanation.show_in_notebook(show_table=True, show_all=False)

Отрицательная (синяя) характеристика обозначает «0» (по умолчанию), а положительная (оранжевая) характеристика обозначает «1» (без значения по умолчанию). Способ интерпретации весов заключается в применении их к вероятностям предсказания. Например, если мы удалим из данных переменные pymnt_plan_y, target_renewable_energy иgrade_G, мы ожидаем, что классификатор предскажет «1» (по умолчанию) с вероятностью 0,90–0,29–0,27–0,15 = 0,19 (19%). Точно так же удаление взноса, hardship_flag_Y и num_tl_120dpd_2m увеличит вероятность предсказания 0 до 0,1 + 0,15 + 0,05 + 0,04 = 0,34.

Модель нейронной сети

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

Для интерпретации нашей модели нейронной сети мы используем следующее:

  • Слой Схема представления новых переменных
  • Нейронная сеть без скрытых слоев
  1. Представление внутреннего слоя:
NN_model.summary()
*Model: "sequential_183"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_547 (Dense)            (None, 5)                 420       
_________________________________________________________________
dense_548 (Dense)            (None, 5)                 30        
_________________________________________________________________
dense_549 (Dense)            (None, 1)                 6         
=================================================================
Total params: 456
Trainable params: 456
Non-trainable params: 0
_________________________________________________________________
import keras.backend as K
inp = NN_model.layers[0].input
out = NN_model.layers[1].output
features_function = K.function([inp], [out])
features_NN = features_function([scaled_test[:6000]])[0]
plt.figure(figsize=(70,30))
plt.scatter(features_NN[:, 0], features_NN[:, 1], c=y_test, cmap='coolwarm')
plt.legend()

На графике синий (0 — отрицательный класс) достаточно отделим от красного (1 — положительный класс). Очевидно, есть определенные совпадения и причина, по которой модель имеет F-показатель около 0,66 для класса 0, а у класса 1 F-показатель равен 0,96. Понимание и визуализация выходных данных на разных уровнях может помочь понять, какой слой вызывает серьезные ошибки в обучающих представлениях! Размеры объектов должны быть уменьшены до 2-D вместо 5-D. Представление 5-D объекта просматривается из 2-D, поэтому мы видим четкий разрез в форме сгруппированных точек данных. Тем не менее, для просмотра четкого двумерного представления размеры объекта должны быть уменьшены с помощью таких методов, как PCA, но это выходит за рамки статьи, однако представление служит цели интерпретации скрытых слоев нейронных сетей.

2. Нейронная сеть только с выходным слоем

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

from sklearn.linear_model import LogisticRegression
from keras.regularizers import l2
from keras.optimizers import SGD
def build_logistic_regression_model():
    model = Sequential()
    model.add(Dense(units=1,kernel_initializer='glorot_uniform', activation='sigmoid',kernel_regularizer=l2(0.)))
    model.compile(optimizer='sgd',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    return model
print(classification_report(y_test,model_logit.predict(scaled_test)))
*              precision    recall  f1-score   support

           0       0.71      0.34      0.46     85363
           1       0.91      0.98      0.94    592829

    accuracy                           0.90    678192
   macro avg       0.81      0.66      0.70    678192
weighted avg       0.89      0.90      0.88    678192

Производительность нейронной сети без слоев недалеко от производительности модели нейронной сети, как показано ниже:

y_pred_best = NN_model.predict(scaled_test)
y_pred_best = (y_pred_best>0.5)
print(classification_report(y_test_select,y_pred_best))
*precision    recall  f1-score   support

         0.0       0.90      0.52      0.66     85363
         1.0       0.94      0.99      0.96    592829

    accuracy                           0.93    678192
   macro avg       0.92      0.76      0.81    678192
weighted avg       0.93      0.93      0.92    678192

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

Логистическая регрессия

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

Логистическая регрессия (Logit) — самая популярная линейная модель для бинарных результатов.

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

Однако интересная тема заключается в том, как нейронную сеть на основе KERAS без скрытого слоя и сигмовидной функции активации можно имитировать в функции логистической регрессии SKLEARN. Вы можете найти ссылку ниже:



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

Вывод

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