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

1. Обзор

В ходе этой лабораторной работы вы будете использовать инструмент «Что, если» для анализа модели XGBoost , обученной на финансовых данных и развернутой на платформе Cloud AI.

Что вы узнаете

Вы узнаете, как:

  • Обучение модели XGBoost на наборе данных по общедоступной ипотеке в блокнотах AI Platform
  • Развертывание модели XGBoost на платформе AI
  • Анализ модели с помощью инструмента «Что, если»

Общая стоимость запуска этой лаборатории в Google Cloud составляет около 1 доллара США .

2. Краткое введение в XGBoost

XGBoost — это платформа машинного обучения, которая использует деревья решений и повышение градиента для построения прогнозных моделей. Он работает путем объединения нескольких деревьев решений на основе оценок, связанных с различными листовыми узлами в дереве.

На диаграмме ниже представлена ​​визуализация простой модели дерева решений, которая оценивает, следует ли проводить спортивную игру, на основе прогноза погоды:

308a0bfc70733abf.png

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

3. Настройте свою среду

Для запуска этой лаборатории кода вам понадобится проект Google Cloud Platform с включенной оплатой. Чтобы создать проект, следуйте инструкциям здесь .

Шаг 1. Включите API моделей облачной платформы искусственного интеллекта.

Перейдите в раздел «Модели платформы AI» в облачной консоли и нажмите «Включить», если он еще не включен.

d0d38662851c6af3.png

Шаг 2. Включите API Compute Engine.

Перейдите к Compute Engine и выберите «Включить» , если он еще не включен. Это понадобится вам для создания экземпляра блокнота.

Шаг 3. Создайте экземпляр AI Platform Notebooks.

Перейдите в раздел «Блокноты AI Platform» в облачной консоли и нажмите «Новый экземпляр» . Затем выберите последний тип экземпляра TF Enterprise 2.x без графических процессоров :

7d16190440ab2e9c.png

Используйте параметры по умолчанию и нажмите «Создать» . После создания экземпляра выберите «Открыть JupyterLab» :

772f8868d3841ba0.png

Шаг 4: Установите XGBoost

Как только ваш экземпляр JupyterLab откроется, вам нужно будет добавить пакет XGBoost.

Для этого выберите Терминал в лаунчере:

28dcf2790ce77c96.png

Затем выполните следующую команду, чтобы установить последнюю версию XGBoost, поддерживаемую Cloud AI Platform:

pip3 install xgboost==0.90

После завершения откройте экземпляр Python 3 Notebook из панели запуска. Вы готовы начать работу в своем блокноте!

Шаг 5. Импортируйте пакеты Python

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

import pandas as pd
import xgboost as xgb
import numpy as np
import collections
import witwidget

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.utils import shuffle
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

4. Загрузите и обработайте данные

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

Шаг 1. Загрузите предварительно обработанный набор данных.

Мы сделали версию набора данных доступной для вас в Google Cloud Storage. Вы можете загрузить его, выполнив следующую команду gsutil в своем блокноте Jupyter:

!gsutil cp 'gs://mortgage_dataset_files/mortgage-small.csv' .

Шаг 2. Прочтите набор данных с помощью Pandas

Прежде чем мы создадим наш DataFrame Pandas, мы создадим описание типа данных каждого столбца, чтобы Pandas правильно читал наш набор данных:

COLUMN_NAMES = collections.OrderedDict({
 'as_of_year': np.int16,
 'agency_code': 'category',
 'loan_type': 'category',
 'property_type': 'category',
 'loan_purpose': 'category',
 'occupancy': np.int8,
 'loan_amt_thousands': np.float64,
 'preapproval': 'category',
 'county_code': np.float64,
 'applicant_income_thousands': np.float64,
 'purchaser_type': 'category',
 'hoepa_status': 'category',
 'lien_status': 'category',
 'population': np.float64,
 'ffiec_median_fam_income': np.float64,
 'tract_to_msa_income_pct': np.float64,
 'num_owner_occupied_units': np.float64,
 'num_1_to_4_family_units': np.float64,
 'approved': np.int8
})

Далее мы создадим DataFrame, передав ему типы данных, указанные выше. Важно перетасовать наши данные, если исходный набор данных упорядочен определенным образом. Для этого мы используем утилиту sklearn под названием shuffle , которую мы импортировали в первую ячейку:

data = pd.read_csv(
 'mortgage-small.csv',
 index_col=False,
 dtype=COLUMN_NAMES
)
data = data.dropna()
data = shuffle(data, random_state=2)
data.head()

data.head() позволяет нам просмотреть первые пять строк нашего набора данных в Pandas. Вы должны увидеть что-то подобное после запуска ячейки выше:

29106b71103235a6.png

Это функции, которые мы будем использовать для обучения нашей модели. Если вы прокрутите страницу до конца, вы увидите последний approved столбец, что мы и прогнозируем. Значение 1 указывает, что конкретная заявка была одобрена, а 0 указывает на то, что она отклонена.

