Tworzenie finansowego modelu ML za pomocą narzędzia What-If i Vertex AI

1. Omówienie

W tym module użyjesz narzędzia What-If do analizy modelu XGBoost wytrenowanego na podstawie danych finansowych. Po przeanalizowaniu modelu wdrożysz go w nowym Vertex AI w Cloud.

Czego się nauczysz

Poznasz takie zagadnienia jak:

  • Trenowanie modelu XGBoost na podstawie publicznego zbioru danych o kredytach hipotecznych w hostowanym notatniku
  • Analizowanie modelu za pomocą narzędzia What-If
  • Wdrażanie modelu XGBoost w Vertex AI

Łączny koszt przeprowadzenia tego laboratorium w Google Cloud wynosi około 1 USD.

2. Wprowadzenie do Vertex AI

Ten moduł wykorzystuje najnowszą ofertę usług AI dostępną w Google Cloud. Vertex AI integruje rozwiązania ML w Google Cloud, zapewniając bezproblemowe środowisko programistyczne. Wcześniej modele wytrenowane z użyciem AutoML i modele niestandardowe były dostępne w oddzielnych usługach. Nowa oferta łączy oba te interfejsy API z innymi nowymi usługami. Możesz też przenieść istniejące projekty do Vertex AI. Jeśli masz jakieś uwagi, odwiedź stronę pomocy.

Vertex AI zawiera wiele różnych usług, które obsługują kompleksowe przepływy pracy związane z systemami uczącymi się. W tym module skupimy się na usługach wymienionych poniżej: Prediction i Notebooks.

Omówienie usługi Vertex

3. Krótkie wprowadzenie do XGBoost

XGBoost to framework uczenia maszynowego, który do tworzenia modeli prognostycznych wykorzystuje drzewa decyzyjnewzmacnianie gradientowe. Działa ona przez łączenie wielu drzew decyzyjnych na podstawie wyniku powiązanego z różnymi węzłami liścia w drzewie.

Diagram poniżej to wizualizacja prostego modelu drzewa decyzyjnego, który na podstawie prognozy pogody ocenia, czy warto zagrać w mecz sportowy:

Przykład modelu drzewa

Dlaczego w przypadku tego modelu używamy XGBoost? Chociaż tradycyjne sieci neuronowe sprawdzają się najlepiej w przypadku danych nieuporządkowanych, takich jak obrazy i tekst, drzewa decyzyjne często działają bardzo dobrze na danych uporządkowanych, takich jak zbiór danych o kredytach hipotecznych, którego użyjemy w tym samouczku.

4. Skonfiguruj środowisko

Aby uruchomić to ćwiczenie, musisz mieć projekt Google Cloud Platform z włączonym rozliczeniem. Aby utworzyć projekt, postępuj zgodnie z tymi instrukcjami.

Krok 1. Włącz Compute Engine API

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

Krok 2. Włącz interfejs Vertex AI API

Przejdź do sekcji Vertex AI w konsoli Cloud i kliknij Włącz interfejs Vertex AI API.

Panel Vertex

Krok 3. Utwórz instancję notatników

W konsoli Cloud w sekcji Vertex kliknij Notebooki:

Wybieranie notatek

Następnie kliknij Nowa instancja. Następnie wybierz typ instancji TensorFlow Enterprise 2.3 bez GPU:

Instancja TFE

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

Krok 4. Zainstaluj XGBoost

Po otwarciu instancji JupyterLab musisz dodać pakiet XGBoost.

Aby to zrobić, wybierz Terminal w Menu z aplikacjami:

Następnie uruchom następujące polecenie, aby zainstalować najnowszą wersję XGBoost obsługiwanej przez Vertex AI:

pip3 install xgboost==1.2

Gdy to zrobisz, 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 te instrukcje importu 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

5. Pobieranie i przetwarzanie danych

Do trenowania modelu XGBoost użyjemy zbioru danych o kredytach hipotecznych z ffiec.gov. Przeprowadziliśmy wstępne przetwarzanie oryginalnego zbioru danych i utworzyliśmy jego mniejszą wersję, którą możesz wykorzystać do trenowania modelu. Model będzie przewidywać, czy dany wniosek o kredyt hipoteczny zostanie zatwierdzony.

Krok 1. Pobierz 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

Zanim utworzymy strukturę DataFrame biblioteki Pandas, utworzymy dict typu danych każdej kolumny, aby Pandas poprawnie odczytał 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żywamy narzędzia sklearn o nazwie shuffle, które zostało zaimportowane do pierwszej komórki:

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() pozwala wyświetlić podgląd pierwszych 5 wierszy zbioru danych w Pandas. Po uruchomieniu komórki powyżej powinieneś zobaczyć coś takiego:

Podgląd zbioru danych o kredytach hipotecznych

To funkcje, których użyjemy do trenowania modelu. Jeśli przewiniesz do końca, zobaczysz ostatnią kolumnę approved, która zawiera przewidywane dane. Wartość 1 oznacza, że określona aplikacja została zatwierdzona, a wartość 0 – że została odrzucona.

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. Tworzenie kolumny zastępczej dla wartości porządkowych

Ten zbiór danych zawiera wartości liczbowe i kategorialne, ale XGBoost wymaga, aby wszystkie cechy były liczbowe. Zamiast przedstawiać wartości jakościowe za pomocą kodowania jednobitowego, w przypadku modelu XGBoost użyjemy funkcji get_dummies z biblioteki Pandas.

Funkcja get_dummies przekształca kolumnę z wieloma możliwymi wartościami w serię kolumn zawierających tylko 0 i 1. Jeśli np. mamy kolumnę „color” z możliwymi wartościami „niebieski” i „czerwony”, funkcja get_dummies przekształci ją w 2 kolumny o nazwach „color_blue” i „color_red” z wartościami logicznymi 0 i 1.

Aby utworzyć kolumny zastępcze dla cech jakościowych, uruchom ten kod:

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

data.head()

Gdy tym razem wyświetlisz podgląd danych, zobaczysz, że pojedyncze cechy (np. purchaser_type na rysunku poniżej) są podzielone na kilka kolumn:

Kolumny zastępcze w Pandas

Krok 4. Dzielenie danych na zbiory do trenowania i testowania

Ważnym pojęciem w uczeniu maszynowym jest podział na dane szkoleniowe i testowe. Większość danych wykorzystamy do trenowania modelu, a resztę przeznaczymy na testowanie modelu na danych, których wcześniej nie widział.

Dodaj do notatnika ten kod, który używa funkcji Scikit-learn train_test_split do podziału danych:

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

Możesz teraz utworzyć i wytrenować model.

6. Tworzenie, trenowanie i ocenianie modelu XGBoost

Krok 1. Zdefiniuj i wytrenuj model XGBoost

Utworzenie modelu w XGBoost jest proste. Do utworzenia modelu użyjemy klasy XGBClassifier. Musimy tylko przekazać odpowiedni parametr objective do 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 – nie zatwierdzono, 1 – zatwierdzone.

Poniższy kod utworzy model XGBoost:

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

Model można wytrenować za pomocą jednego wiersza kodu, wywołując metodę fit() i przekazując jej dane szkoleniowe 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() z biblioteki Scikit-learn, aby obliczyć dokładność modelu na podstawie jego działania na danych testowych. Przekażemy mu wartości danych podstawowych wraz z wartościami prognozowanymi przez model 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 może się nieco różnić, ponieważ systemy uczące się zawsze działają z pewnym odchyleniem.

Krok 3. Zapisz model

Aby wdrożyć model, uruchom podany niżej kod, aby zapisać go w pliku lokalnym:

model.save_model('model.bst')

7. Interpretowanie modelu za pomocą narzędzia What-If

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

Aby połączyć narzędzie What-if z Twoim modelem lokalnym, musisz przekazać mu podzbiór przykładów testowych wraz z odpowiednimi wartościami danych rzeczywistych. Utwórzmy tablicę Numpy z 500 przykładami testowymi wraz z ich etykietami danych rzeczywistych:

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

Tworzenie instancji narzędzia What-If jest tak proste, jak tworzenie obiektu WitConfigBuilder i przekazywanie mu modelu, który chcemy przeanalizować.

Narzędzie „Co jeśli?” oczekuje listy wyników dla każdej klasy w naszym modelu (w tym przypadku 2), dlatego użyjemy w nim metody predict_proba z XGBoost:

config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['mortgage_status'])
  .set_custom_predict_fn(model.predict_proba)
  .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 jego załadowaniu powinieneś zobaczyć:

Początkowy widok narzędzia What-If

Oś Y przedstawia prognozę modelu, przy czym 1 to prognoza approved o wysokiej pewności, a 0 to prognoza denied o wysokiej pewności. Oś X to po prostu rozrzut wszystkich załadowanych punktów danych.

Krok 2. Przejrzyj poszczególne punkty danych

Domyślnym widokiem w narzędziu Co jeśli jest karta Edytor punktu danych. Możesz kliknąć dowolny punkt danych, aby wyświetlić jego cechy, zmienić wartości cech i sprawdzić, jak ta zmiana wpływa na prognozę modelu dla tego punktu danych.

