1. Przegląd
W tym module przejdziesz przez cały przepływ pracy ML w GCP. W środowisku Cloud AI Platform Notebooks pozyskasz dane z publicznego zbioru danych BigQuery, utworzysz i wytrenujesz model XGBoost, a następnie wdrożysz go na platformie AI Platform na potrzeby prognozowania.
Czego się nauczysz
Poznasz takie zagadnienia jak:
- Pozyskiwanie i analizowanie zbioru danych BigQuery w AI Platform Notebooks
- Tworzenie modelu XGBoost
- Wdrażanie modelu XGBoost w AI Platform i uzyskiwanie prognoz
Całkowity koszt ukończenia tego modułu w Google Cloud wynosi około 1 USD.
2. 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 najnowszy typ instancji Pythona:

Użyj opcji domyślnych, a następnie 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:
pip3 install xgboost==0.82
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
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
3. Przeglądanie zbioru danych BigQuery
BigQuery udostępnia publicznie wiele zbiorów danych, które możesz przeglądać. W tym module użyjemy zbioru danych o urodzeniach. Zawiera ona dane dotyczące niemal każdego porodu w USA w ciągu 40 lat, w tym wagę urodzeniową dziecka i informacje demograficzne o rodzicach. Do przewidywania masy urodzeniowej dziecka użyjemy podzbioru tych cech.
Krok 1. Pobierz dane BigQuery do notatnika
Do pobrania danych do obiektu Pandas DataFrame użyjemy biblioteki klienta BigQuery w Pythonie. Oryginalny zbiór danych ma 21 GB i zawiera 123 mln wierszy. Dla uproszczenia użyjemy tylko 10 tys. wierszy z tego zbioru danych.
Utwórz zapytanie i wyświetl podgląd wynikowego obiektu DataFrame za pomocą tego kodu. W tym przypadku pobieramy 4 cechy z oryginalnego zbioru danych wraz z wagą dziecka (czyli wartością, którą będzie przewidywać nasz model). Zbiór danych obejmuje wiele lat, ale w przypadku tego modelu użyjemy tylko danych z okresu po 2000 roku:
query="""
SELECT
weight_pounds,
is_male,
mother_age,
plurality,
gestation_weeks
FROM
publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()
Aby uzyskać podsumowanie funkcji liczbowych w naszym zbiorze danych, uruchom:
df.describe()
Wyświetla średnią, odchylenie standardowe, wartość minimalną i inne dane w przypadku kolumn numerycznych. Na koniec pobierzmy dane z kolumny logicznej wskazującej płeć dziecka. Możemy to zrobić za pomocą metody value_counts biblioteki Pandas:
df['is_male'].value_counts()
Wygląda na to, że zbiór danych jest prawie zrównoważony pod względem płci (50/50).
4. Przygotowywanie danych do trenowania
W tej sekcji podzielimy dane na zbiory do trenowania i testowania, aby przygotować je do trenowania modelu.
Krok 1. Wyodrębnij kolumnę etykiet
Najpierw usuń z zbioru danych wiersze z wartościami null i potasuj dane:
df = df.dropna()
df = shuffle(df, random_state=2)
Następnie wyodrębnij kolumnę etykiet do osobnej zmiennej i utwórz ramkę danych zawierającą tylko nasze cechy:
labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
Jeśli teraz wyświetlisz podgląd zbioru danych, uruchamiając data.head(), zobaczysz 4 cechy, których będziemy używać do trenowania.
Krok 2. Przekształć cechy kategorialne w liczby całkowite
XGBoost wymaga, aby wszystkie dane były liczbowe, więc musimy zmienić sposób reprezentowania danych w kolumnie is_male, która obecnie zawiera ciągi znaków „Prawda” i „Fałsz”. Możemy to zrobić, zmieniając typ tej kolumny:
data['is_male'] = data['is_male'].astype(int)
Krok 3. Podziel dane na zbiory do trenowania i testowania
Użyjemy narzędzia train_test_split z biblioteki Scikit Learn, które zaimportowaliśmy na początku notatnika, aby podzielić dane na zbiory do trenowania i testowania:
x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
Teraz możemy już zbudować i wytrenować model.
5. 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.
Diagram poniżej to uproszczona wizualizacja sieci drzew decyzyjnych w przypadku modelu, który ocenia, czy ktoś polubi konkretną grę komputerową (pochodzi z dokumentacji XGBoost):

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 laboratorium.
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 XGBRegressor. Wystarczy, że przekażemy odpowiedni parametr objective dla naszego konkretnego zadania. Używamy tu modelu regresji, ponieważ prognozujemy wartość liczbową (wagę dziecka). Gdybyśmy zamiast tego dzielili dane na kategorie, aby określić, czy dziecko ważyło więcej czy mniej niż 6 funtów, użylibyśmy modelu klasyfikacji.
W tym przypadku jako cel modelu użyjemy reg:squarederror.
Ten kod utworzy model XGBoost:
model = xgb.XGBRegressor(
objective='reg:linear'
)
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ń model na podstawie danych testowych
Możemy teraz użyć wytrenowanego modelu do generowania prognoz na podstawie danych testowych za pomocą funkcji predict():
y_pred = model.predict(x_test)
Sprawdźmy, jak model poradził sobie z pierwszymi 20 wartościami z naszego zbioru testowego. Poniżej podajemy przewidywaną wagę dziecka wraz z rzeczywistą wagą dziecka w przypadku każdego przykładu testowego:
for i in range(20):
print('Predicted weight: ', y_pred[i])
print('Actual weight: ', y_test.iloc[i])
print()
Krok 3. Zapisz model
Aby wdrożyć model, uruchom ten kod, aby zapisać go w pliku lokalnym:
model.save_model('model.bst')
7. Wdrażanie modelu na platformie Cloud AI Platform
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 wartości: 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 = 'baby_weight'
Teraz możemy utworzyć zasobnik, w którym będziemy przechowywać plik modelu XGBoost. Podczas wdrażania wskażemy Cloud AI Platform ten plik.
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
To polecenie ai-platform gcloud utworzy w Twoim projekcie nowy model. Nazwijmy go xgb_mortgage:
!gcloud ai-platform models create $MODEL_NAME
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=1.15 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT
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 2 przykładami z naszego zbioru testowego:
%%writefile predictions.json
[0.0, 33.0, 1.0, 27.0]
[1.0, 26.0, 1.0, 40.0]
Przetestuj model, zapisując dane wyjściowe tego polecenia gcloud w zmiennej i wyświetlając je:
prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)
W danych wyjściowych powinna pojawić się prognoza modelu. W tych dwóch przykładach rzeczywista waga dziecka wynosi odpowiednio 1,9 funta i 8,1 funta.
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.