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

1. ภาพรวม

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

สิ่งที่คุณจะได้เรียนรู้

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

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

ค่าใช้จ่ายทั้งหมดในการเรียกใช้ Lab นี้ใน 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 แล้วเลือกเปิดใช้หากยังไม่ได้เปิดใช้ คุณจะต้องใช้ข้อมูลนี้เพื่อสร้างอินสแตนซ์ Notebook

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

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

a81c82876c6c16f9.png

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

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

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

โดยเลือก Terminal จาก Launcher ดังนี้

28dcf2790ce77c96.png

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

pip3 install xgboost==0.82

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

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

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

เราจะใช้ไลบรารีของไคลเอ็นต์ 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()

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

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 ซึ่งปัจจุบันเป็นสตริง True / False เราสามารถทำได้โดยเปลี่ยนประเภทของคอลัมน์นั้น

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

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

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

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

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

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

ก่อนอื่นเรามากำหนดตัวแปรสภาพแวดล้อมบางอย่างที่จะใช้ตลอดทั้ง Codelab ที่เหลือกัน กรอกค่าด้านล่างด้วยชื่อโปรเจ็กต์ Google Cloud, ชื่อของ Bucket ใน 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 นี้จากภายใน Notebook เพื่อสร้าง Bucket

!gsutil mb $MODEL_BUCKET

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

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

!gsutil cp ./model.bst $MODEL_BUCKET

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

31e2567fa0117214.png

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

ai-platform คำสั่ง gcloud ต่อไปนี้จะสร้างโมเดลใหม่ในโปรเจ็กต์ เราจะเรียกฟีเจอร์นี้ว่า 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. ล้างข้อมูล

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

879147427150b6c7.png

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

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