สร้าง ฝึก และติดตั้งใช้งานโมเดล XGBoost บน Cloud AI Platform

1. ภาพรวม

ในห้องทดลองนี้ คุณจะได้ดูเวิร์กโฟลว์ ML ที่สมบูรณ์บน GCP จากสภาพแวดล้อม Cloud AI Platform Notebooks คุณจะนำเข้าข้อมูลจากชุดข้อมูลสาธารณะของ BigQuery, สร้างและฝึกโมเดล XGBoost รวมถึงทำให้โมเดลใช้งานได้กับ AI Platform เพื่อการคาดการณ์

สิ่งที่ได้เรียนรู้

โดยคุณจะได้เรียนรู้วิธีต่อไปนี้

  • นำเข้าและวิเคราะห์ชุดข้อมูล BigQuery ใน AI Platform Notebooks
  • สร้างโมเดล XGBoost
  • ทำให้โมเดล XGBoost ใช้งานได้กับ AI Platform และรับการคาดการณ์

ค่าใช้จ่ายรวมในการเรียกใช้ห้องทดลองนี้บน Google Cloud อยู่ที่ประมาณ $1

2. ตั้งค่าสภาพแวดล้อมของคุณ

คุณจะต้องมีโปรเจ็กต์ Google Cloud Platform ที่เปิดใช้การเรียกเก็บเงินเพื่อเรียกใช้ Codelab นี้ หากต้องการสร้างโปรเจ็กต์ ให้ทำตามวิธีการที่นี่

ขั้นตอนที่ 1: เปิดใช้ Cloud AI Platform Models API

ไปที่ส่วนโมเดล AI Platform ของ Cloud Console แล้วคลิกเปิดใช้ หากยังไม่ได้เปิดใช้

d0d38662851c6af3.png

ขั้นตอนที่ 2: เปิดใช้ Compute Engine API

ไปที่ Compute Engine แล้วเลือกเปิดใช้ หากยังไม่ได้เปิดใช้ ซึ่งคุณจะต้องใช้ในการสร้างอินสแตนซ์สมุดบันทึก

ขั้นตอนที่ 3: สร้างอินสแตนซ์ AI Platform Notebooks

ไปที่ส่วน AI Platform Notebooks ของ Cloud Console แล้วคลิกอินสแตนซ์ใหม่ จากนั้นเลือกประเภทอินสแตนซ์ Python ล่าสุดดังนี้

a81c82876c6c16f9.png

ใช้ตัวเลือกเริ่มต้นแล้วคลิกสร้าง เมื่อสร้างอินสแตนซ์แล้ว ให้เลือก Open JupyterLab:

ขั้นตอนที่ 4: ติดตั้ง XGBoost

เมื่ออินสแตนซ์ JupyterLab เปิดขึ้น คุณจะต้องเพิ่มแพ็กเกจ XGBoost

ในการดำเนินการ ให้เลือกเทอร์มินัลจาก Launcher

28dcf2790ce77c96.png

จากนั้นเรียกใช้รายการต่อไปนี้เพื่อติดตั้ง XGBoost เวอร์ชันล่าสุดที่ AI Platform รองรับ

pip3 install xgboost==0.82

หลังจากขั้นตอนนี้เสร็จสมบูรณ์แล้ว ให้เปิดอินสแตนซ์สมุดบันทึก Python 3 จาก Launcher คุณพร้อมเริ่มต้นใช้งานในสมุดบันทึกแล้ว

ขั้นตอนที่ 5: นำเข้าแพ็กเกจ Python

ในเซลล์แรกของสมุดบันทึก ให้เพิ่มการนำเข้าต่อไปนี้และเรียกใช้เซลล์ โดยกดปุ่มลูกศรขวาในเมนูด้านบนหรือกด 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. สำรวจชุดข้อมูล BigQuery

BigQuery ได้ทำให้ชุดข้อมูลจำนวนมากพร้อมใช้งานแบบสาธารณะสำหรับการสำรวจ เราจะใช้ชุดข้อมูลเกี่ยวกับการเกิดสำหรับห้องทดลองนี้ รายงานนี้มีข้อมูลเกี่ยวกับการคลอดบุตรเกือบทุกครั้งในสหรัฐอเมริกาในช่วง 40 ปี รวมถึงน้ำหนักแรกเกิดและข้อมูลประชากรของบิดามารดาของเด็กทารก เราจะใช้ฟีเจอร์บางส่วนเพื่อคาดการณ์น้ำหนักแรกเกิดของทารก