W poniższym przykładzie wybraliśmy punkt danych bliski progu 0,5. Wniosek o kredyt hipoteczny powiązany z tym 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 pożyczka pochodziła z HUD:

Jak widać w sekcji w lewym dolnym rogu narzędzia „Co jeśli?”, zmiana tej funkcji spowodowała znaczne obniżenie prognozy approved modelu o 32%. Może to wskazywać, że agencja, z której pochodzi kredyt, ma duży wpływ na wyniki modelu, ale aby mieć pewność, musimy przeprowadzić więcej analiz.

W lewym dolnym rogu interfejsu użytkownika można też zobaczyć wartość danych rzeczywistych dla każdego punktu danych i porównać ją z prognozą modelu:

Krok 3. Analiza kontrafaktualna

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

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 przewijać wartości cech, aby sprawdzić, w których miejscach różnią się te 2 punkty danych (różnice są wyróżnione na zielono i pogrubione).

Krok 4. Sprawdź wykresy zależności częściowej

Aby sprawdzić, jak poszczególne cechy wpływają na ogólne prognozy modelu, zaznacz pole Wykresy zależności częściowej i upewnij się, że wybrane jest Wykresy globalnej zależności częściowej:

Widać tu, że kredyty pochodzące z HUD mają nieco większą szansę na odrzucenie. Wynika to z tego, że kod agencji to cecha logiczna, która może przyjmować tylko wartości 0 i 1.

applicant_income_thousands to cecha liczbowa, a z wykresu zależności częściowej wynika, że im wyższe dochody, tym większa szansa na zatwierdzenie wniosku, ale tylko do około 200 tys. USD. Po przekroczeniu tej kwoty ta cecha nie ma wpływu na prognozę modelu.

Krok 5. Sprawdź ogólną skuteczność i sprawiedliwość

Następnie otwórz kartę 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:

Ta tablica pomyłek pokazuje prawidłowe i nieprawidłowe prognozy modelu jako odsetek wszystkich prognoz. Jeśli dodasz kwadraty rzeczywiste tak / prognozowane tak i rzeczywiste nie / prognozowane nie, powinny one uzyskać taką samą dokładność jak Twój model (w tym przypadku około 87%, choć model może się nieznacznie różnić, ponieważ w trenowanych modelach ML występuje element losowości).

Możesz też eksperymentować z suwakiem progu, podnosząc i obniżając wynik klasyfikacji pozytywnej, który model musi zwrócić, zanim zdecyduje się przewidzieć approved dla kredytu, i obserwować, jak to wpływa na dokładność, wyniki fałszywie pozytywne i fałszywie negatywne. W tym przypadku dokładność jest najwyższa w okolicach progu 0, 55.

Następnie w menu Podział według po lewej stronie kliknij loan_purpose_Home_purchase:

Teraz zobaczysz skuteczność 2 podzbiorów danych: klatka „0” pokazuje, kiedy kredyt nie jest przeznaczony na zakup domu, a klatka „1” – kiedy jest na ten cel. Aby sprawdzić różnice w skuteczności, porównaj między 2 krojami wskaźniki dokładności, fałszywie pozytywnych i fałszywie negatywnych.

Jeśli rozwiniesz wiersze, aby wyświetlić macierze błędu, zobaczysz, że model przewiduje „zatwierdzone” w przypadku około 70% wniosków o kredyt na zakup domu i tylko 46% wniosków o kredyt na inne cele (dokładne wartości procentowe zależą od modelu):

Jeśli w przypadku opcji przycisków opcji po lewej stronie wybierzesz Parytet demograficzny, oba progi zostaną dostosowane tak, aby model przewidywał approved dla podobnego odsetka kandydatów w obu przekrojach. Jaki ma to wpływ na dokładność, wyniki fałszywie pozytywne i fałszywie negatywne dla każdego wycinka?

Krok 6. Sprawdź rozpowszechnienie funkcji

Na koniec otwórz kartę Funkcje w narzędziu What-If. Widzisz tu rozkład wartości każdej cechy w zbiorze danych:

Na tej karcie 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 zwiększyć dokładność modelu, możemy rozważyć dodanie większej liczby kredytów z tej agencji, jeśli dane są dostępne.

Poniżej opisaliśmy tylko kilka pomysłów na wykorzystanie narzędzia What-If. Możesz dalej eksperymentować z tym narzędziem, ponieważ masz do odkrycia jeszcze wiele innych obszarów.

8. Wdrażanie modelu w Vertex AI

Mamy model działający lokalnie, ale chcielibyśmy, aby można było tworzyć na jego podstawie prognozy z dowolnego miejsca (nie tylko na tym notebooku). W tym kroku wdrożymy go w chmurze.

Krok 1. Utwórz zasobnik Cloud Storage dla modelu

Najpierw zdefiniujmy kilka zmiennych środowiskowych, których będziemy używać w dalszej części tego ćwiczenia z programowania. 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 the variables below to your own Google Cloud project ID and GCS bucket name. You can leave the model name we've specified below:
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
MODEL_NAME = 'xgb_mortgage'

Możemy teraz utworzyć zasobnik danych, w którym będzie przechowywany plik modelu XGBoost. Wdrożymy Vertex AI, wskazując ten plik.

Aby utworzyć regionalny zasobnik na dane, uruchom to polecenie gsutil w notatniku:

!gsutil mb -l us-central1 $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:

Krok 3. Utwórz model i wdróż go w punkcie końcowym

Jesteśmy już prawie gotowi do wdrożenia modelu w chmurze. W Vertex AI model może zawierać wiele punktów końcowych. Najpierw utworzymy model, a potem w jego ramach utworzymy punkt końcowy i go wdrożymy.

Najpierw utwórz model za pomocą interfejsu wiersza poleceń gcloud:

!gcloud beta ai models upload \
--display-name=$MODEL_NAME \
--artifact-uri=$MODEL_BUCKET \
--container-image-uri=us-docker.pkg.dev/cloud-aiplatform/prediction/xgboost-cpu.1-2:latest \
--region=us-central1

Parametr artifact-uri wskazuje lokalizację pamięci masowej, w której został zapisany model XGBoost. Parametr container-image-uri informuje Vertex AI, którego gotowego kontenera użyć do obsługi. Po zakończeniu tego polecenia przejdź do sekcji modeli w konsoli Vertex, aby uzyskać identyfikator nowego modelu. Znajdziesz ją tutaj:

Pobieranie identyfikatora modelu z konsoli

Skopiuj ten identyfikator i zapisz go w zmiennej:

MODEL_ID = "your_model_id"

Teraz możesz utworzyć punkt końcowy w tym modelu. Możemy to zrobić za pomocą tego polecenia gcloud:

!gcloud beta ai endpoints create \
--display-name=xgb_mortgage_v1 \
--region=us-central1

Po zakończeniu tego procesu w wyjściu z notatnika powinna być widoczna lokalizacja punktu końcowego. Znajdź wiersz, w którym jest mowa o tym, że punkt końcowy został utworzony z ścieżką podobną do tej: projects/project_ID/locations/us-central1/endpoints/endpoint_ID. Następnie zastąp podane niżej wartości identyfikatorami utworzonego powyżej punktu końcowego:

ENDPOINT_ID = "your_endpoint_id"

Aby wdrożyć punkt końcowy, uruchom to polecenie gcloud:

!gcloud beta ai endpoints deploy-model $ENDPOINT_ID \
--region=us-central1 \
--model=$MODEL_ID \
--display-name=xgb_mortgage_v1 \
--machine-type=n1-standard-2 \
--traffic-split=0=100

Wdrażanie punktu końcowego może potrwać 5–10 minut. Podczas wdrażania punktu końcowego przejdź do sekcji modeli w konsoli. Kliknij model, a pojawi się wdrożenie modelu:

Gdy wdrożanie się zakończy, w miejscu, gdzie wcześniej była ikona ładowania, zobaczysz zieloną ikonę potwierdzenia.

Krok 4. Przetestuj wdrożony model

Aby sprawdzić, czy wdrożony model działa, przeprowadź prognozowanie za pomocą gcloud. Najpierw zapisz plik JSON z przykładem z naszego zbioru testowego:

%%writefile predictions.json
{
  "instances": [
    [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 to polecenie gcloud:

!gcloud beta ai endpoints predict $ENDPOINT_ID \
--json-request=predictions.json \
--region=us-central1

W danych wyjściowych powinien pojawić się wynik prognozy modelu. W tym przykładzie reklama została zatwierdzona, więc powinna mieć wartość zbliżoną do 1.

9. Czyszczenie

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

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

Aby usunąć wdrożony punkt końcowy, otwórz sekcję Punkty końcowe w konsoli Vertex i kliknij ikonę usuwania:

Aby usunąć zasobnik Cloud Storage, w menu nawigacyjnym konsoli Cloud przejdź do usługi Storage, wybierz zasobnik i kliknij Usuń: