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 Models 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는 사용자가 살펴볼 수 있도록 다양한 데이터 세트를 공개적으로 제공합니다. 이 실습에서는 출생률 데이터 세트를 사용합니다. 여기에는 40년간 미국에서 발생한 거의 모든 출생에 관한 데이터가 포함되어 있으며, 여기에는 아기의 출생 시 체중과 아기 부모의 인구통계 정보가 포함됩니다. 특성의 하위 집합을 사용하여 아기의 출생 시 체중을 예측합니다.
1단계: 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는 모든 데이터가 숫자여야 하므로 현재 True / False 문자열인 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 매개변수를 전달하기만 하면 됩니다. 여기서는 숫자 값 (아기 체중)을 예측하므로 회귀 모델을 사용합니다. 대신 아기의 체중이 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 콘솔의 스토리지 브라우저로 이동하여 파일이 복사되었는지 확인합니다.

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 콘솔의 모델 섹션을 확인합니다. 새 버전이 배포되는 것을 확인할 수 있습니다.

배포가 완료되면 로드 스피너가 있던 자리에 녹색 체크표시가 표시됩니다. 배포에는 2~3분이 걸립니다.
4단계: 배포된 모델 테스트하기
배포된 모델이 작동하는지 확인하려면 gcloud를 사용하여 예측을 실행하여 테스트합니다. 먼저 테스트 세트의 예 2개를 사용하여 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)
출력에 모델의 예측이 표시됩니다. 이 두 예의 실제 아기 몸무게는 각각 0.86kg과 3.67kg입니다.
8. 삭제
이 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Notebooks UI에서 노트북을 선택한 다음 중지를 선택합니다.

이 실습에서 만든 모든 리소스를 삭제하려면 노트북 인스턴스를 중지하는 대신 삭제하면 됩니다.
Cloud 콘솔의 탐색 메뉴를 사용하여 스토리지로 이동하고 모델 애셋을 저장하기 위해 만든 두 버킷을 모두 삭제합니다.