1. Omówienie
W tym module poznasz pełny przepływ pracy ML w GCP. W środowisku notatników w Cloud AI Platform pozyskasz dane z publicznego zbioru danych BigQuery, skompilujesz i wytrenujesz model XGBoost, a także wdrożysz go w AI Platform na potrzeby prognozowania.
Czego się dowiesz
Poznasz takie zagadnienia jak:
- Pozyskiwanie i analizowanie zbioru danych BigQuery w notatnikach AI Platform
- Zbuduj model XGBoost
- Wdróż model XGBoost w AI Platform i otrzymuj prognozy
Całkowity koszt uruchomienia tego modułu w Google Cloud wynosi około 1 USD.
2. 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.
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 Pythona:
Użyj opcji domyślnych i kliknij Utwórz. Po utworzeniu instancji wybierz Otwórz JupyterLab:
Krok 4. Zainstaluj XGBoost
Po otwarciu instancji JupyterLab dodaj pakiet XGBoost.
Aby to zrobić, wybierz Terminal w programie uruchamiającym:
Następnie uruchom następujące polecenie, aby zainstalować najnowszą wersję XGBoost zgodną z AI Platform:
pip3 install xgboost==0.82
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
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
3. Informacje o zbiorze danych BigQuery
Usługa BigQuery udostępnia publicznie wiele zbiorów danych na potrzeby eksploracji. W tym module użyjemy zbioru danych przyrodniczych. Zawiera on dane dotyczące niemal każdego narodzin w USA w okresie 40 lat, w tym masę urodzeniową dziecka oraz dane demograficzne dotyczące rodziców dziecka. Do przewidywania masy urodzeniowej dziecka wykorzystamy podzbiór funkcji.
Krok 1. Pobierz dane BigQuery do naszego notatnika
Użyjemy biblioteki klienta w języku Python dla BigQuery, aby pobrać dane do Pandas DataFrame. Oryginalny zbiór danych ma 21 GB i zawiera 123 mln wierszy. Dla uproszczenia użyjemy tylko 10 000 wierszy ze zbioru danych.
Utwórz zapytanie i wyświetl podgląd wynikowej ramki DataFrame za pomocą poniższego kodu. Pobraliśmy 4 cechy z oryginalnego zbioru danych oraz wagę dziecka (co przewidzi nasz model). Zbiór danych ma wiele lat, ale w tym modelu użyjemy tylko danych sprzed 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 polecenie:
df.describe()
Podaje średnią, odchylenie standardowe, wartość minimalną i inne dane dla naszych kolumn liczbowych. Na koniec zbieramy dane w kolumnie z wartościami logicznymi wskazującymi płeć dziecka. Możemy to osiągnąć dzięki Pandas Metoda value_counts
:
df['is_male'].value_counts()
Wygląda na to, że zbiór danych jest prawie zrównoważony w 50/50 według płci.
4. Przygotowywanie danych do trenowania
W tej sekcji podzielimy dane na zbiory do trenowania i testowania, aby przygotować je do trenowania naszego modelu.
Krok 1. Wyodrębnij kolumnę etykiet
Najpierw upuść ze zbioru danych wiersze z wartościami null, a następnie pomieszaj dane:
df = df.dropna()
df = shuffle(df, random_state=2)
Następnie wyodrębnij kolumnę etykiet do osobnej zmiennej i utwórz DataFrame zawierającą wyłącznie nasze funkcje:
labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
Jeśli wyświetlisz podgląd naszego zbioru danych, uruchamiając polecenie data.head()
, zobaczysz 4 funkcje, których będziemy używać do trenowania.
Krok 2. Przekonwertuj cechy kategorialne na liczby całkowite
Ponieważ XGBoost wymaga, aby wszystkie dane były liczbowe, musimy zmienić sposób przedstawienia danych w kolumnie is_male
, która obecnie zawiera ciągi Prawda / Fałsz. Można 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
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 utworzyć i wytrenować nasz model.
5. 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 to uproszczona wizualizacja sieci złożonej z drzew na potrzeby modelu, który pozwala ocenić, czy komuś spodoba się konkretna gra komputerowa (z dokumentów XGBoost):
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 zbiór danych hipotecznych, który będziemy wykorzystywać w tym ćwiczeniu z programowania.
6. 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 XGBRegressor
. Wystarczy, że przekażesz parametr objective
odpowiedni do zadania, które chcesz mu wykonać. Korzystamy tu z modelu regresji, ponieważ szacujemy wartość liczbową (wagę dziecka). Gdybyśmy zamiast tego pogrupowali dane w celu określenia, czy dziecko waży więcej, czy mniej niż 15 kg, skorzystalibyśmy z modelu klasyfikacji.
W tym przypadku jako celu naszego modelu użyjemy reg:squarederror
.
Ten kod utworzy model XGBoost:
model = xgb.XGBRegressor(
objective='reg:linear'
)
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ń model na podstawie danych testowych
Możemy teraz używać wytrenowanego modelu do generowania prognoz na danych testowych przy użyciu funkcji predict()
:
y_pred = model.predict(x_test)
Zobaczmy, jak model wyniósł wyniki dla pierwszych 20 wartości z zestawu testowego. Poniżej wydrukujemy przewidywaną wagę dziecka wraz z rzeczywistą wagą dziecka dla każdego przykładu testu:
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 w celu zapisania go w pliku lokalnym:
model.save_model('model.bst')
7. 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 = 'baby_weight'
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:
Krok 3. Utwórz i wdróż model
Poniższe polecenie gcloud ai-platform
utworzy nowy model w projekcie. Nazwijmy go xgb_mortgage
:
!gcloud ai-platform models create $MODEL_NAME
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=1.15 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT
Podczas wykonywania tego działania sprawdź sekcję modeli w konsoli AI Platform. Powinna pojawić się wdrażana nowa wersja:
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 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 wydrukując je:
prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)
Prognoza modelu powinna pojawić się w danych wyjściowych. Rzeczywista waga dziecka w przypadku tych 2 przykładów to odpowiednio 1,9 i 8,1 kg.
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:
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.