Analiza finansowego modelu ML wdrożonego w Cloud AI Platform za pomocą narzędzia What-If

1. Omówienie

W tym module użyjesz narzędzia What-If, aby przeanalizować model XGBoost wytrenowany na danych finansowych i wdrożony w Cloud AI Platform.

Czego się dowiesz

Poznasz takie zagadnienia jak:

  • Wytrenuj model XGBoost na publicznym zbiorze danych hipotecznych w Notatnikach w AI Platform
  • Wdrażanie modelu XGBoost w AI Platform
  • Przeprowadź analizę modelu za pomocą narzędzia What-If

Całkowity koszt uruchomienia tego modułu w Google Cloud wynosi około 1 USD.

2. Szybki kurs XGBoost

XGBoost to platforma systemów uczących się, która do tworzenia modeli prognozujących wykorzystuje drzewa decyzyjne i wzmacnianie gradientu. Łączy wiele drzew decyzyjnych na podstawie wyniku powiązanego z różnymi węzłami liści w drzewie.

Poniższy diagram przedstawia wizualizację prostego modelu drzewa decyzyjnego, który na podstawie prognozy pogody ocenia, czy należy rozegrać mecz sportowy:

308a0bfc70733abf.png

Dlaczego w tym modelu używamy XGBoost? Wykazano, że tradycyjne sieci neuronowe radzą sobie najlepiej w przypadku nieuporządkowanych danych, takich jak obrazy i tekst. Jednak drzewa decyzyjne często radzą sobie bardzo dobrze w przypadku uporządkowanych danych, takich jak zbiory danych hipotecznych, których użyjemy w tym ćwiczeniu z programowania.

3. Skonfiguruj środowisko

Aby uruchomić to ćwiczenia z programowania, musisz mieć projekt Google Cloud Platform z włączonymi płatnościami. Aby utworzyć projekt, postępuj zgodnie z tymi instrukcjami.

Krok 1. Włącz Cloud AI Platform Models API

Przejdź do sekcji Modele AI Platform w konsoli Cloud i kliknij Włącz, jeśli ta opcja nie jest jeszcze włączona.

d0d38662851c6af3.png

Krok 2. Włącz Compute Engine API

Przejdź do Compute Engine i wybierz opcję Włącz, jeśli nie jest jeszcze włączona. Będzie Ci to potrzebne do utworzenia instancji notatnika.

Krok 3. Utwórz instancję Notatników w AI Platform

Przejdź do sekcji Notatników AI Platform w konsoli Cloud i kliknij Nowa instancja. Następnie wybierz najnowszy typ instancji TF Enterprise 2.x bez GPU:

7D16190440ab2e9c.png

Użyj opcji domyślnych i kliknij Utwórz. Po utworzeniu instancji wybierz Otwórz JupyterLab:

772f8868d3841ba0.png

Krok 4. Zainstaluj XGBoost

Po otwarciu instancji JupyterLab dodaj pakiet XGBoost.

Aby to zrobić, wybierz Terminal w programie uruchamiającym:

28dcf2790ce77c96.png

Następnie uruchom to polecenie, aby zainstalować najnowszą wersję XGBoost zgodną z Cloud AI Platform:

pip3 install xgboost==0.90

Po zakończeniu otwórz instancję notatnika w Pythonie 3 z programu uruchamiającego. Możesz zacząć korzystać z notatnika.

Krok 5. Zaimportuj pakiety Pythona

W pierwszej komórce notatnika dodaj poniższe importy i uruchom komórkę. Aby go uruchomić, naciśnij przycisk ze strzałką w prawo w górnym menu lub naciśnij Command i 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. Pobieranie i przetwarzanie danych

Do wytrenowania modelu XGBoost użyjemy zbioru danych o kredytach hipotecznych z ffiec.gov. Przeprowadziliśmy wstępne przetwarzanie pierwotnego zbioru danych i utworzyliśmy jego mniejszą wersję, której możesz używać do trenowania modelu. Model przewiduje, czy dany wniosek o kredyt hipoteczny zostanie rozpatrzony pozytywnie.

Krok 1. Pobierz wstępnie przetworzony zbiór danych

Udostępniliśmy Ci wersję zbioru danych w Google Cloud Storage. Możesz go pobrać, uruchamiając w notatniku Jupyter to polecenie gsutil:

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

Krok 2. Odczytaj zbiór danych za pomocą usługi Pandas

Przed utworzeniem ramki DataFrame biblioteki Pandas utworzymy instrukcję dla typu danych każdej kolumny, tak aby firma Pandas prawidłowo odczytała nasz zbiór danych:

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
})

Następnie utworzymy element DataFrame, przekazując do niej typy danych określone powyżej. Dane należy tasować, jeśli oryginalny zbiór danych jest uporządkowany w określony sposób. Do tego celu użyliśmy narzędzia sklearn o nazwie shuffle, które zaimportowaliśmy w pierwszej komórce:

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() umożliwia nam podgląd pierwszych 5 wierszy zbioru danych w usłudze Pandas. Po uruchomieniu kodu z górnej komórki zobaczysz coś takiego:

29106b71103235a6.png

Oto funkcje, których będziemy używać do trenowania naszego modelu. Jeśli przewiniesz do końca, zobaczysz ostatnią kolumnę approved, którą zgodnie z przewidywaniami przewidujemy. Wartość 1 oznacza, że dany wniosek został zatwierdzony, a 0 oznacza, że został odrzucony.

Aby zobaczyć rozkład zatwierdzonych / odrzuconych wartości w zbiorze danych i utworzyć tablicę numpy etykiet, uruchom to polecenie:

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

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

Około 66% zbioru danych zawiera zatwierdzone aplikacje.

Krok 3. Utwórz zastępczą kolumnę dla wartości kategorialnych

Ten zbiór danych zawiera zarówno wartości kategorialne, jak i liczbowe, przy czym XGBoost wymaga, aby wszystkie cechy miały wartości liczbowe. Zamiast reprezentować wartości kategorialne za pomocą kodowania jednorazowego, w naszym modelu XGBoost użyjemy funkcji Pandas get_dummies.

get_dummies pobiera kolumnę z wieloma możliwymi wartościami i przekształca ją w serię kolumn, z których każda ma tylko 0 i 1. Jeśli np. mamy kolumnę „kolor”, z możliwymi wartościami „niebieski” i „czerwony”, get_dummies spowoduje przekształcenie tej wartości w 2 kolumny o nazwie „color_blue” i „color_red” ze wszystkimi wartościami logicznymi 0 i 1.

Aby utworzyć fikcyjne kolumny dla naszych cech kategorialnych, uruchom ten kod:

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

data.head()

Podczas wyświetlania podglądu danych tym razem zobaczysz pojedyncze funkcje (np. purchaser_type na ilustracji poniżej) podzielone na wiele kolumn:

83aacfaad626e538.png

Krok 4. Podziel dane na zbiory do trenowania i testowania

Ważną koncepcją w przypadku systemów uczących się jest podział na trenowanie i testy. Większości naszych danych użyjemy do trenowania naszego modelu, a resztę pozostawimy na przetestowanie modelu na podstawie nieznanych wcześniej danych.

Dodaj do notatnika poniższy kod, który używa funkcji Scikit Learn train_test_split do podziału danych:

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

Możesz teraz utworzyć i wytrenować model.

5. Zbuduj, wytrenuj i oceń model XGBoost

Krok 1. Zdefiniuj i wytrenuj model XGBoost

Tworzenie modelu w XGBoost jest proste. Do utworzenia modelu użyjemy klasy XGBClassifier, wystarczy przekazać odpowiedni parametr objective dla konkretnego zadania klasyfikacji. W tym przypadku używamy funkcji reg:logistic, ponieważ mamy problem z klasyfikacją binarną i chcemy, aby model generował jedną wartość z zakresu (0,1): 0 – niezatwierdzone i 1 – zatwierdzone.

