1. 개요
이 실습에서는 GCP의 전체 ML 워크플로를 살펴봅니다. Cloud AI Platform Notebooks 환경에서 BigQuery 공개 데이터 세트의 데이터를 수집하고, XGBoost 모델을 빌드 및 학습시키고, 모델을 AI Platform에 배포하여 예측을 수행합니다.
학습 내용
다음 작업을 수행하는 방법을 배우게 됩니다.
- AI Platform Notebooks에서 BigQuery 데이터 세트 수집 및 분석
- XGBoost 모델 빌드
- AI Platform에 XGBoost 모델을 배포하고 예측 수행하기
Google Cloud에서 이 실습을 진행하는 데 드는 총 비용은 약 $1입니다.
2. 환경 설정
이 Codelab을 실행하려면 결제가 사용 설정된 Google Cloud Platform 프로젝트가 필요합니다. 프로젝트를 만들려면 여기의 안내를 따르세요.
1단계: Cloud AI Platform 모델 API 사용 설정
Cloud 콘솔의 AI Platform 모델 섹션으로 이동하고 아직 사용 설정되지 않은 경우 '사용 설정'을 클릭합니다.
2단계: Compute Engine API 사용 설정
아직 사용 설정되지 않은 경우 Compute Engine으로 이동하고 사용 설정을 선택합니다. 이것은 노트북 인스턴스를 생성하는 데 필요합니다.
3단계: AI Platform Notebooks 인스턴스 만들기
Cloud 콘솔의 AI Platform Notebooks 섹션으로 이동하여 새 인스턴스를 클릭합니다. 그런 다음 최신 Python 인스턴스 유형을 선택합니다.
기본 옵션을 사용한 다음 만들기를 클릭합니다. 인스턴스가 생성되면 JupyterLab 열기를 선택합니다.
4단계: XGBoost 설치
JupyterLab 인스턴스가 열리면 XGBoost 패키지를 추가해야 합니다.
이렇게 하려면 런처에서 터미널을 선택합니다.
그런 다음 다음을 실행하여 AI Platform에서 지원하는 최신 버전의 XGBoost를 설치합니다.
pip3 install xgboost==0.82
이 작업이 완료되면 런처에서 Python 3 노트북 인스턴스를 엽니다. 이제 노트북에서 시작할 준비가 되었습니다.
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는 탐색 분석에 사용할 수 있는 많은 데이터 세트를 공개했습니다. 이 실습에서는 natality 데이터 세트를 사용합니다. 여기에는 아이의 출생 시 체중과 아기의 부모 인구통계 정보를 포함하여 40년 동안 미국 내 거의 모든 출생에 대한 데이터가 포함되어 있습니다. 특성의 하위 집합을 사용하여 아기의 출생 시 체중을 예측합니다.
1단계: Google 노트북에 BigQuery 데이터 다운로드
BigQuery용 Python 클라이언트 라이브러리를 사용하여 Pandas DataFrame에 데이터를 다운로드하겠습니다. 원래 데이터 세트는 21GB이고 1억 2,300만 개의 행을 포함합니다. 여기서는 데이터 세트에서 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()
를 실행하여 데이터 세트를 미리 보면 학습에 사용할 네 가지 특성이 표시됩니다.
2단계: 범주형 특성을 정수로 변환
XGBoost에서는 모든 데이터가 숫자여야 하므로 현재 참 / 거짓 문자열인 is_male
열의 데이터를 표현하는 방식을 변경해야 합니다. 해당 열의 유형을 변경하기만 하면 됩니다.
data['is_male'] = data['is_male'].astype(int)
3단계: 데이터를 학습 세트와 테스트 세트로 분할
노트북 시작 부분에서 가져온 Scikit Learn의 train_test_split
유틸리티를 사용하여 데이터를 학습 세트와 테스트 세트로 분할해 보겠습니다.
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
매개변수를 전달하기만 하면 됩니다. 여기서는 숫자 값 (아기 몸무게)을 예측하므로 회귀 모델을 사용합니다. 대신 데이터를 버킷팅하여 아기의 몸무게가 1.6kg(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 프로젝트의 이름, 만들려는 클라우드 스토리지 버킷의 이름 (전역적으로 고유해야 함), 모델의 첫 번째 버전 버전 이름을 입력합니다.
# 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 콘솔의 스토리지 브라우저로 이동하여 파일이 복사되었는지 확인합니다.
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 Console의 모델 섹션을 확인합니다. 새 버전이 배포되는 것을 확인할 수 있습니다.
배포가 성공적으로 완료되면 로드 스피너가 있는 곳에 녹색 체크표시가 나타납니다. 배포하는 데 2~3분 정도 걸립니다.
4단계: 배포된 모델 테스트
배포된 모델이 작동하는지 확인하려면 gcloud를 사용하여 테스트하여 예측을 수행합니다. 먼저 테스트 세트의 두 가지 예를 사용하여 JSON 파일을 저장합니다.
%%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)
출력에 모델의 예측이 표시됩니다. 이 두 예에서 실제 아기 체중은 각각 1.9파운드와 8.1파운드입니다.
8. 삭제
이 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Notebooks UI에서 노트북을 선택한 다음 중지를 선택합니다.
이 실습에서 만든 모든 리소스를 삭제하려면 노트북 인스턴스를 중지하는 대신 삭제하면 됩니다.
Cloud 콘솔의 탐색 메뉴를 사용하여 Storage로 이동하고 모델 애셋을 저장하기 위해 만든 두 버킷을 모두 삭제합니다.