ขั้นตอนที่ 1: ดาวน์โหลดข้อมูล BigQuery ลงในสมุดบันทึก

เราจะใช้ไลบรารีของไคลเอ็นต์ Python สำหรับ BigQuery เพื่อดาวน์โหลดข้อมูลไปยัง Pandas DataFrame ชุดข้อมูลต้นฉบับมีขนาด 21 GB และมี 123 ล้านแถว เพื่อให้เข้าใจได้ง่าย เราจะใช้แถวเพียง 10,000 แถวจากชุดข้อมูล

สร้างการค้นหาและแสดงตัวอย่าง DataFrame ที่ได้ด้วยโค้ดต่อไปนี้ ในตัวอย่างนี้ เราพบ 4 จุดสนใจจากชุดข้อมูลเดิม พร้อมกับน้ำหนักเด็ก (สิ่งที่โมเดลของเราคาดการณ์) ชุดข้อมูลย้อนหลังไปหลายปี แต่สำหรับโมเดลนี้ เราจะใช้เฉพาะข้อมูลจากปี 2000 ดังต่อไปนี้

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()

หากต้องการรับสรุปคุณลักษณะที่เป็นตัวเลขในชุดข้อมูลของเรา ให้เรียกใช้คำสั่งต่อไปนี้

df.describe()

ซึ่งจะแสดงค่าเฉลี่ย ค่าเบี่ยงเบนมาตรฐาน ค่าต่ำสุด และเมตริกอื่นๆ สำหรับคอลัมน์ตัวเลขของเรา สุดท้าย มาดูข้อมูลในคอลัมน์บูลีนที่ระบุเพศของทารกกัน เราสามารถทำเช่นนี้ได้ด้วย Pandas เมธอด value_counts:

df['is_male'].value_counts()

ดูเหมือนว่าชุดข้อมูลจะมีความสมดุลเกือบ 50/50 ตามเพศ

4. เตรียมข้อมูลสำหรับการฝึก

ในส่วนนี้ เราจะแบ่งข้อมูลออกเป็นชุดการฝึกและการทดสอบเพื่อเตรียมสำหรับการฝึกโมเดลของเรา

ขั้นตอนที่ 1: แตกคอลัมน์ป้ายกำกับ

วางแถวแรกที่มีค่า Null จากชุดข้อมูลและสับเปลี่ยนข้อมูล

df = df.dropna()
df = shuffle(df, random_state=2)

จากนั้นให้แยกคอลัมน์ป้ายกำกับออกมาเป็นตัวแปรแยกต่างหาก แล้วสร้าง DataFrame ที่มีเฉพาะฟีเจอร์ของเรา ดังนี้

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])

ตอนนี้ หากคุณดูตัวอย่างชุดข้อมูลของเราโดยการเรียกใช้ data.head() คุณจะเห็นฟีเจอร์ 4 รายการที่เราจะใช้สำหรับการฝึก

ขั้นตอนที่ 2: แปลงฟีเจอร์เชิงหมวดหมู่เป็นจำนวนเต็ม

เนื่องจาก XGBoost กำหนดให้ข้อมูลทั้งหมดเป็นตัวเลข เราจึงต้องเปลี่ยนวิธีการแสดงข้อมูลในคอลัมน์ is_male ซึ่งปัจจุบันเป็นสตริง "จริง / เท็จ" ซึ่งสามารถทำได้โดยเปลี่ยนประเภทของคอลัมน์นั้น ดังนี้

data['is_male'] = data['is_male'].astype(int)

ขั้นตอนที่ 3: แยกข้อมูลเป็นชุดการฝึกและการทดสอบ

เราจะใช้ยูทิลิตี train_test_split ของ Scikit Learn ซึ่งเรานำเข้าเมื่อเริ่มต้นสมุดบันทึกเพื่อแบ่งข้อมูลออกเป็นชุดการฝึกและการทดสอบ ดังนี้

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

ตอนนี้เราพร้อมแล้วที่จะสร้างและฝึกโมเดลของเรา

5. คู่มือ XGBoost แบบรวดเร็ว

XGBoost เป็นเฟรมเวิร์กแมชชีนเลิร์นนิงที่ใช้แผนผังการตัดสินใจและการเพิ่มระดับการไล่ระดับสีเพื่อสร้างโมเดลการคาดการณ์ ซึ่งทำงานโดยการรวมต้นไม้การตัดสินใจหลายต้นเข้าด้วยกัน โดยอิงตามคะแนนที่เกี่ยวข้องกับโหนดใบไม้ต่างๆ ในต้นไม้

