What-If 도구를 사용하여 Cloud AI Platform에 배포된 재무 ML 모델 분석

1. 개요

이 실습에서는 What-if 도구를 사용하여 금융 데이터로 학습되고 Cloud AI Platform에 배포된 XGBoost 모델을 분석합니다.

학습 내용

다음 작업을 수행하는 방법을 배우게 됩니다.

  • AI Platform Notebooks의 공개 모기지 데이터세트에서 XGBoost 모델 학습
  • XGBoost 모델을 AI Platform에 배포
  • What-if 도구를 사용하여 모델 분석

Google Cloud에서 이 실습을 진행하는 데 드는 총 비용은 약 $1입니다.

2. XGBoost 간이 입문서

XGBoost결정 트리그래디언트 부스팅을 사용하여 예측 모델을 빌드하는 머신러닝 프레임워크입니다. 트리의 다양한 리프 노드와 연결된 점수를 기반으로 여러 결정 트리를 함께 앙상블하여 작동합니다.

아래 다이어그램은 일기 예보에 따라 스포츠 경기를 진행해야 하는지 평가하는 간단한 결정 트리 모델의 시각화입니다.

308a0bfc70733abf.png

이 모델에 XGBoost를 사용하는 이유는 무엇인가요? 기존 신경망은 이미지, 텍스트와 같은 비정형 데이터에서 가장 우수한 성능을 보이는 것으로 알려져 있지만, 의사 결정 트리는 이 Codelab에서 사용할 모기지 데이터 세트와 같은 구조화된 데이터에서 매우 우수한 성능을 보이는 경우가 많습니다.

3. 환경 설정

이 Codelab을 실행하려면 결제가 사용 설정된 Google Cloud Platform 프로젝트가 필요합니다. 프로젝트를 만들려면 여기의 안내를 따르세요.

1단계: Cloud AI Platform Models API 사용 설정하기

Cloud 콘솔의 AI Platform 모델 섹션으로 이동하여 아직 사용 설정되지 않은 경우 사용 설정을 클릭합니다.

d0d38662851c6af3.png

2단계: Compute Engine API 사용 설정

Compute Engine으로 이동하여 아직 사용 설정되지 않은 경우 사용 설정을 선택합니다. 이것은 노트북 인스턴스를 생성하는 데 필요합니다.

3단계: AI Platform Notebooks 인스턴스 만들기

Cloud 콘솔의 AI Platform Notebooks 섹션으로 이동하여 새 인스턴스를 클릭합니다. 그런 다음 GPU가 없는 최신 TF Enterprise 2.x 인스턴스 유형을 선택합니다.

7d16190440ab2e9c.png

기본 옵션을 사용한 다음 만들기를 클릭합니다. 인스턴스가 생성되면 JupyterLab 열기를 선택합니다.

772f8868d3841ba0.png

4단계: XGBoost 설치하기

JupyterLab 인스턴스가 열리면 XGBoost 패키지를 추가해야 합니다.

이렇게 하려면 런처에서 터미널을 선택합니다.

28dcf2790ce77c96.png

그런 다음 다음을 실행하여 Cloud AI Platform에서 지원하는 최신 버전의 XGBoost를 설치합니다.

pip3 install xgboost==0.90

이 작업이 완료되면 런처에서 Python 3 노트북 인스턴스를 엽니다. 이제 노트북에서 시작할 수 있습니다.

5단계: Python 패키지 가져오기

노트북의 첫 번째 셀에 다음 가져오기를 추가하고 셀을 실행합니다. 상단 메뉴에서 오른쪽 화살표 버튼을 누르거나 command-enter를 눌러 실행할 수 있습니다.

import pandas as pd
import xgboost as xgb
import numpy as np
import collections
import witwidget

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.utils import shuffle
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

4. 데이터 다운로드 및 처리

ffiec.gov의 모기지 데이터 세트를 사용하여 XGBoost 모델을 학습합니다. Google에서는 원본 데이터 세트를 사전 처리하여 모델 학습에 사용할 수 있는 더 작은 버전을 만들었습니다. 이 모델은 특정 주택담보대출 신청이 승인될지 여부를 예측합니다.

1단계: 사전 처리된 데이터 세트 다운로드하기

Google Cloud Storage에서 사용할 수 있는 데이터 세트 버전이 제공됩니다. Jupyter 노트북에서 다음 gsutil 명령어를 실행하여 다운로드할 수 있습니다.

!gsutil cp 'gs://mortgage_dataset_files/mortgage-small.csv' .

2단계: Pandas로 데이터 세트 읽기

Pandas DataFrame을 만들기 전에 Pandas가 데이터 세트를 올바르게 읽을 수 있도록 각 열의 데이터 유형으로 dict를 만듭니다.

COLUMN_NAMES = collections.OrderedDict({
 'as_of_year': np.int16,
 'agency_code': 'category',
 'loan_type': 'category',
 'property_type': 'category',
 'loan_purpose': 'category',
 'occupancy': np.int8,
 'loan_amt_thousands': np.float64,
 'preapproval': 'category',
 'county_code': np.float64,
 'applicant_income_thousands': np.float64,
 'purchaser_type': 'category',
 'hoepa_status': 'category',
 'lien_status': 'category',
 'population': np.float64,
 'ffiec_median_fam_income': np.float64,
 'tract_to_msa_income_pct': np.float64,
 'num_owner_occupied_units': np.float64,
 'num_1_to_4_family_units': np.float64,
 'approved': np.int8
})

다음으로 위에 지정한 데이터 유형을 전달하여 DataFrame을 만듭니다. 원래 데이터 세트가 특정 방식으로 정렬된 경우 데이터를 섞는 것이 중요합니다. 이를 위해 첫 번째 셀에서 가져온 shuffle라는 sklearn 유틸리티를 사용합니다.

data = pd.read_csv(
 'mortgage-small.csv',
 index_col=False,
 dtype=COLUMN_NAMES
)
data = data.dropna()
data = shuffle(data, random_state=2)
data.head()

data.head()를 사용하면 Pandas에서 데이터세트의 처음 5개 행을 미리 볼 수 있습니다. 위의 셀을 실행하면 다음과 같이 표시됩니다.

29106b71103235a6.png

이러한 기능은 모델을 학습시키는 데 사용됩니다. 끝까지 스크롤하면 예측하려는 항목인 마지막 열 approved가 표시됩니다. 1 값은 특정 애플리케이션이 승인되었음을 나타내고 0 값은 거부되었음을 나타냅니다.

데이터 세트에서 승인 / 거부된 값의 분포를 확인하고 라벨의 numpy 배열을 만들려면 다음을 실행하세요.

# Class labels - 0: denied, 1: approved
print(data['approved'].value_counts())

labels = data['approved'].values
data = data.drop(columns=['approved'])

데이터 세트의 약 66% 에는 승인된 애플리케이션이 포함되어 있습니다.

3단계: 범주형 값의 더미 열 만들기

이 데이터 세트에는 범주형 값과 숫자 값이 혼합되어 있지만 XGBoost에서는 모든 특성이 숫자여야 합니다. 원-핫 인코딩을 사용하여 범주형 값을 표현하는 대신 XGBoost 모델에서는 Pandas get_dummies 함수를 활용합니다.

get_dummies는 가능한 값이 여러 개인 열을 가져와 각각 0과 1만 있는 열의 시리즈로 변환합니다. 예를 들어 가능한 값이 'blue'와 'red'인 'color' 열이 있는 경우 get_dummies는 이를 모든 불리언 0 및 1 값이 있는 'color_blue' 및 'color_red'라는 2개의 열로 변환합니다.

범주형 특성의 더미 열을 만들려면 다음 코드를 실행합니다.

dummy_columns = list(data.dtypes[data.dtypes == 'category'].index)
data = pd.get_dummies(data, columns=dummy_columns)

data.head()

이번에 데이터를 미리 보면 단일 특성 (예: 아래에 표시된 purchaser_type)이 여러 열로 분할되어 표시됩니다.

83aacfaad626e538.png

4단계: 데이터를 학습 세트와 테스트 세트로 분할하기

머신러닝에서 중요한 개념은 학습 / 테스트 분할입니다. 대부분의 데이터를 가져와 모델을 학습시키고, 나머지는 모델이 이전에 본 적 없는 데이터로 모델을 테스트하는 데 사용합니다.

