1. Обзор
В этой лабораторной работе вы будете использовать инструмент What-if для анализа модели XGBoost , обученной на финансовых данных и развернутой на облачной платформе искусственного интеллекта.
Чему вы научитесь
Вы научитесь:
- Обучение модели XGBoost на общедоступном наборе данных по ипотечным кредитам в блокнотах AI Platform Notebooks.
- Разверните модель XGBoost на платформе искусственного интеллекта.
- Проанализируйте модель с помощью инструмента «Что если...».
Общая стоимость запуска этой лабораторной работы в Google Cloud составляет около 1 доллара .
2. Краткое введение в XGBoost.
XGBoost — это фреймворк машинного обучения, использующий деревья решений и градиентный бустинг для построения прогностических моделей. Он работает путем объединения нескольких деревьев решений на основе оценок, связанных с различными листовыми узлами в дереве.
Приведенная ниже диаграмма представляет собой визуализацию простой модели дерева решений, которая оценивает, следует ли проводить спортивный матч, исходя из прогноза погоды:

Почему мы используем XGBoost для этой модели? Хотя традиционные нейронные сети, как было показано, лучше всего работают с неструктурированными данными, такими как изображения и текст, деревья решений часто демонстрируют чрезвычайно хорошие результаты на структурированных данных, таких как набор данных по ипотеке, который мы будем использовать в этом практическом занятии.
3. Настройте свою среду.
Для выполнения этого практического задания вам потребуется проект Google Cloud Platform с включенной функцией оплаты. Чтобы создать проект, следуйте инструкциям здесь .
Шаг 1: Включите API моделей облачной платформы ИИ.
Перейдите в раздел «Модели платформы ИИ» в консоли Cloud Console и нажмите «Включить», если эта функция еще не включена.

Шаг 2: Включите API Compute Engine.
Перейдите в Compute Engine и выберите «Включить», если эта опция еще не включена. Она понадобится для создания экземпляра ноутбука.
Шаг 3: Создайте экземпляр AI Platform Notebooks.
Перейдите в раздел «Блокноты платформы ИИ» в консоли Cloud и нажмите «Создать экземпляр» . Затем выберите последний тип экземпляра TF Enterprise 2.x без графических процессоров :
Используйте параметры по умолчанию, а затем нажмите «Создать ». После создания экземпляра выберите «Открыть JupyterLab» :

Шаг 4: Установите XGBoost
После запуска экземпляра JupyterLab вам потребуется добавить пакет XGBoost.
Для этого выберите «Терминал» в меню запуска:

Затем выполните следующие действия, чтобы установить последнюю версию XGBoost, поддерживаемую платформой Cloud AI Platform:
pip3 install xgboost==0.90
После завершения этого процесса откройте экземпляр Python 3 Notebook из панели запуска. Теперь вы готовы начать работу в своем блокноте!
Шаг 5: Импорт пакетов Python
В первой ячейке вашего блокнота добавьте следующие импорты и запустите ячейку. Вы можете запустить её, нажав кнопку со стрелкой вправо в верхнем меню или нажав комбинацию клавиш Command+Enter:
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. Загрузка и обработка данных
Для обучения модели XGBoost мы будем использовать набор данных по ипотечным кредитам с сайта ffiec.gov . Мы провели предварительную обработку исходного набора данных и создали уменьшенную версию, которую вы можете использовать для обучения модели. Модель будет предсказывать , будет ли одобрена конкретная заявка на ипотечный кредит .
Шаг 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, передав ему указанные выше типы данных. Важно перемешать данные на случай, если исходный набор данных упорядочен определенным образом. Для этого мы используем утилиту shuffle из sklearn , которую мы импортировали в первой ячейке:
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. После выполнения приведенной выше строки вы должны увидеть что-то подобное:

Это те признаки, которые мы будем использовать для обучения нашей модели. Если вы прокрутите страницу до конца, вы увидите последний столбец approved , который и является тем, что мы прогнозируем. Значение 1 означает, что конкретная заявка была одобрена, а 0 — что она была отклонена.
Чтобы увидеть распределение одобренных/отклоненных значений в наборе данных и создать массив numpy с метками, выполните следующую команду:
# Class labels - 0: denied, 1: approved
print(data['approved'].value_counts())
labels = data['approved'].values
data = data.drop(columns=['approved'])
Примерно 66% набора данных содержат утвержденные заявки.
Шаг 3: Создание фиктивного столбца для категориальных значений
Этот набор данных содержит смесь категориальных и числовых значений, но XGBoost требует, чтобы все признаки были числовыми. Вместо представления категориальных значений с помощью one-hot кодирования , для нашей модели XGBoost мы воспользуемся функцией Pandas get_dummies .
get_dummies принимает столбец с несколькими возможными значениями и преобразует его в последовательность столбцов, каждый из которых содержит только нули и единицы. Например, если у нас есть столбец "color" с возможными значениями "blue" и "red", 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 показанный ниже) разделены на несколько столбцов:

Шаг 4: Разделение данных на обучающую и тестовую выборки.
Важным понятием в машинном обучении является разделение данных на обучающую и тестовую выборки. Мы берем большую часть данных для обучения модели, а остальную часть оставляем для тестирования модели на данных, которые она никогда раньше не видела.
Добавьте в свой блокнот следующий код, который использует функцию train_test_split из библиотеки Scikit Learn для разделения данных:
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. Разверните модель на облачной платформе искусственного интеллекта.
Наша модель работает локально, но было бы здорово, если бы мы могли делать прогнозы из любого места (а не только из этого ноутбука!). На этом этапе мы развернем ее в облаке.
Шаг 1: Создайте сегмент облачного хранилища для нашей модели.
Для начала определим несколько переменных окружения, которые мы будем использовать на протяжении всего остального практического занятия. Заполните приведенные ниже значения именем вашего проекта 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
Перейдите в браузер хранилища в вашей облачной консоли, чтобы убедиться, что файл скопирован:

Шаг 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'
Пока процесс выполняется, проверьте раздел «Модели» в консоли вашей платформы ИИ. Вы должны увидеть там развертывание вашей новой версии:

После успешного завершения развертывания вы увидите зеленую галочку на месте индикатора загрузки. Развертывание должно занять 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: Создайте визуализацию с помощью инструмента «Что если».
Чтобы подключить инструмент What-if к моделям вашей платформы ИИ, вам необходимо передать ему подмножество тестовых примеров вместе с истинными значениями для этих примеров. Давайте создадим массив Numpy из 500 наших тестовых примеров вместе с их истинными метками:
num_wit_examples = 500
test_examples = np.hstack((x_test[:num_wit_examples].values,y_test[:num_wit_examples].reshape(-1,1)))
Создать экземпляр инструмента What-if Tool очень просто: достаточно создать объект WitConfigBuilder и передать ему модель платформы ИИ, которую мы хотим проанализировать.
Здесь мы используем необязательный параметр adjust_prediction потому что инструмент What-if ожидает список оценок для каждого класса в нашей модели (в данном случае 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)
Обратите внимание, что загрузка визуализации займет минуту. После загрузки вы должны увидеть следующее:

По оси Y отображается предсказание модели, где 1 означает предсказание с высокой степенью approved , а 0 — предсказание, denied с высокой степенью достоверности. По оси X показано распределение всех загруженных точек данных.
Шаг 2: Изучение отдельных точек данных
По умолчанию в инструменте «Что если» используется вкладка «Редактор точек данных» . Здесь вы можете щелкнуть по любой отдельной точке данных, чтобы просмотреть ее характеристики, изменить значения характеристик и увидеть, как это изменение влияет на прогноз модели для данной точки данных.
В приведенном ниже примере мы выбрали точку данных, близкую к пороговому значению 0,5. Заявка на ипотеку, связанная с этой конкретной точкой данных, поступила от CFPB (Бюро финансовой и потребительской информации США). Мы изменили значение этого параметра на 0, а также изменили значение agency_code_Department of Housing and Urban Development (HUD) на 1, чтобы посмотреть, что произойдет с прогнозом модели, если этот кредит поступит от HUD:

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

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

Выбрав этот пункт, вы увидите точку данных, значения признаков которой наиболее близки к исходной точке, но имеют противоположное предсказание. Затем вы можете просмотреть значения признаков, чтобы увидеть, в чем заключаются различия между двумя точками данных (различия выделены зеленым цветом и жирным шрифтом).
Шаг 4: Изучите графики частичной зависимости.
Чтобы увидеть, как каждая функция влияет на общие прогнозы модели, установите флажок «График частичной зависимости» и убедитесь, что выбран параметр «Глобальный график частичной зависимости» :

Здесь мы видим, что вероятность отказа в выдаче кредитов, предоставляемых HUD, несколько выше. График имеет такую форму, потому что код агентства является логическим параметром, поэтому значения могут быть только равны 0 или 1.
applicant_income_thousands — это числовой показатель, и на графике частичной зависимости видно, что более высокий доход немного увеличивает вероятность одобрения заявки, но только до суммы около 200 000 долларов. После 200 000 долларов этот показатель не влияет на прогноз модели.
Шаг 5: Оценка общей эффективности и справедливости.
Далее перейдите на вкладку «Производительность и справедливость» . Здесь отображаются общие статистические данные о производительности модели на предоставленном наборе данных, включая матрицы ошибок, кривые PR и ROC-кривые.
Выберите mortgage_status в качестве эталонного признака, чтобы увидеть матрицу ошибок:

Эта матрица ошибок показывает процент правильных и неправильных прогнозов нашей модели от общего числа . Если сложить квадраты « Фактическое «Да» / «Прогнозируемое «Да»» и «Фактическое «Нет» / «Прогнозируемое «Нет»» , то суммарная точность должна быть такой же, как у вашей модели (около 87%).
Вы также можете поэкспериментировать с ползунком порогового значения, повышая и понижая оценку положительной классификации, которую модель должна вернуть, прежде чем принять решение о прогнозируемом approved кредита, и посмотреть, как это повлияет на точность, количество ложных срабатываний и ложных отрицаний. В этом случае точность наиболее высока при пороговом значении около 0,55 .
Далее, в раскрывающемся списке «Срез по» слева выберите loan_purpose_Home_purchase :

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

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

Вы можете использовать эту вкладку, чтобы убедиться в сбалансированности вашего набора данных. Например, похоже, что очень мало кредитов в наборе данных было выдано Агентством сельскохозяйственных услуг. Для повышения точности модели мы могли бы рассмотреть возможность добавления большего количества кредитов от этого агентства, если данные доступны.
Здесь мы описали лишь несколько идей для исследования вариантов развития событий с помощью этого инструмента. Не стесняйтесь продолжать экспериментировать с ним, есть еще много областей для изучения!
8. Уборка
Если вы хотите продолжить использование этого блокнота, рекомендуется выключать его, когда он не используется. В интерфейсе блокнотов в вашей облачной консоли выберите блокнот, а затем выберите «Остановить» :

Если вы хотите удалить все ресурсы, созданные в этой лабораторной работе, просто удалите экземпляр блокнота, а не останавливайте его.
В консоли Cloud Console, используя меню навигации, перейдите в раздел «Хранилище» и удалите оба сегмента, созданных для хранения ресурсов вашей модели.
