В следующие минуты мы поговорим об этом сквозном проекте, основанном на прогнозировании кредита.

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

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

Для начала важно отметить, что компании — это команды, которые уже работают, поэтому, если мы собираемся делать модель, она должна быть представлена ​​как продукт и, так же, должна быть развернута в облаке с помощью докеров и облачных сервисов. По сути, я говорю о конвейере CI/CD, что означает, что как только я что-то автоматически зафиксирую здесь, ваше развертывание должно произойти в облаке.

При манипулировании данными мы столкнулись с переменными с 20 различными значениями, которые нам нужно закодировать, чтобы сделать их приемлемыми для нашей модели.

def risk(df):

    risk_col = []

    for i in df['PERFORM_CNS.SCORE.DESCRIPTION']:
      if ('Very Low' in i):
          risk_col.append('Very Low Risk')
      elif ('Low' in i):
          risk_col.append('Low Risk')
      elif ('Medium' in i):
          risk_col.append('Medium Risk')
      elif ('High' in i):
          risk_col.append('High Risk')
      elif ('Very High' in i):
          risk_col.append('Very High Risk')
      else: 
          risk_col.append('Not Scored')
    
    df['risk'] = risk_col
    return risk

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

from sklearn.feature_selection import SelectKBest,chi2

n = SelectKBest(score_func = chi2, k = 'all')
catcols = n.fit(df1, train_df['loan_default'])
plt.figure(figsize = (7,5))
sns.barplot(x = catcols.scores_, y = df1.columns)
plt.title('Best Categorical Features')
plt.show()

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

from sklearn.ensemble import ExtraTreesClassifier

model = ExtraTreesClassifier()
model.fit(df1, train_df['loan_default'])

В части анализа числовых характеристик мы не можем отказаться от дополнительных данных учетной записи, поскольку они запрашиваются учреждениями перед предоставлением кредита.

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

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

Из приведенной выше тепловой карты корреляции мы видим, что некоторые функции сильно коррелируют (> 0,75) друг с другом.

• — — освоенная сумма и стоимость активов — 0,75

• — — Perform_cns.score и риск — 0,98

• — — medium_acct_age и credit_history_length — 0,83

• — — no_of_accts и active_accts — 0,76

  • — —sanctioned_amount и psdisbursed_amount — 1

Мы оставляем эти функции, потому что они не самые ранжированные.

to_drop = ['asset_cost','PERFORM_CNS.SCORE','AVERAGE.ACCT.AGE','no_of_accts','psdisbursed_amount','DELINQUENT.ACCTS.IN.LAST.SIX.MONTHS']
train_df=train_df.drop(columns=to_drop)
test_df=test_df.drop(columns=to_drop)

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

# Removing few more outliers/extreme values

train_df = train_df[train_df['disbursed_amount']<250000]
train_df = train_df[train_df['outstanding_amount']<40000000]
train_df = train_df[train_df['sanctioned_amount']<0.800000e+08]
train_df = train_df[train_df['install_amt']<=5.000000e+06]

В части моделирования мы используем стандартный масштабатор и коэффициент инфляции дисперсии. Одной из проблем с корреляцией тепловой карты является определенность причинно-следственной связи. Наличие 2 признаков с мультиколлинеарностью и значения VIF ≥ 10 считаются проблемой.

from statsmodels.stats.outliers_influence import variance_inflation_factor as vif
vf = [vif(Xscaled.values, i) for i in range(X.shape[1])]
pd.DataFrame(vf, index=train_df.drop('loan_default',axis=1).columns, columns=['vif'])

С помощью Sckit-learn мы построили разные модели:

  • — — линейные регрессии
  • — — Классификатор случайного леса
  • — — СветГБМ
  • — — XGBOOST
  • — — суммирование с StackingClassifier, которое состоит в суммировании выходных данных отдельного оценщика и использовании классификатора для вычисления окончательного прогноза.

Чтобы измерить производительность моделей, мы взяли AUC-оценку, F1-оценку единиц и потерю двоичного журнала в качестве показателей производительности.

  • — — Оценка AUC: эта оценка дает нам хорошее представление о том, насколько хорошо работает модель. Если AUC модели A больше, чем у модели B, вы должны практически использовать модель A.
  • — — Оценка F1: используется для оценки бинарных систем классификации.
  • — — Потеря двоичного журнала: измеряет производительность модели классификации, результатом которой является значение вероятности от 0 до 1. Цель нашей модели — минимизировать это значение. Идеальная модель будет иметь log_loss 0

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

Глядя на приведенную выше таблицу, содержащую показатели производительности различных моделей, мы можем четко сказать, что логистическая регрессия с SMOTE работает очень хорошо по сравнению с другими моделями. Он дает хорошие оценки AUC (без переобучения) и лучший показатель F1 (1). Хотя потери двоичного журнала немного выше по сравнению с другими моделями.

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

pickle.dump(lr1, open('lr1.pkl', 'wb'))

Как только это будет закончено, мы перейдем к приложению во Flask. Это не лучшее приложение в мире, потому что мы хотим научить, как использовать облачные инструменты Google и как выполнять сквозной проект.

В облаке Google мы будем использовать эти 3 инструмента: сборка в облаке, реестр контейнеров и запуск в облаке.

У меня уже есть образ докера в формате, который вы видите здесь. Единственное, что вам нужно сделать, это использовать тег docker gcr.io/PROJECT_ID/IMAGE' Теперь, если мы вернемся к изображениям docker, мы увидим, что идентификатор нашего изображения правильный.

Кстати, перед этим я собираюсь убедиться, что у меня действительно есть gcloud.

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

Еще одна команда, которую вы должны выполнить, это gcloud auth configure-docker, чтобы добавить правильные учетные данные, которые нам нужны. Итак, это две команды, с которыми мы должны иметь дело, чтобы убедиться, что мы аутентифицированы.

Загружаем образ докера в gcloud с помощью docker push и видим его в разделе реестра докера

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

Чтобы закончить, мы используем службу облачной сборки для создания триггера, с помощью которого мы подключим его к нашему репозиторию GitHub. Здесь мы укажем, что хотим настроить его с помощью файла cloudbuild.yaml, который нам нужно будет добавить самостоятельно.

В файле cloudbuild.yaml нам просто нужно изменить эти значения на те, которые соответствуют каждому пространству.

steps:
# Build the container image
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/PROJECT_ID/IMAGE', '.']
# Push the container image to Container Registry
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/PROJECT_ID/IMAGE']
# Deploy container image to Cloud Run
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud
  args: ['run', 'deploy', 'SERVICE-NAME', '--image', 'gcr.io/PROJECT_ID/IMAGE', '--region', 'REGION']
images:
- gcr.io/PROJECT_ID/IMAGE

Заходим в настройки, чтобы включить эти два раздела: Service Accounts, Cloud Run

И нам нужно только дать RUN, чтобы он работал идеально.

Итак, теперь этот триггер прослушивает каждый раз, когда мы делаем фиксацию в репозитории github.

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

Это тот, который потерпел неудачу, поэтому образ на самом деле построен правильно, он просто не был правильно развернут.

Если мы перейдем к запуску в облаке, мы увидим на вкладке «Ревизии», что мы получили новое развертывание.

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

Итак, это все, что вам нужно сделать, чтобы взять фляжное приложение и пройти все этапы конвейера CI/CD.

Надеюсь было полезно, спасибо, что дочитали до конца.