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 แล้วคลิกเปิดใช้ หากยังไม่ได้เปิดใช้
ขั้นตอนที่ 2: เปิดใช้ Compute Engine API
ไปที่ Compute Engine แล้วเลือกเปิดใช้ หากยังไม่ได้เปิดใช้ ซึ่งคุณจะต้องใช้ในการสร้างอินสแตนซ์สมุดบันทึก
ขั้นตอนที่ 3: สร้างอินสแตนซ์ AI Platform Notebooks
ไปที่ส่วน AI Platform Notebooks ของ Cloud Console แล้วคลิกอินสแตนซ์ใหม่ จากนั้นเลือกประเภทอินสแตนซ์ Python ล่าสุดดังนี้
ใช้ตัวเลือกเริ่มต้นแล้วคลิกสร้าง เมื่อสร้างอินสแตนซ์แล้ว ให้เลือก Open JupyterLab:
ขั้นตอนที่ 4: ติดตั้ง XGBoost
เมื่ออินสแตนซ์ JupyterLab เปิดขึ้น คุณจะต้องเพิ่มแพ็กเกจ XGBoost
ในการดำเนินการ ให้เลือกเทอร์มินัลจาก Launcher
จากนั้นเรียกใช้รายการต่อไปนี้เพื่อติดตั้ง 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)
ทำไมเราถึงใช้ 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 เพื่อตรวจสอบว่าได้คัดลอกไฟล์แล้ว โดยทำดังนี้
ขั้นตอนที่ 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 ในระหว่างที่ดำเนินการนี้ คุณควรเห็นเวอร์ชันใหม่ของคุณใช้งานได้จากที่นั่น:
เมื่อการทำให้ใช้งานได้เสร็จสมบูรณ์แล้ว คุณจะเห็นเครื่องหมายถูกสีเขียวในตำแหน่งที่ไอคอนหมุนแสดงการโหลดอยู่ การทำให้ใช้งานได้อาจใช้เวลา 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 ให้เลือกสมุดบันทึก แล้วเลือกหยุด
หากต้องการลบทรัพยากรทั้งหมดที่คุณสร้างไว้ในห้องทดลองนี้ เพียงลบอินสแตนซ์สมุดบันทึกแทนที่จะหยุด
ใช้เมนูการนำทางใน Cloud Console เพื่อเรียกดูพื้นที่เก็บข้อมูล แล้วลบที่เก็บข้อมูลทั้ง 2 รายการที่คุณสร้างขึ้นเพื่อจัดเก็บเนื้อหาโมเดล