Ten kod utworzy model XGBoost:

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

Możesz wytrenować model za pomocą 1 wiersza kodu, wywołując metodę fit() i przekazując mu dane treningowe oraz etykiety.

model.fit(x_train, y_train)

Krok 2. Oceń dokładność modelu

Możemy teraz używać wytrenowanego modelu do generowania prognoz na podstawie danych testowych za pomocą funkcji predict().

Następnie użyjemy funkcji accuracy_score Scikit Learn, aby obliczyć dokładność naszego modelu na podstawie jego skuteczności na podstawie danych testowych. Przekażemy do niego wartości danych podstawowych (ground truth) wraz z prognozowanymi wartościami modelu dla każdego przykładu w naszym zbiorze testowym:

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

Dokładność powinna wynosić około 87%, ale wartość ta będzie nieco inna, ponieważ w uczeniu maszynowym zawsze występuje element losowości.

Krok 3. Zapisz model

Aby wdrożyć model, uruchom ten kod w celu zapisania go w pliku lokalnym:

model.save_model('model.bst')

6. Wdróż model w Cloud AI Platform

Nasz model działa lokalnie, ale przydałoby się prognozowanie z dowolnego miejsca (nie tylko z tego notatnika). W tym kroku wdrożymy go w chmurze.

Krok 1. Utwórz zasobnik Cloud Storage dla naszego modelu

Najpierw zdefiniujmy kilka zmiennych środowiskowych, których będziemy używać w dalszej części tego ćwiczenia. Wypełnij poniższe wartości, wpisując nazwę projektu Google Cloud, nazwę zasobnika Cloud Storage, który chcesz utworzyć (musi być globalnie unikalna) oraz nazwę wersji pierwszej wersji modelu:

# 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'

Teraz możemy utworzyć zasobnik na dane, w którym będzie przechowywany plik modelu XGBoost. Podczas wdrażania wskażemy ten plik Cloud AI Platform.

Aby utworzyć zasobnik, uruchom to polecenie gsutil z poziomu notatnika:

!gsutil mb $MODEL_BUCKET

Krok 2. Skopiuj plik modelu do Cloud Storage

Następnie skopiujemy plik zapisanego modelu XGBoost do Cloud Storage. Uruchom to polecenie gsutil:

!gsutil cp ./model.bst $MODEL_BUCKET

Otwórz przeglądarkę pamięci masowej w konsoli Cloud i sprawdź, czy plik został skopiowany:

31e2567fa0117214.png

Krok 3. Utwórz i wdróż model

Prawie gotowe do wdrożenia modelu. Poniższe polecenie gcloud ai-platform utworzy nowy model w projekcie. Nazwijmy go xgb_mortgage:

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

Teraz nadszedł czas na wdrożenie modelu. Użyjemy tego polecenia 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'

W tym czasie sprawdź sekcję modeli w konsoli AI Platform. Powinna pojawić się wdrażana nowa wersja:

342875ba92becad1.png

Po zakończeniu wdrażania, w miejscu wskaźnika postępu ładowania pojawi się zielony znacznik wyboru. Wdrożenie powinno potrwać 2–3 minuty.

Krok 4. Przetestuj wdrożony model

Aby mieć pewność, że wdrożony model działa, przetestuj go za pomocą gcloud w celu utworzenia prognozy. Najpierw zapisz plik JSON zawierający pierwszy przykład z naszego zbioru testowego:

%%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]

Przetestuj model, uruchamiając ten kod:

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

print(prediction)

Prognoza modelu powinna pojawić się w danych wyjściowych. Ten konkretny przykład został zatwierdzony, dlatego wartość powinna być zbliżona do 1.

7. Interpretacja modelu przy użyciu narzędzia What-If

Krok 1. Utwórz wizualizację narzędzia What-If

Aby połączyć narzędzie What-If z modelami AI Platform, musisz przekazać mu podzbiór przykładów testowych wraz z wartościami danych podstawowych (ground truth). Utwórzmy tablicę Numpy zawierającą 500 naszych przykładów testowych wraz z ich etykietami danych podstawowych (ground truth):

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