Scikit Learn 함수 train_test_split를 사용하여 데이터를 분할하는 다음 코드를 노트북에 추가합니다.

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

이제 모델을 빌드하고 학습시킬 준비가 되었습니다.

5. XGBoost 모델 빌드, 학습, 평가

1단계: XGBoost 모델 정의 및 학습

XGBoost에서 모델을 만드는 것은 간단합니다. XGBClassifier 클래스를 사용하여 모델을 만들고 특정 분류 작업에 맞는 objective 매개변수를 전달하기만 하면 됩니다. 이 경우 이진 분류 문제가 있고 모델이 (0,1) 범위의 단일 값을 출력하도록 하므로 reg:logistic를 사용합니다. 승인되지 않은 경우 0, 승인된 경우 1입니다.

다음 코드는 XGBoost 모델을 만듭니다.

model = xgb.XGBClassifier(
    objective='reg:logistic'
)

fit() 메서드를 호출하고 학습 데이터와 라벨을 전달하는 한 줄의 코드로 모델을 학습시킬 수 있습니다.

model.fit(x_train, y_train)

2단계: 모델의 정확도 평가

이제 학습된 모델을 사용하여 predict() 함수로 테스트 데이터에 대한 예측을 생성할 수 있습니다.

그런 다음 Scikit Learn의 accuracy_score 함수를 사용하여 테스트 데이터에 대한 모델의 성능을 기반으로 모델의 정확도를 계산합니다. 테스트 세트의 각 예시에 대한 모델의 예측 값과 함께 실측 값을 전달합니다.

y_pred = model.predict(x_test)
acc = accuracy_score(y_test, y_pred.round())
print(acc, '\n')

정확도는 87% 정도가 나와야 하지만 머신러닝에는 항상 무작위성이 포함되므로 약간의 차이가 있을 수 있습니다.

3단계: 모델 저장하기

모델을 배포하려면 다음 코드를 실행하여 로컬 파일에 저장합니다.

model.save_model('model.bst')

6. 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 = 'xgb_mortgage'

이제 XGBoost 모델 파일을 저장할 스토리지 버킷을 만들 준비가 되었습니다. 배포할 때 Cloud AI Platform이 이 파일을 가리키도록 합니다.

노트북 내에서 다음 gsutil 명령어를 실행하여 버킷을 만듭니다.

!gsutil mb $MODEL_BUCKET

2단계: Cloud Storage에 모델 파일 복사

다음으로 XGBoost 저장 모델 파일을 Cloud Storage에 복사합니다. 다음 gsutil 명령어를 실행합니다.

!gsutil cp ./model.bst $MODEL_BUCKET

Cloud 콘솔의 스토리지 브라우저로 이동하여 파일이 복사되었는지 확인합니다.

31e2567fa0117214.png

3단계: 모델 만들기 및 배포하기

이제 모델을 배포할 준비가 거의 다 되었습니다. 다음 ai-platform gcloud 명령어는 프로젝트에 새 모델을 만듭니다. 이 이름을 xgb_mortgage라고 하겠습니다.

!gcloud ai-platform models create $MODEL_NAME --region='global'

이제 모델을 배포할 차례입니다. 다음 gcloud 명령어를 사용하여 이를 수행할 수 있습니다.

!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=2.1 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT \
--region='global'

이 작업이 실행되는 동안 AI Platform 콘솔의 모델 섹션을 확인합니다. 새 버전이 배포되는 것을 확인할 수 있습니다.

342875ba92becad1.png

배포가 완료되면 로드 스피너가 있던 자리에 녹색 체크표시가 표시됩니다. 배포에는 2~3분이 걸립니다.

4단계: 배포된 모델 테스트하기

배포된 모델이 작동하는지 확인하려면 gcloud를 사용하여 예측을 실행하여 테스트합니다. 먼저 테스트 세트의 첫 번째 예시가 포함된 JSON 파일을 저장합니다.

%%writefile predictions.json
[2016.0, 1.0, 346.0, 27.0, 211.0, 4530.0, 86700.0, 132.13, 1289.0, 1408.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0]

다음 코드를 실행하여 모델을 테스트합니다.

prediction = !gcloud ai-platform predict --model=xgb_mortgage --region='global' --json-instances=predictions.json --version=$VERSION_NAME --verbosity=none