Чтобы просмотреть распределение одобренных/отклоненных значений в наборе данных и создать пустой массив меток, выполните следующее:

# Class labels - 0: denied, 1: approved
print(data['approved'].value_counts())

labels = data['approved'].values
data = data.drop(columns=['approved'])

Около 66% набора данных содержат одобренные приложения.

Шаг 3. Создание фиктивного столбца для категориальных значений

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

get_dummies принимает столбец с несколькими возможными значениями и преобразует его в серию столбцов, каждый из которых содержит только 0 и 1. Например, если бы у нас был столбец «цвет» с возможными значениями «синий» и «красный», get_dummies преобразовал бы его в два столбца с именами «color_blue» и «color_red» со всеми логическими значениями 0 и 1.

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

dummy_columns = list(data.dtypes[data.dtypes == 'category'].index)
data = pd.get_dummies(data, columns=dummy_columns)

data.head()

Когда вы на этот раз просмотрите данные, вы увидите отдельные функции (например, purchaser_type , изображенные ниже), разделенные на несколько столбцов:

83aacfaad626e538.png

Шаг 4. Разделение данных на обучающие и тестовые наборы

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

Добавьте в свой блокнот следующий код, который использует функцию Scikit Learn train_test_split для разделения наших данных:

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

Теперь вы готовы построить и обучить свою модель!

5. Создайте, обучите и оцените модель XGBoost.

Шаг 1. Определите и обучите модель XGBoost.

Создать модель в XGBoost просто. Мы будем использовать класс XGBClassifier для создания модели, и нам просто нужно передать правильный objective параметр для нашей конкретной задачи классификации. В этом случае мы используем reg:logistic поскольку у нас есть проблема двоичной классификации, и мы хотим, чтобы модель выдавала одно значение в диапазоне (0,1): 0 для неутвержденного и 1 для утвержденного.

Следующий код создаст модель XGBoost:

model = xgb.XGBClassifier(
    objective='reg:logistic'
)

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

model.fit(x_train, y_train)

Шаг 2. Оцените точность вашей модели.

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

Затем мы воспользуемся функцией accuracy_score Scikit Learn, чтобы вычислить точность нашей модели на основе того, как она работает на наших тестовых данных. Мы передадим ему основные истинностные значения вместе с прогнозируемыми значениями модели для каждого примера в нашем тестовом наборе:

y_pred = model.predict(x_test)
acc = accuracy_score(y_test, y_pred.round())
print(acc, '\n')

Вы должны увидеть точность около 87% , но ваша будет немного отличаться, поскольку в машинном обучении всегда присутствует элемент случайности.

Шаг 3. Сохраните модель.

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

model.save_model('model.bst')

6. Развертывание модели на облачной платформе AI.

Наша модель работает локально, но было бы неплохо, если бы мы могли делать прогнозы по ней откуда угодно (не только из этого блокнота!). На этом этапе мы развернем его в облаке.

Шаг 1. Создайте корзину Cloud Storage для нашей модели.

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

# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
VERSION_NAME = 'v1'
MODEL_NAME = 'xgb_mortgage'

Теперь мы готовы создать корзину для хранения нашего файла модели XGBoost. Мы укажем Cloud AI Platform на этот файл при развертывании.

Запустите эту команду gsutil из своего блокнота, чтобы создать корзину:

!gsutil mb $MODEL_BUCKET

Шаг 2. Скопируйте файл модели в облачное хранилище.

Далее мы скопируем сохраненный файл модели XGBoost в облачное хранилище. Запустите следующую команду gsutil:

!gsutil cp ./model.bst $MODEL_BUCKET

Откройте браузер хранилища в облачной консоли и убедитесь, что файл скопирован:

31e2567fa0117214.png

Шаг 3. Создайте и разверните модель.

Мы почти готовы развернуть модель! Следующая команда ai-platform gcloud создаст новую модель в вашем проекте. Мы назовем это xgb_mortgage :

!gcloud ai-platform models create $MODEL_NAME --region='global'

Теперь пришло время развернуть модель. Мы можем сделать это с помощью этой команды gcloud:

!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=2.1 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT \
--region='global'

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

342875ba92becad1.png

Когда развертывание завершится успешно, вы увидите зеленую галочку там, где находится индикатор загрузки. Развертывание должно занять 2-3 минуты .

Шаг 4. Протестируйте развернутую модель

Чтобы убедиться, что развернутая модель работает, протестируйте ее с помощью gcloud и сделайте прогноз. Сначала сохраните файл JSON с первым примером из нашего тестового набора:

%%writefile predictions.json
[2016.0, 1.0, 346.0, 27.0, 211.0, 4530.0, 86700.0, 132.13, 1289.0, 1408.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0]

Проверьте свою модель, запустив этот код:

prediction = !gcloud ai-platform predict --model=xgb_mortgage --region='global' --json-instances=predictions.json --version=$VERSION_NAME --verbosity=none

print(prediction)

На выходе вы должны увидеть прогноз вашей модели. Этот конкретный пример был одобрен, поэтому вы должны увидеть значение, близкое к 1.

7. Используйте инструмент «Что, если» для интерпретации вашей модели.

Шаг 1. Создайте визуализацию инструмента «Что, если»

Чтобы подключить инструмент «Что если» к моделям вашей платформы искусственного интеллекта, вам необходимо передать ему подмножество тестовых примеров вместе с основными значениями истинности для этих примеров. Давайте создадим массив Numpy из 500 наших тестовых примеров вместе с их метками истинности:

num_wit_examples = 500
test_examples = np.hstack((x_test[:num_wit_examples].values,y_test[:num_wit_examples].reshape(-1,1)))

Создать экземпляр инструмента «Что если» так же просто, как создать объект WitConfigBuilder и передать ему модель платформы ИИ, которую мы хотим проанализировать.

Мы используем здесь необязательный параметр adjust_prediction , поскольку инструмент «Что если» ожидает список оценок для каждого класса в нашей модели (в данном случае 2). Поскольку наша модель возвращает только одно значение от 0 до 1, мы преобразуем его в правильный формат с помощью этой функции:

def adjust_prediction(pred):
  return [1 - pred, pred]

config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['mortgage_status'])
  .set_ai_platform_model(GCP_PROJECT, MODEL_NAME, VERSION_NAME, adjust_prediction=adjust_prediction)
  .set_target_feature('mortgage_status')
  .set_label_vocab(['denied', 'approved']))
WitWidget(config_builder, height=800)

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

4c0b00e6afcdbe01.png

Ось Y показывает нам прогноз модели, где 1approved прогноз с высокой степенью достоверности, а 0 — прогноз с высокой степенью достоверности, denied . Ось X — это просто разброс всех загруженных точек данных.

Шаг 2. Изучите отдельные точки данных

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

В приведенном ниже примере мы выбрали точку данных, близкую к порогу 0,5. Заявка на ипотеку, связанная с этой конкретной точкой данных, поступила от CFPB. Мы изменили эту функцию на 0, а также изменили значение agency_code_Department of Housing and Urban Development (HUD) на 1, чтобы увидеть, что произойдет с прогнозом модели, если этот кредит вместо этого исходит от HUD:

717620d6a1330479.png

Как мы видим в левом нижнем углу инструмента «Что если», изменение этой функции значительно снизило approved прогноз модели на 32%. Это может указывать на то, что агентство, из которого был получен кредит, оказывает сильное влияние на результаты модели, но нам нужно провести дополнительный анализ, чтобы быть уверенным.

В нижней левой части пользовательского интерфейса мы также можем увидеть истинное значение для каждой точки данных и сравнить его с прогнозом модели:

60ff20ae80ed5e27.png

Шаг 3: Контрафактический анализ

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

ae64fd7abefe5449.png

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

Шаг 4. Посмотрите на графики частичной зависимости

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

72117b5ceb683841.png

Здесь мы видим, что кредиты, выданные HUD, имеют несколько более высокую вероятность отказа. График имеет такую ​​форму, поскольку код агентства является логическим признаком, поэтому значения могут быть только равными 0 или 1.

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

Шаг 5. Изучите общую производительность и справедливость

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

Выберите mortgage_status в качестве основной истинной функции, чтобы увидеть матрицу путаницы:

fe1384ee47699498.png

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

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

Затем в раскрывающемся списке слева выберите «Slice by» : loan_purpose_Home_purchase :

f3f1858d627d57ab.png

Теперь вы увидите производительность по двум подмножествам ваших данных: срез «0» показывает, когда кредит предназначен не для покупки дома, а срез «1» — когда кредит предназначен для покупки дома. Проверьте точность, уровень ложноположительных и ложноотрицательных результатов между двумя срезами, чтобы выявить различия в производительности.

Если вы развернете строки и посмотрите на матрицы путаницы, вы увидите, что модель прогнозирует «одобрение» примерно 70% заявок на получение кредита на покупку жилья и только 46% кредитов, не предназначенных для покупки жилья (точные проценты будут варьироваться в зависимости от ваша модель):

318a8d5a8ffc6bea.png

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

Шаг 6. Изучите распределение функций

Наконец, перейдите на вкладку «Функции» в инструменте «Что если». Это показывает распределение значений для каждого объекта в вашем наборе данных:

48ab3c4879793324.png

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

Здесь мы описали лишь несколько идей исследования инструмента «Что, если». Не стесняйтесь продолжать экспериментировать с этим инструментом, есть еще много областей для изучения!

8. Очистка

Если вы хотите продолжать использовать этот ноутбук, рекомендуется выключать его, когда он не используется. В пользовательском интерфейсе ноутбуков в облачной консоли выберите блокнот и нажмите «Стоп» :

879147427150b6c7.png

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

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