1. Przegląd
W tym module użyjesz narzędzia What-If do analizy modelu XGBoost wytrenowanego na danych finansowych. Po przeanalizowaniu modelu wdrożysz go w nowej usłudze Vertex AI w Google Cloud.
Czego się nauczysz
Poznasz takie zagadnienia jak:
- Trenowanie modelu XGBoost na publicznym zbiorze danych dotyczących kredytów hipotecznych w hostowanym notatniku
- Analizowanie modelu za pomocą narzędzia What-If
- Wdrażanie modelu XGBoost w Vertex AI
Całkowity koszt ukończenia tego laboratorium w Google Cloud wynosi około 1 USD.
2. Wprowadzenie do Vertex AI
W tym module wykorzystujemy najnowszą ofertę produktów AI dostępną w Google Cloud. Vertex AI integruje oferty ML w Google Cloud, zapewniając płynne środowisko programistyczne. Wcześniej modele wytrenowane za pomocą AutoML i modele niestandardowe były dostępne w ramach osobnych usług. Nowa oferta łączy je w jeden interfejs API wraz z innymi nowymi usługami. Możesz też przeprowadzić migrację istniejących projektów do Vertex AI. Jeśli masz jakieś uwagi, odwiedź stronę pomocy.
Vertex AI obejmuje wiele różnych usług, które obsługują kompleksowe przepływy pracy związane z uczeniem maszynowym. Ten moduł skupia się na usługach wyróżnionych poniżej: Prediction i Notebooks.

3. Krótkie wprowadzenie do XGBoost
XGBoost to platforma uczenia maszynowego, która do tworzenia modeli predykcyjnych wykorzystuje drzewa decyzyjne i wzmocnienie gradientowe. Działa na zasadzie łączenia wielu drzew decyzyjnych na podstawie wyniku powiązanego z różnymi węzłami liści w drzewie.
Poniższy diagram to wizualizacja prostego modelu drzewa decyzyjnego, który na podstawie prognozy pogody ocenia, czy mecz sportowy powinien się odbyć:

Dlaczego w tym modelu używamy XGBoost? Tradycyjne sieci neuronowe sprawdzają się najlepiej w przypadku danych nieustrukturyzowanych, takich jak obrazy i tekst, ale drzewa decyzyjne często działają bardzo dobrze w przypadku danych uporządkowanych, takich jak zbiór danych dotyczących kredytów hipotecznych, którego użyjemy w tym ćwiczeniu.
4. Konfigurowanie środowiska
Aby wykonać to ćwiczenie, musisz mieć projekt w Google Cloud Platform z włączonymi płatnościami. Aby utworzyć projekt, postępuj zgodnie z instrukcjami.
Krok 1. Włącz interfejs Compute Engine API
Przejdź do Compute Engine i kliknij Włącz, jeśli nie jest jeszcze włączona. Będzie Ci potrzebny do utworzenia instancji notatnika.
Krok 2. Włącz interfejs Vertex AI API
Otwórz sekcję Vertex w konsoli Cloud i kliknij Włącz interfejs Vertex AI API.

Krok 3. Utwórz instancję notatników
W sekcji Vertex w konsoli Cloud kliknij Notatniki:

Następnie kliknij Nowa instancja. Następnie wybierz typ instancji TensorFlow Enterprise 2.3 bez procesorów graficznych:

Użyj opcji domyślnych, a potem kliknij Utwórz. Po utworzeniu instancji wybierz 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 to polecenie, aby zainstalować najnowszą wersję XGBoost obsługiwaną przez Vertex AI:
pip3 install xgboost==1.2
Po zakończeniu tego procesu otwórz instancję notatnika Python 3 z launchera. Możesz już zacząć pracę w notatniku.
Krok 5. Zaimportuj pakiety Pythona
W pierwszej komórce notatnika dodaj te instrukcje importu i uruchom komórkę. Możesz go uruchomić, naciskając przycisk strzałki w prawo w menu u góry lub naciskając 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
5. Pobieranie i przetwarzanie danych
Do wytrenowania modelu XGBoost użyjemy zbioru danych dotyczących kredytów hipotecznych z witryny ffiec.gov. Przeprowadziliśmy wstępne przetwarzanie oryginalnego zbioru danych i utworzyliśmy jego mniejszą wersję, której możesz użyć do trenowania modelu. Model będzie przewidywać, czy dany wniosek o kredyt hipoteczny zostanie zatwierdzony.
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ą biblioteki Pandas
Zanim utworzymy strukturę DataFrame biblioteki pandas, utworzymy dict typu danych każdej kolumny, aby biblioteka 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 obiekt DataFrame, przekazując mu typy danych określone powyżej. Ważne jest, aby przetasować dane, jeśli oryginalny zbiór danych jest uporządkowany w określony sposób. W tym celu używamy narzędzia sklearn o nazwie shuffle, które zostało zaimportowane 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() pozwala wyświetlić podgląd pierwszych 5 wierszy zbioru danych w Pandas. Po uruchomieniu komórki powyżej powinna pojawić się informacja podobna do tej:

To są funkcje, których będziemy używać do trenowania naszego modelu. Jeśli przewiniesz do końca, zobaczysz ostatnią kolumnę approved, która zawiera przewidywane przez nas wartości. Wartość 1 oznacza, że dana aplikacja została zatwierdzona, a 0 – że została odrzucona.
Aby zobaczyć rozkład zatwierdzonych i odrzuconych wartości w zbiorze danych oraz utworzyć tablicę numpy z etykietami, 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 stanowią zatwierdzone wnioski.
Krok 3. Tworzenie kolumny zmiennej binarnej dla wartości kategorialnych
Ten zbiór danych zawiera wartości kategorialne i liczbowe, ale XGBoost wymaga, aby wszystkie cechy były liczbowe. Zamiast reprezentować wartości kategorialne za pomocą kodowania 1 z n, w przypadku modelu XGBoost wykorzystamy funkcję get_dummies biblioteki Pandas.
Funkcja get_dummies pobiera kolumnę z wieloma możliwymi wartościami i przekształca ją w serię kolumn, z których każda zawiera tylko zera i jedynki. Jeśli np. mamy kolumnę „kolor” z możliwymi wartościami „niebieski” i „czerwony”, funkcja get_dummies przekształci ją w 2 kolumny o nazwach „kolor_niebieski” i „kolor_czerwony” ze wszystkimi wartościami logicznymi 0 i 1.
Aby utworzyć kolumny fikcyjne 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()
Gdy tym razem wyświetlisz podgląd danych, zobaczysz pojedyncze funkcje (np. purchaser_type na ilustracji poniżej) podzielone na kilka kolumn:

Krok 4. Podziel dane na zbiory do trenowania i testowania
W uczeniu maszynowym ważną koncepcją jest podział na zbiór treningowy i testowy. Większość danych wykorzystamy do trenowania modelu, a pozostałe dane odłożymy na bok, aby przetestować model na danych, których nigdy wcześniej nie widział.
Dodaj do notatnika ten kod, który używa funkcji Scikit-learn train_test_split do podzielenia danych:
x,y = data.values,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
Możesz już utworzyć i wytrenować model.
6. Tworzenie, trenowanie i ocenianie modelu XGBoost
Krok 1. Zdefiniuj i wytrenuj model XGBoost
Tworzenie modelu w XGBoost jest proste. Do utworzenia modelu użyjemy klasy XGBClassifier. Wystarczy, że przekażemy odpowiedni parametr objective dla naszego konkretnego zadania klasyfikacji. W tym przypadku używamy funkcji reg:logistic, ponieważ mamy problem z klasyfikacją binarną i chcemy, aby model zwracał pojedynczą wartość z zakresu (0,1): 0 w przypadku odrzucenia i 1 w przypadku zatwierdzenia.
Ten kod utworzy model XGBoost:
model = xgb.XGBClassifier(
objective='reg:logistic'
)
Model możesz wytrenować za pomocą 1 wiersza kodu, wywołując metodę fit() i przekazując jej dane treningowe oraz etykiety.
model.fit(x_train, y_train)
Krok 2. Oceń dokładność modelu
Możemy teraz użyć 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 skuteczności w przypadku danych testowych. Przekażemy mu wartości podstawowe wraz z wartościami przewidzianymi 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')
Powinna ona wynosić około 87%, ale może się nieco różnić, ponieważ w uczeniu maszynowym zawsze występuje element losowości.
Krok 3. Zapisz model
Aby wdrożyć model, uruchom ten 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 Tool
Aby połączyć narzędzie What-if Tool z modelem lokalnym, musisz przekazać mu podzbiór przykładów testowych wraz z wartościami podstawowymi dla tych przykładów. Utwórzmy tablicę Numpy zawierającą 500 przykładów testowych wraz z etykietami danych podstawowych:
num_wit_examples = 500
test_examples = np.hstack((x_test[:num_wit_examples],y_test[:num_wit_examples].reshape(-1,1)))
Utworzenie instancji narzędzia What-If jest tak proste, jak utworzenie obiektu WitConfigBuilder i przekazanie mu modelu, który chcesz przeanalizować.
Narzędzie What-if Tool oczekuje listy wyników dla każdej klasy w naszym modelu (w tym przypadku 2), dlatego użyjemy metody predict_proba XGBoosta z narzędziem What-if Tool:
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ć minutę. Po załadowaniu powinny się wyświetlić te informacje:

Oś Y pokazuje prognozę modelu, przy czym 1 oznacza prognozę o wysokim poziomie ufności approved, a 0 – prognozę o wysokim poziomie ufności denied. Oś X to po prostu rozkład wszystkich wczytanych punktów danych.
Krok 2. Przeglądaj poszczególne punkty danych
Widokiem domyślnym w Narzędziu do analizy hipotetycznej jest karta Edytor punktów danych. Możesz tu kliknąć dowolny punkt danych, aby wyświetlić jego cechy, zmienić wartości cech i sprawdzić, jak ta zmiana wpływa na prognozę modelu dotyczącą poszczególnych punktów danych.
W przykładzie poniżej 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ę cechę na 0, a wartość agency_code_Department of Housing and Urban Development (HUD) na 1, aby sprawdzić, jak zmieni się prognoza modelu, jeśli ten kredyt będzie pochodzić z HUD:

Jak widać w lewym dolnym rogu narzędzia What-if Tool, zmiana tej cechy spowodowała znaczny spadek prognozy modelu approved o 32%. Może to oznaczać, że instytucja, z której pochodzi pożyczka, ma duży wpływ na wynik modelu, ale aby mieć pewność, musimy przeprowadzić dalszą analizę.
W lewym dolnym rogu interfejsu możemy też zobaczyć wartość rzeczywistą każdego punktu danych i porównać ją z prognozą modelu:

Krok 3. Analiza kontrfaktyczna
Następnie kliknij dowolny punkt danych i przesuń suwak Pokaż najbliższy kontrfaktyczny punkt danych w prawo:

Po wybraniu tej opcji zobaczysz punkt danych, który ma najbardziej podobne wartości cech do pierwotnie wybranego punktu, ale przeciwną prognozę. Następnie możesz przewijać wartości cech, aby zobaczyć, w których miejscach oba punkty danych różniły się od siebie (różnice są wyróżnione na zielono i pogrubione).
Krok 4. Sprawdź wykresy zależności częściowych
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 wybrano opcję Globalne wykresy zależności częściowej:

Widzimy, że w przypadku pożyczek pochodzących z HUD prawdopodobieństwo odrzucenia jest nieco większe. Wykres ma taki kształt, ponieważ kod agencji jest cechą logiczną, więc wartości mogą wynosić tylko 0 lub 1.
applicant_income_thousands to cecha numeryczna. Na wykresie zależności częściowej widać, że wyższe dochody nieznacznie zwiększają prawdopodobieństwo zatwierdzenia wniosku, ale tylko do około 200 tys. USD. Po przekroczeniu 200 tys. USD ta funkcja nie ma wpływu na prognozę modelu.
Krok 5. Sprawdź ogólną skuteczność i uczciwość
Następnie otwórz kartę Wydajność i obiektywność. Wyświetla to ogólne statystyki skuteczności wyników modelu w przypadku podanego zbioru danych, w tym macierze pomyłek, krzywe precyzji i przypominania oraz krzywe ROC.
Wybierz mortgage_status jako cechę danych podstawowych, aby wyświetlić tablicę pomyłek:

Ta tablica pomyłek pokazuje prawidłowe i nieprawidłowe prognozy naszego modelu jako odsetek całości. Jeśli zsumujesz kwadraty Rzeczywista odpowiedź „Tak” / przewidywana odpowiedź „Tak” i Rzeczywista odpowiedź „Nie” / przewidywana odpowiedź „Nie”, otrzymasz taką samą dokładność jak w przypadku modelu (w tym przypadku około 87%, chociaż w Twoim modelu może się ona nieco różnić, ponieważ w trenowaniu modeli ML występuje element losowości).
Możesz też poeksperymentować z suwakiem progu, podnosząc i obniżając wynik klasyfikacji pozytywnej, który model musi zwrócić, zanim zdecyduje się na prognozę approved w przypadku pożyczki. Sprawdź, jak wpływa to na dokładność, wyniki fałszywie pozytywne i wyniki fałszywie negatywne. W tym przypadku dokładność jest najwyższa w pobliżu progu 0, 55.
Następnie w menu Podziel według po lewej stronie wybierz loan_purpose_Home_purchase:

Teraz zobaczysz skuteczność w przypadku 2 podzbiorów danych: wycinek „0” pokazuje, kiedy pożyczka nie jest przeznaczona na zakup domu, a wycinek „1” – kiedy jest przeznaczona na zakup domu. Sprawdź dokładność, odsetek fałszywie pozytywnych i fałszywie negatywnych wyników w przypadku obu wycinków, aby znaleźć różnice w skuteczności.
Jeśli rozwiniesz wiersze, aby wyświetlić macierze pomyłek, zobaczysz, że model przewiduje „zatwierdzenie” w przypadku około 70% wniosków o kredyt na zakup domu i tylko 46% kredytów, które nie są przeznaczone na zakup domu (dokładne wartości procentowe będą się różnić w zależności od modelu):

Jeśli wybierzesz opcję Parytet demograficzny, oba progi zostaną dostosowane tak, aby model przewidywał approved dla podobnego odsetka wnioskodawców w obu grupach. Jak wpływa to na dokładność, wyniki fałszywie pozytywne i wyniki fałszywie negatywne w przypadku każdego wycinka?
Krok 6. Sprawdź rozmieszczenie funkcji
Na koniec otwórz kartę Funkcje w narzędziu What-If. Pokazuje to 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 w zbiorze danych jest bardzo mało pożyczek pochodzących z Farm Service Agency. Aby zwiększyć dokładność modelu, możemy dodać więcej pożyczek z tej agencji, jeśli dane będą dostępne.
Opisaliśmy tu tylko kilka pomysłów na eksplorację za pomocą narzędzia What-If. Możesz dalej korzystać z tego narzędzia, bo jest w nim jeszcze wiele obszarów do odkrycia.
8. Wdrażanie modelu w Vertex AI
Nasz model działa lokalnie, ale byłoby dobrze, gdybyśmy mogli korzystać z niego do prognozowania z dowolnego miejsca (nie tylko z tego notatnika). W tym kroku wdrożymy go w chmurze.
Krok 1. Utwórz zasobnik Cloud Storage dla modelu
Najpierw zdefiniujmy zmienne środowiskowe, których będziemy używać w dalszej części tych ćwiczeń z programowania. Wpisz poniżej nazwę projektu w chmurze Google Cloud, nazwę zasobnika Cloud Storage, który chcesz utworzyć (musi być globalnie unikalna), oraz nazwę 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'
Teraz możemy utworzyć zasobnik, w którym będziemy przechowywać plik modelu XGBoost. Podczas wdrażania wskażemy Vertex AI ten plik.
Aby utworzyć regionalny zasobnik pamięci, uruchom w notatniku to polecenie gsutil:
!gsutil mb -l us-central1 $MODEL_BUCKET
Krok 2. Skopiuj plik modelu do Cloud Storage
Następnie skopiujemy zapisany plik modelu XGBoost do Cloud Storage. Uruchom to polecenie gsutil:
!gsutil cp ./model.bst $MODEL_BUCKET
Aby potwierdzić, że plik został skopiowany, otwórz przeglądarkę Cloud Console Storage:

Krok 3. Utwórz model i wdroż go w punkcie końcowym
Już prawie możemy wdrożyć model 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 będzie wskazywać lokalizację w Storage, w której został zapisany model XGBoost. Parametr container-image-uri informuje Vertex AI, którego gotowego kontenera należy użyć do obsługi. Po wykonaniu tego polecenia przejdź do sekcji modeli w konsoli Vertex, aby uzyskać identyfikator nowego modelu. Znajdziesz ją tutaj:

Skopiuj ten identyfikator i zapisz go w zmiennej:
MODEL_ID = "your_model_id"
Pora 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 tej operacji w danych wyjściowych notatnika powinna pojawić się lokalizacja punktu końcowego. Znajdź wiersz z informacją, że punkt końcowy został utworzony ze ścieżką podobną do tej: projects/project_ID/locations/us-central1/endpoints/endpoint_ID.. Następnie zastąp poniższe 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 zajmie około 5–10 minut. Podczas wdrażania punktu końcowego przejdź do sekcji modeli w konsoli. Kliknij model, a powinien się rozpocząć proces wdrażania punktu końcowego:

Po pomyślnym wdrożeniu w miejscu wskaźnika ładowania pojawi się zielona ikona potwierdzenia.
Krok 4. Przetestuj wdrożony model
Aby sprawdzić, czy wdrożony model działa, przetestuj go za pomocą gcloud, aby utworzyć prognozę. 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 powinna pojawić się prognoza modelu. Ten konkretny przykład został zatwierdzony, więc powinna się wyświetlić wartość bliska 1.
9. Czyszczenie
Jeśli chcesz nadal korzystać z tego notebooka, zalecamy wyłączanie go, gdy nie jest używany. W interfejsie Notebooks w konsoli Cloud wybierz notatnik, a następnie kliknij Zatrzymaj:

Jeśli chcesz usunąć wszystkie zasoby utworzone w tym module, po prostu usuń instancję notatnika zamiast ją zatrzymywać.
Aby usunąć wdrożony punkt końcowy, przejdź do sekcji Punkty końcowe w konsoli Vertex i kliknij ikonę usuwania:

Aby usunąć zasobnik Storage, w menu nawigacyjnym w konsoli Cloud otwórz Storage, wybierz zasobnik i kliknij Usuń:
