1. Przegląd
W tym module użyjesz narzędzia What-if do analizowania modelu XGBoost wytrenowanego na danych finansowych i wdrożonego w AI w Google Cloud Platform.
Czego się nauczysz
Poznasz takie zagadnienia jak:
- Trenowanie modelu XGBoost na publicznym zbiorze danych dotyczących kredytów hipotecznych w notatnikach AI Platform
- Wdrażanie modelu XGBoost w AI Platform
- Analizowanie modelu za pomocą narzędzia What-If
Całkowity koszt ukończenia tego laboratorium w Google Cloud wynosi około 1 USD.
2. 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.
3. 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 Cloud AI Platform Models API
Otwórz sekcję AI Platform Models w konsoli Cloud i kliknij Włącz, jeśli nie jest jeszcze włączona.

Krok 2. 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 3. Utwórz instancję notatników AI Platform
Otwórz sekcję AI Platform Notebooks w Cloud Console i kliknij Nowa instancja. Następnie wybierz najnowszą instancję TF Enterprise 2.x 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 AI Platform w Google Cloud:
pip3 install xgboost==0.90
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
4. 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 słownik typów 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,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
Możesz już utworzyć i wytrenować model.
5. 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ść naszego modelu na podstawie jego wyników 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')
6. Wdrażanie modelu w AI Platform w Google Cloud
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 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, w którym będziemy przechowywać plik modelu XGBoost. Podczas wdrażania wskażemy ten plik platformie AI Platform w Cloud.
Aby utworzyć zasobnik, uruchom to polecenie gsutil w notatniku:
!gsutil mb $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 i wdroż model
Już prawie możemy wdrożyć model. To polecenie ai-platform gcloud utworzy w Twoim projekcie nowy model. Nazwijmy go xgb_mortgage:
!gcloud ai-platform models create $MODEL_NAME --region='global'
Teraz nadszedł czas na wdrożenie modelu. Możemy to zrobić za pomocą 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'
Podczas tego procesu sprawdź sekcję modeli w konsoli AI Platform. Powinna się tam wdrażać nowa wersja:

Po pomyślnym wdrożeniu w miejscu, w którym wyświetla się ikona ładowania, pojawi się zielony znacznik. Wdrożenie powinno zająć 2–3 minuty.
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 pierwszym przykładem 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)
W danych wyjściowych powinna pojawić się prognoza modelu. Ten konkretny przykład został zatwierdzony, więc powinna się wyświetlić wartość bliska 1.
7. Interpretowanie modelu za pomocą narzędzia What-If
Krok 1. Utwórz wizualizację narzędzia What-If Tool
Aby połączyć narzędzie „Co by było, gdyby” z modelami AI Platform, musisz przekazać mu podzbiór przykładów testowych wraz z wartościami rzeczywistymi 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].values,y_test[:num_wit_examples].reshape(-1,1)))
Utworzenie narzędzia What-if jest proste – wystarczy utworzyć obiekt WitConfigBuilder i przekazać do niego model AI Platform, który chcesz przeanalizować.
Używamy tutaj opcjonalnego parametru adjust_prediction, ponieważ narzędzie What-if Tool oczekuje listy wyników dla każdej klasy w naszym modelu (w tym przypadku 2). Nasz model zwraca tylko jedną wartość z zakresu od 0 do 1, więc w tej funkcji przekształcamy ją do prawidłowego formatu:
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ć 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 wybrane są 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 (około 87%).
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. 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ć.
W menu nawigacyjnym w konsoli Cloud otwórz Storage i usuń oba utworzone zasobniki do przechowywania zasobów modelu.