แผนภาพด้านล่างคือการแสดงภาพอย่างง่ายของเครือข่ายแบบต้นไม้แบบรวมสำหรับโมเดลที่ประเมินว่าจะมีคนชื่นชอบเกมคอมพิวเตอร์เกมใดเกมหนึ่งหรือไม่ (ดูได้จากเอกสาร XGBoost)

fb061cd8c8f69999.png

ทำไมเราถึงใช้ XGBoost สำหรับโมเดลนี้ แม้ว่าโครงข่ายระบบประสาทเทียมแบบดั้งเดิมจะทำงานได้ดีที่สุดกับข้อมูลที่ไม่มีโครงสร้าง เช่น รูปภาพและข้อความ แต่แผนผังการตัดสินใจมักจะทำงานได้ดีมากกับข้อมูลที่มีโครงสร้าง เช่น ชุดข้อมูลสินเชื่อที่เราจะใช้ใน Codelab นี้

6. สร้าง ฝึก และประเมินโมเดล XGBoost

ขั้นตอนที่ 1: กำหนดและฝึกโมเดล XGBoost

การสร้างโมเดลใน XGBoost นั้นเป็นเรื่องง่าย เราจะใช้คลาส XGBRegressor เพื่อสร้างโมเดลและเพียงแค่ต้องส่งพารามิเตอร์ objective ที่ถูกต้องสำหรับงานที่เฉพาะเจาะจงของเรา เราใช้โมเดลการถดถอย เนื่องจากกำลังคาดการณ์ค่าตัวเลข (น้ำหนักของทารก) หากเราเก็บข้อมูลเพื่อพิจารณาว่าเด็กทารกมีน้ำหนักมากกว่าหรือน้อยกว่า 6 กิโลกรัมแทนหรือไม่ เราจะใช้โมเดลการจัดประเภท

ในกรณีนี้ เราจะใช้ reg:squarederror เป็นวัตถุประสงค์ของโมเดล

โค้ดต่อไปนี้จะสร้างโมเดล XGBoost:

model = xgb.XGBRegressor(
    objective='reg:linear'
)

คุณฝึกโมเดลด้วยโค้ดบรรทัดเดียวได้ โดยเรียกใช้เมธอด fit() และส่งข้อมูลการฝึกและป้ายกำกับไปให้

model.fit(x_train, y_train)

ขั้นตอนที่ 2: ประเมินโมเดลจากข้อมูลทดสอบ

ตอนนี้เราสามารถใช้โมเดลที่ผ่านการฝึกเพื่อสร้างการคาดการณ์เกี่ยวกับข้อมูลทดสอบด้วยฟังก์ชัน predict() ได้แล้ว

y_pred = model.predict(x_test)

มาดูประสิทธิภาพของโมเดลในค่า 20 ค่าแรกจากชุดทดสอบของเรากัน ด้านล่าง เราจะพิมพ์น้ำหนักทารกที่คาดการณ์ไว้พร้อมน้ำหนักจริงของทารกในตัวอย่างการทดสอบแต่ละครั้ง:

for i in range(20):
    print('Predicted weight: ', y_pred[i])
    print('Actual weight: ', y_test.iloc[i])
    print()

ขั้นตอนที่ 3: บันทึกโมเดล

หากต้องการทำให้โมเดลใช้งานได้ ให้เรียกใช้โค้ดต่อไปนี้เพื่อบันทึกลงในไฟล์ในเครื่อง

model.save_model('model.bst')

7. ทำให้โมเดลใช้งานได้กับ Cloud AI Platform

เราให้โมเดลของเราทำงานในเครื่อง แต่คงจะดีหากเราสามารถคาดการณ์จากที่ใดก็ได้ (ไม่ใช่แค่ในสมุดบันทึกนี้) ในขั้นตอนนี้ เราจะทำให้ใช้งานได้บนระบบคลาวด์

ขั้นตอนที่ 1: สร้างที่เก็บข้อมูล Cloud Storage สำหรับโมเดลของเรา

เรามากำหนดตัวแปรสภาพแวดล้อมบางส่วนที่เราจะใช้ใน Codelab ที่เหลือก่อนกัน กรอกค่าด้านล่างด้วยชื่อโปรเจ็กต์ Google Cloud, ชื่อที่เก็บข้อมูล Cloud Storage ที่ต้องการสร้าง (ต้องไม่ซ้ำกันทั่วโลก) และชื่อเวอร์ชันสำหรับโมเดลเวอร์ชันแรก

# 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'

ตอนนี้เราพร้อมที่จะสร้างที่เก็บข้อมูลของพื้นที่เก็บข้อมูลเพื่อจัดเก็บไฟล์โมเดล XGBoost ของเราแล้ว เราจะชี้ Cloud AI Platform มาที่ไฟล์นี้เมื่อทำให้ใช้งานได้

เรียกใช้คำสั่ง gsutil นี้จากภายในสมุดบันทึกเพื่อสร้างที่เก็บข้อมูล

!gsutil mb $MODEL_BUCKET

ขั้นตอนที่ 2: คัดลอกไฟล์โมเดลไปยัง Cloud Storage

ถัดไป เราจะคัดลอกไฟล์โมเดลที่บันทึกไว้ของ XGBoost ไปยัง Cloud Storage เรียกใช้คำสั่ง gsutil ต่อไปนี้

!gsutil cp ./model.bst $MODEL_BUCKET

ไปที่เบราว์เซอร์พื้นที่เก็บข้อมูลใน Cloud Console เพื่อตรวจสอบว่าได้คัดลอกไฟล์แล้ว โดยทำดังนี้

31e2567fa0117214.png

ขั้นตอนที่ 3: สร้างและทำให้โมเดลใช้งานได้

คำสั่ง gcloud ของ ai-platform ต่อไปนี้จะสร้างโมเดลใหม่ในโปรเจ็กต์ของคุณ เราจะเรียกสิ่งนี้ว่า xgb_mortgage:

!gcloud ai-platform models create $MODEL_NAME

ได้เวลาทำให้โมเดลใช้งานได้ ซึ่งทำได้โดยใช้คำสั่ง 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

ให้ตรวจสอบส่วนโมเดลของคอนโซล AI Platform ในระหว่างที่ดำเนินการนี้ คุณควรเห็นเวอร์ชันใหม่ของคุณใช้งานได้จากที่นั่น:

a431661f9c3e6cb2.png

เมื่อการทำให้ใช้งานได้เสร็จสมบูรณ์แล้ว คุณจะเห็นเครื่องหมายถูกสีเขียวในตำแหน่งที่ไอคอนหมุนแสดงการโหลดอยู่ การทำให้ใช้งานได้อาจใช้เวลา 2-3 นาที

ขั้นตอนที่ 4: ทดสอบโมเดลที่ทำให้ใช้งานได้

หากต้องการตรวจสอบว่าโมเดลที่ทำให้ใช้งานได้ทำงานอยู่ ให้ทดสอบโมเดลโดยใช้ gcloud เพื่อทำการคาดการณ์ ก่อนอื่น ให้บันทึกไฟล์ JSON ที่มีตัวอย่าง 2 รายการจากชุดทดสอบของเรา ดังนี้

%%writefile predictions.json
[0.0, 33.0, 1.0, 27.0]
[1.0, 26.0, 1.0, 40.0]

ทดสอบโมเดลโดยบันทึกเอาต์พุตของคำสั่ง gcloud ต่อไปนี้ลงในตัวแปรแล้วพิมพ์

prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)

คุณควรเห็นการคาดการณ์ของโมเดลในเอาต์พุต น้ำหนักทารกจริงของทั้ง 2 ตัวอย่างนี้คือ 1.9 และ 8.1 ปอนด์ตามลำดับ

8. ล้างข้อมูล

หากต้องการใช้สมุดบันทึกนี้ต่อไป ขอแนะนำให้ปิดสมุดบันทึกเมื่อไม่ได้ใช้งาน จาก UI ของสมุดบันทึกใน Cloud Console ให้เลือกสมุดบันทึก แล้วเลือกหยุด

879147427150b6c7.png

หากต้องการลบทรัพยากรทั้งหมดที่คุณสร้างไว้ในห้องทดลองนี้ เพียงลบอินสแตนซ์สมุดบันทึกแทนที่จะหยุด

ใช้เมนูการนำทางใน Cloud Console เพื่อเรียกดูพื้นที่เก็บข้อมูล แล้วลบที่เก็บข้อมูลทั้ง 2 รายการที่คุณสร้างขึ้นเพื่อจัดเก็บเนื้อหาโมเดล