Utworzenie instancji narzędzia What-If wymaga jedynie utworzenia obiektu WitConfigBuilder i przekazania go do modelu AI Platform, który chcemy przeanalizować.

Używamy tu opcjonalnego parametru adjust_prediction, ponieważ narzędzie What-If oczekuje listy wyników dla każdej klasy w naszym modelu (w tym przypadku 2). Ponieważ nasz model zwraca tylko jedną wartość z zakresu od 0 do 1, przekształcamy ją do prawidłowego formatu w tej funkcji:

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)

Pamiętaj, że wczytanie wizualizacji może potrwać około minuty. Po załadowaniu powinien pojawić się ten komunikat:

4c0b00e6afcdbe01.png

Oś Y przedstawia prognozę modelu, przy czym 1 to prognoza approved o wysokim poziomie ufności, a 0 – prognoza denied o wysokim poziomie ufności. Oś X to jedynie rozkład wszystkich wczytanych punktów danych.

Krok 2. Sprawdź poszczególne punkty danych

Domyślnym widokiem w narzędziu What-If jest karta Edytor punktów danych. W tym miejscu możesz kliknąć dowolny punkt danych, aby zobaczyć jego cechy, zmienić wartości cech i zobaczyć, jak ta zmiana wpływa na prognozę modelu w konkretnym punkcie danych.

W poniższym przykładzie wybraliśmy punkt danych bliski progu 0,5. Wniosek o kredyt hipoteczny powiązany z tym konkretnym punktem danych pochodzi z CFPB. Zmieniliśmy tę funkcję na 0 i zmieniliśmy też wartość agency_code_Department of Housing and Urban Development (HUD) na 1, aby sprawdzić, co stanie się z prognozą modelu, gdyby ta kredyt pochodziła z HUD:

717620d6a1330479.png

Jak widać w lewym dolnym rogu narzędzia What-If, zmiana tej funkcji znacznie obniżyła prognozowaną wartość approved modelu o 32%. Może to oznaczać, że agencja, z której pochodzi pożyczka, ma duży wpływ na wyniki modelu, ale aby mieć pewność, że musimy przeprowadzić dokładniejszą analizę.

W lewym dolnym rogu interfejsu użytkownika możemy też zobaczyć wartość danych podstawowych (ground truth) dla każdego punktu danych i porównać ją z prognozą modelu:

60ff20ae80ed5e27.png

Krok 3. Analiza kontrfaktyczna

Następnie kliknij dowolny punkt danych i przesuń suwak Pokaż najbliższy kontrfaktyczny punkt danych w prawo:

ae64fd7abefe5449.png

Wybranie tej opcji spowoduje wyświetlenie punktu danych, który ma najbardziej podobne wartości cech do oryginalnego wybranego punktu, ale prognoza jest odwrotna. Następnie możesz przejrzeć wartości cech, aby zobaczyć, czym różnią się te 2 punkty danych (różnice są wyróżnione kolorem zielonym i pogrubionym).

Krok 4. Przyjrzyj się wykresom zależności częściowych

Aby zobaczyć, jak poszczególne cechy wpływają na ogólne prognozy modelu, zaznacz pole Wykresy zależności częściowych i upewnij się, że wybrana jest opcja Globalne wykresy zależności częściowych:

72117b5ceb683841.png

Widać tu, że w przypadku kredytów udzielanych w systemie HUD istnieje nieco większe prawdopodobieństwo ich odrzucenia. Wykres ma taki kształt, ponieważ kod agencji jest funkcją logiczną, więc wartości mogą być tylko dokładnie 0 lub 1.

applicant_income_thousands to funkcja liczbowa, a na wykresie zależności częściowej widzimy, że wyższy dochód nieznacznie zwiększa prawdopodobieństwo zatwierdzenia zgłoszenia, ale tylko do ok. 200 tys. USD. Po 200 tys. USD ta funkcja nie wpływa na prognozę modelu.

Krok 5. Przeanalizuj ogólną skuteczność i obiektywność

Następnie przejdź do sekcji Wydajność i Obiektywność. Pokazuje ogólne statystyki wydajności modelu w dostarczonym zbiorze danych, w tym tablice pomyłek, krzywe PR i krzywe ROC.

Wybierz mortgage_status jako funkcję danych podstawowych, aby wyświetlić tablicę pomyłek:

fe1384ee47699498.png

Ta tablica pomyłek pokazuje prawidłowe i nieprawidłowe prognozy naszego modelu jako odsetek całości. Jeśli zsumujesz kwadraty Tak / Prognozowane tak i Rzeczywiste Nie / Prognozowane nie, otrzymana liczba takich kwadratów będzie taka sama jak w modelu (około 87%).

Możesz też eksperymentować z suwakiem progu, zwiększając lub obniżając dodatni wynik klasyfikacji, który model musi zwrócić, zanim zdecyduje się na przewidywaną approved dla kredytu, i zobacz, jak zmienia to dokładność, wyniki fałszywie pozytywne i fałszywie negatywne. W tym przypadku dokładność jest najwyższa na poziomie progowym 0, 55.

Następnie w menu Wydziel według po lewej stronie wybierz loan_purpose_Home_purchase:

f3f1858d627d57ab.png

Teraz dane dotyczące skuteczności będą wyświetlane w dwóch podzbiorach danych: „0” wycinek pokazuje, kiedy kredyt nie dotyczy zakupu domu, oraz „1”. wycinek jest używany, gdy kredyt jest przeznaczony na zakup domu. Sprawdź współczynniki dokładności, wyników fałszywie pozytywnych i fałszywie negatywnych między tymi dwoma wycinkami, aby znaleźć różnice w skuteczności.

Jeśli rozwiniesz wiersze, aby przyjrzeć się tablicom pomyłek, zobaczysz, że model przewiduje, że model jest „zatwierdzony” w przypadku ok. 70% wniosków o kredyt na zakup domu i tylko 46% kredytów nieobejmujących domu (dokładne wartości procentowe mogą być różne w zależności od modelu):

318a8d5a8ffc6bea.png

Jeśli za pomocą opcji po lewej stronie wybierzesz Spójność demograficzna, dwa progi zostaną dostosowane w taki sposób, że model przewiduje approved dla podobnego odsetka kandydatów w obu wycinkach. Jaki ma to wpływ na dokładność, wyniki fałszywie pozytywne i fałszywie negatywne dla każdego wycinka?

Krok 6. Poznaj rozkład funkcji

Na koniec otwórz kartę Funkcje w narzędziu What-If. Pokazuje to rozkład wartości poszczególnych cech w zbiorze danych:

48ab3c4879793324.png

Za pomocą tej karty możesz sprawdzić, czy zbiór danych jest zrównoważony. Na przykład wygląda na to, że tylko niewiele pożyczek w zbiorze danych pochodzi od Agencji Usług rolnych. Aby poprawić dokładność modelu, możemy rozważyć dodanie większej liczby pożyczek od tej agencji, jeśli dane będą dostępne.

Opisaliśmy tu tylko kilka pomysłów na eksplorację w narzędziu What-If. Możesz nadal eksperymentować z tym narzędziem, ponieważ jest jeszcze więcej obszarów do zbadania.

8. Czyszczenie

Jeśli chcesz nadal korzystać z tego notatnika, zalecamy wyłączenie go, gdy nie jest używany. W interfejsie notatników w konsoli Cloud wybierz notatnik, a następnie kliknij Zatrzymaj:

879147427150b6c7.png

Jeśli chcesz usunąć wszystkie zasoby utworzone w tym module, po prostu usuń instancję notatnika, zamiast ją zatrzymywać.

Za pomocą menu nawigacyjnego w konsoli Cloud przejdź do Cloud Storage i usuń oba zasobniki utworzone w celu przechowywania zasobów modelu.