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

1. 개요

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

학습 내용

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

  • AI Platform Notebooks의 공개 주택담보대출 데이터 세트로 XGBoost 모델 학습시키기
  • AI Platform에 XGBoost 모델 배포
  • What-If 도구를 사용하여 모델 분석

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

2. 간단한 XGBoost 기본 지침서

XGBoost결정 트리경사 부스팅을 사용하여 예측 모델을 빌드하는 머신러닝 프레임워크입니다. 트리 내 여러 리프 노드와 연결된 점수를 바탕으로 여러 결정 트리를 함께 앙상블링하는 방식으로 작동합니다.

아래 다이어그램은 일기 예보를 기반으로 스포츠 경기를 플레이해야 하는지 여부를 평가하는 간단한 결정 트리 모델을 시각화한 것입니다.

308a0bfc70733abf.png

이 모델에 XGBoost를 사용하는 이유 기존 신경망은 이미지와 텍스트와 같은 구조화되지 않은 데이터에서 가장 뛰어난 성능을 발휘하는 것으로 나타났지만, 결정 트리는 이 Codelab에서 사용할 주택담보대출 데이터 세트와 같은 정형 데이터에서 매우 뛰어난 성능을 발휘하는 경우가 많습니다.

3. 환경 설정

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

1단계: Cloud AI Platform 모델 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. 데이터 다운로드 및 처리

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

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만 있는 일련의 열로 변환합니다. 예를 들어 'color' 열이 있는 경우 '파란색'으로 설정할 수 있음 '빨간색' get_dummies는 이를 'color_blue'라는 이름의 열 2개로 변환합니다. 및 'color_red' 모두 부울 0과 1 값으로 구성됩니다.

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

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) 범위의 단일 값(승인되지 않은 경우 0, 승인된 경우 1)을 출력하려고 하므로 reg:logistic를 사용합니다.

다음 코드는 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 프로젝트의 이름, 만들려는 클라우드 스토리지 버킷의 이름 (전역적으로 고유해야 함), 모델의 첫 번째 버전 버전 이름을 입력합니다.

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

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 도구 시각화 만들기

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 모델에 전달하는 것만큼 간단합니다.

What-if 도구는 모델의 각 클래스 (여기서는 2)에 대한 점수 목록을 예상하기 때문에 여기서는 선택사항인 adjust_prediction 매개변수를 사용합니다. 이 모델은 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 도구의 기본 보기는 Datapoint 편집기 탭입니다. 여기에서 개별 데이터 포인트를 클릭하여 특성을 보고 특성 값을 변경하며 이러한 변경사항이 개별 데이터 포인트에 대한 모델의 예측에 어떤 영향을 미치는지 확인할 수 있습니다.

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

717620d6a1330479.png

What-If 도구의 왼쪽 하단 섹션에서 확인할 수 있듯이, 이 특성을 변경하면 모델의 approved 예측이 32% 크게 감소했습니다. 이는 대출을 제공한 대행사가 모델의 출력에 큰 영향을 미친다는 것을 나타낼 수 있지만, 확실히 하려면 더 많은 분석이 필요합니다.

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

60ff20ae80ed5e27.png

3단계: 반사실적 분석

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

ae64fd7abefe5449.png

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

4단계: 부분 의존도 그림 살펴보기

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

72117b5ceb683841.png

여기서 HUD에서 발생한 대출이 거부될 가능성이 약간 더 높음을 알 수 있습니다. 기관 코드가 불리언 특성이고 값이 정확히 0 또는 1이어야 하므로 그래프가 이 형태입니다.

applicant_income_thousands는 숫자 특성입니다. 부분 의존도에서는 소득이 높을수록 신청이 승인될 가능성이 약간 높아지지만 최대 $200,000까지 밖에 나지 않는다는 것을 알 수 있습니다. $200, 000 이후에는 이 특성이 모델의 예측에 영향을 미치지 않습니다.

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 콘솔의 탐색 메뉴를 사용하여 Storage로 이동하고 모델 애셋을 저장하기 위해 만든 두 버킷을 모두 삭제합니다.