print(prediction)

출력에 모델의 예측이 표시됩니다. 이 예시는 승인되었으므로 1에 가까운 값이 표시됩니다.

7. What-if 도구를 사용하여 모델 해석

1단계: What-if Tool 시각화 만들기

What-if 도구를 AI Platform 모델에 연결하려면 테스트 예의 하위 집합과 해당 예의 정답 값을 전달해야 합니다. 정답 라벨과 함께 테스트 예 500개의 Numpy 배열을 만들어 보겠습니다.

num_wit_examples = 500
test_examples = np.hstack((x_test[:num_wit_examples].values,y_test[:num_wit_examples].reshape(-1,1)))

What-if 도구를 인스턴스화하는 것은 WitConfigBuilder 객체를 만들고 분석하려는 AI Platform 모델을 전달하는 것만큼 간단합니다.

여기서는 선택적 adjust_prediction 매개변수를 사용합니다. What-if 도구는 모델의 각 클래스 (이 경우 2)에 대한 점수 목록을 예상하기 때문입니다. 모델은 0~1 사이의 단일 값만 반환하므로 이 함수에서 올바른 형식으로 변환합니다.

def adjust_prediction(pred):
  return [1 - pred, pred]

config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['mortgage_status'])
  .set_ai_platform_model(GCP_PROJECT, MODEL_NAME, VERSION_NAME, adjust_prediction=adjust_prediction)
  .set_target_feature('mortgage_status')
  .set_label_vocab(['denied', 'approved']))
WitWidget(config_builder, height=800)

시각화가 로드되는 데 1분 정도 걸립니다. 로드가 완료되면 다음과 같이 표시됩니다.

4c0b00e6afcdbe01.png

y축은 모델의 예측을 보여줍니다. 1은 신뢰도가 높은 approved 예측이고 0은 신뢰도가 높은 denied 예측입니다. x축은 로드된 모든 데이터 포인트의 분포입니다.

2단계: 개별 데이터 포인트 살펴보기

What-if 도구의 기본 뷰는 데이터 포인트 편집기 탭입니다. 여기에서 개별 데이터 포인트를 클릭하여 특성을 확인하고, 특성 값을 변경하고, 변경사항이 개별 데이터 포인트에 대한 모델의 예측에 어떤 영향을 미치는지 확인할 수 있습니다.

아래 예에서는 0 .5 기준에 가까운 데이터 포인트를 선택했습니다. 이 특정 데이터 포인트와 관련된 주택담보대출 신청은 CFPB에서 시작되었습니다. 이 대출이 HUD에서 시작된 경우 모델의 예측이 어떻게 되는지 확인하기 위해 해당 기능을 0으로 변경하고 agency_code_Department of Housing and Urban Development (HUD) 값을 1로 변경했습니다.

717620d6a1330479.png

What-if Tool의 왼쪽 하단 섹션에서 볼 수 있듯이 이 기능을 변경하면 모델의 approved 예측이 32% 감소했습니다. 이는 대출이 시작된 기관이 모델의 출력에 큰 영향을 미친다는 것을 나타낼 수 있지만, 확실히 하려면 더 많은 분석이 필요합니다.

UI의 왼쪽 하단 부분에서 각 데이터 포인트의 정답 값을 확인하고 모델의 예측과 비교할 수도 있습니다.

60ff20ae80ed5e27.png

3단계: 반사실적 분석

그런 다음 데이터 포인트를 클릭하고 가장 가까운 반사실적 데이터 포인트 표시 슬라이더를 오른쪽으로 이동합니다.

ae64fd7abefe5449.png

이 옵션을 선택하면 선택한 원본과 가장 유사한 특성 값을 갖지만 예측이 반대인 데이터 포인트가 표시됩니다. 그런 다음 특성 값을 스크롤하여 두 데이터 포인트가 다른 부분을 확인할 수 있습니다 (차이점은 녹색과 굵은 글씨로 강조 표시됨).

4단계: 부분 종속성 플롯 살펴보기

각 특성이 모델의 전체 예측에 미치는 영향을 확인하려면 부분 종속성 플롯 체크박스를 선택하고 전역 부분 종속성 플롯이 선택되어 있는지 확인합니다.

72117b5ceb683841.png

여기에서 HUD에서 시작된 대출이 거부될 가능성이 약간 더 높다는 것을 알 수 있습니다. 대행사 코드는 불리언 기능이므로 값이 정확히 0 또는 1일 수 있기 때문에 그래프가 이러한 모양입니다.

applicant_income_thousands는 숫자 기능이며, 부분 종속성 플롯에서 소득이 높을수록 신청이 승인될 가능성이 약간 높아지지만 20만 달러까지만 해당되는 것을 확인할 수 있습니다. 20만 달러를 초과하면 이 기능이 모델의 예측에 영향을 미치지 않습니다.

5단계: 전반적인 성능과 공정성 살펴보기

그런 다음 성능 및 공정성 탭으로 이동합니다. 혼동 행렬, PR 곡선, ROC 곡선을 비롯해 제공된 데이터 세트에서 모델의 결과에 관한 전체 성능 통계를 보여줍니다.

mortgage_status를 정답 특성으로 선택하여 혼동 행렬을 확인합니다.

fe1384ee47699498.png

이 혼동 행렬은 모델의 올바른 예측과 잘못된 예측을 전체의 비율로 보여줍니다. 실제 예 / 예측 예실제 아니요 / 예측 아니요 사각형을 합하면 모델의 정확도 (약 87%)와 동일한 정확도가 됩니다.

또한 임곗값 슬라이더를 사용하여 모델이 대출에 대해 approved를 예측하기 전에 반환해야 하는 긍정 분류 점수를 높이거나 낮추고 정확도, 거짓양성, 거짓음성이 어떻게 변하는지 확인할 수 있습니다. 이 경우 정확도는 임곗값 .55 근처에서 가장 높습니다.

다음으로 왼쪽의 분류 기준 드롭다운에서 loan_purpose_Home_purchase를 선택합니다.

f3f1858d627d57ab.png

이제 데이터의 두 하위 집합에 대한 실적이 표시됩니다. '0' 슬라이스는 대출이 주택 구매용이 아닌 경우를 보여주고 '1' 슬라이스는 대출이 주택 구매용인 경우를 보여줍니다. 두 슬라이스 간의 정확도, 거짓양성률, 거짓음성률을 확인하여 실적의 차이를 확인합니다.

행을 펼쳐 혼동 행렬을 살펴보면 모델이 주택 구매용 대출 신청의 약 70% 를 '승인됨'으로 예측하고 주택 구매용이 아닌 대출의 46% 만 '승인됨'으로 예측하는 것을 알 수 있습니다 (정확한 비율은 모델에 따라 다름).

318a8d5a8ffc6bea.png

왼쪽의 라디오 버튼에서 인구통계 동등성을 선택하면 모델이 두 슬라이스에서 비슷한 비율의 지원자에 대해 approved를 예측하도록 두 기준점이 조정됩니다. 이렇게 하면 각 슬라이스의 정확도, 거짓양성, 거짓음성이 어떻게 되나요?

6단계: 기능 분포 살펴보기

마지막으로 What-if 도구의 기능 탭으로 이동합니다. 데이터 세트의 각 특성 값 분포를 보여줍니다.

48ab3c4879793324.png

이 탭을 사용하여 데이터 세트가 균형을 이루는지 확인할 수 있습니다. 예를 들어 데이터 세트의 대출 중 농무부에서 시작된 대출은 매우 적은 것으로 보입니다. 모델 정확도를 높이기 위해 해당 기관의 대출 데이터를 더 추가할 수 있습니다(데이터가 있는 경우).

여기에서는 몇 가지 What-if 도구 탐색 아이디어만 설명했습니다. 이 도구를 계속 사용해 보세요. 탐색할 수 있는 영역이 훨씬 더 많습니다.

8. 삭제

이 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Notebooks UI에서 노트북을 선택한 다음 중지를 선택합니다.

879147427150b6c7.png

이 실습에서 만든 모든 리소스를 삭제하려면 노트북 인스턴스를 중지하는 대신 삭제하면 됩니다.

Cloud 콘솔의 탐색 메뉴를 사용하여 스토리지로 이동하고 모델 애셋을 저장하기 위해 만든 두 버킷을 모두 삭제합니다.