What-If 도구와 Vertex AI를 사용하여 재무 ML 모델 빌드

1. 개요

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

학습 내용

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

  • 호스팅된 노트북에서 공개 모기지 데이터 세트로 XGBoost 모델 학습
  • What-If 도구를 사용하여 모델 분석
  • Vertex AI에 XGBoost 모델 배포

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

2. Vertex AI 소개

이 실습에서는 Google Cloud에서 제공되는 최신 AI 제품을 사용합니다. Vertex AI는 Google Cloud 전반의 ML 제품을 원활한 개발 환경으로 통합합니다. 예전에는 AutoML로 학습된 모델과 커스텀 모델은 별도의 서비스를 통해 액세스할 수 있었습니다. 새 서비스는 다른 새로운 제품과 함께 두 가지 모두를 단일 API로 결합합니다. 기존 프로젝트를 Vertex AI로 이전할 수도 있습니다. 의견이 있는 경우 지원 페이지를 참고하세요.

Vertex AI에는 엔드 투 엔드 ML 워크플로를 지원하는 다양한 제품이 포함되어 있습니다. 이 실습에서는 아래에 강조 표시된 예측 및 Notebooks 제품에 중점을 둡니다.

Vertex 제품 개요

3. 간단한 XGBoost 입문서

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

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

트리 모델 예시

이 모델에 XGBoost를 사용하는 이유 기존 신경망은 이미지와 텍스트와 같은 비정형 데이터에서 가장 우수한 성능을 보이지만, 결정 트리는 이 Codelab에서 사용할 모기지 데이터 세트와 같은 구조화된 데이터에서 매우 우수한 성능을 보입니다.

4. 환경 설정

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

1단계: Compute Engine API 사용 설정

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

2단계: Vertex AI API 사용 설정

Cloud 콘솔의 Vertex 섹션으로 이동하여 Vertex AI API 사용 설정을 클릭합니다.

Vertex 대시보드

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

Cloud 콘솔의 Vertex 섹션에서 'Notebooks'를 클릭합니다.

노트북 선택

여기에서 새 인스턴스를 선택합니다. 그런 다음 GPU가 없는 TensorFlow Enterprise 2.3 인스턴스 유형을 선택합니다.

TFE 인스턴스

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

4단계: XGBoost 설치

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

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

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

pip3 install xgboost==1.2

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

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

노트북의 첫 번째 셀에서 다음 가져오기를 추가하고 셀을 실행합니다. 상단 메뉴에서 오른쪽 화살표 버튼을 누르거나 ⌘-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

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

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

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개 행을 미리 볼 수 있습니다. 위의 셀을 실행하면 다음과 같이 표시됩니다.

주택담보대출 데이터 세트 미리보기

이것들은 모델을 학습시키는 데 사용할 특성입니다. 끝까지 스크롤하면 예측 대상인 마지막 열 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' 열에 'blue'와 'red'의 가능한 값이 있는 경우 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와 같은 지형지물)이 여러 열로 분할된 것을 볼 수 있습니다.

Pandas 더미 열

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

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

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

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

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

6. 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')

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

1단계: What-If 도구 시각화 만들기

가정 분석 도구를 로컬 모델에 연결하려면 테스트 예시의 하위 집합과 해당 예시의 정답 값을 전달해야 합니다. 테스트 예시 500개와 정답 라벨로 구성된 Numpy 배열을 만들어 보겠습니다.

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

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

What-if 도구는 모델의 각 클래스 (이 경우 2)에 대한 점수 목록을 예상하므로 What-if 도구와 함께 XGBoost의 predict_proba 메서드를 사용합니다.

config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['mortgage_status'])
  .set_custom_predict_fn(model.predict_proba)
  .set_target_feature('mortgage_status')
  .set_label_vocab(['denied', 'approved']))
WitWidget(config_builder, height=800)

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

What-If 도구 초기 뷰

y축에는 모델의 예측이 표시되며, 1는 신뢰도가 높은 approved 예측이고 0는 신뢰도가 높은 denied 예측입니다. x축은 로드된 모든 데이터 포인트의 확산입니다.

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

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

아래 예에서는 0 .5 기준점에 가까운 데이터 포인트를 선택했습니다. 이 특정 데이터 포인트와 연결된 모기지 신청서는 CFPB에서 시작되었습니다. 이 대출이 HUD에서 발생한 경우 모델의 예측에 어떤 영향을 미치는지 확인하기 위해 이 기능을 0으로 변경하고 agency_code_Department of Housing and Urban Development (HUD) 값을 1로 변경했습니다.

시뮬레이션 도구의 왼쪽 하단 섹션에서 볼 수 있듯이 이 기능을 변경하면 모델의 approved 예측이 32% 크게 감소했습니다. 이는 대출을 받은 대행사가 모델의 출력에 큰 영향을 미친다는 것을 나타낼 수 있지만, 확실히 하려면 더 많은 분석이 필요합니다.

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

3단계: 대조군 분석

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

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

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

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

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

applicant_income_thousands는 숫자형 특성이며 부분 종속 그래프에서 소득이 높을수록 신청이 승인될 가능성이 약간 증가하지만 최대 20만 달러까지만 증가하는 것을 확인할 수 있습니다. 20만 달러를 초과하면 이 기능이 모델의 예측에 영향을 미치지 않습니다.

5단계: 전반적인 실적 및 공정성 살펴보기

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

정답 지형지물로 mortgage_status를 선택하여 혼동 행렬을 확인합니다.

이 혼동 행렬은 모델의 올바른 예측과 오답을 전체 대비 비율로 보여줍니다. 실제 예 / 예측 예실제 아니요 / 예측 아니요의 정사각형을 더하면 모델과 동일한 정확성 (이 경우 약 87%이지만 학습 ML 모델에 무작위성 요소가 있으므로 모델에 약간 차이가 있을 수 있음)이 됩니다.

또한 임곗값 슬라이더로 실험하여 모델이 대출에 대해 approved를 예측하기로 결정하기 전에 반환해야 하는 양성 분류 점수를 올리거나 내리고, 이 점수에 따라 정확성, 거짓양성, 거짓음성이 어떻게 달라지는지 확인할 수 있습니다. 이 경우 정확성은 기준점인 .55에서 가장 높습니다.

그런 다음 왼쪽 기준별로 자르기 드롭다운에서 loan_purpose_Home_purchase를 선택합니다.

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

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

왼쪽의 라디오 버튼에서 인구통계 동등성을 선택하면 두 슬라이스의 신청자 비율이 비슷하도록 두 임곗값이 조정됩니다.approved 이렇게 하면 각 슬라이스의 정확도, 거짓양성, 거짓음성에 어떤 영향을 미치나요?

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

마지막으로 What-If 도구의 기능 탭으로 이동합니다. 데이터 세트의 각 지형지물에 대한 값의 분포가 표시됩니다.

이 탭을 사용하여 데이터 세트의 균형을 맞출 수 있습니다. 예를 들어 데이터 세트에서 농업 서비스국의 대출은 거의 없는 것으로 보입니다. 모델 정확성을 개선하기 위해 데이터를 사용할 수 있는 경우 해당 기관의 대출을 더 추가할 수 있습니다.

다음은 What-If 도구 탐색에 관한 몇 가지 아이디어입니다. 살펴봐야 할 영역이 더 많이 있으니 계속 자유롭게 도구를 사용해 보세요.

8. Vertex AI에 모델 배포

모델이 로컬에서 작동하지만 이 노트북뿐만 아니라 어디서나 모델을 예측할 수 있으면 좋겠습니다. 이 단계에서는 클라우드에 배포합니다.

1단계: 모델을 위한 Cloud Storage 버킷 만들기

먼저 Codelab의 나머지 부분에서 사용할 몇 가지 환경 변수를 정의해 보겠습니다. 아래 값에 Google Cloud 프로젝트 이름, 만들려는 Cloud Storage 버킷 이름 (전 세계적으로 고유해야 함), 모델의 첫 번째 버전의 버전 이름을 입력합니다.

# Update the variables below to your own Google Cloud project ID and GCS bucket name. You can leave the model name we've specified below:
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
MODEL_NAME = 'xgb_mortgage'

이제 XGBoost 모델 파일을 저장할 스토리지 버킷을 만들 준비가 되었습니다. 배포 시 Vertex AI를 이 파일로 가리킵니다.

노트북 내에서 이 gsutil 명령어를 실행하여 리전 스토리지 버킷을 만듭니다.

!gsutil mb -l us-central1 $MODEL_BUCKET

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

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

!gsutil cp ./model.bst $MODEL_BUCKET

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

3단계: 모델 만들기 및 엔드포인트에 배포

이제 클라우드에 모델을 배포할 준비가 거의 되었습니다. Vertex AI에서 모델은 여러 엔드포인트를 보유할 수 있습니다. 먼저 모델을 만든 다음 해당 모델 내에 엔드포인트를 만들고 배포합니다.

먼저 gcloud CLI를 사용하여 모델을 만듭니다.

!gcloud beta ai models upload \
--display-name=$MODEL_NAME \
--artifact-uri=$MODEL_BUCKET \
--container-image-uri=us-docker.pkg.dev/cloud-aiplatform/prediction/xgboost-cpu.1-2:latest \
--region=us-central1

artifact-uri 매개변수는 XGBoost 모델을 저장한 스토리지 위치를 가리킵니다. container-image-uri 매개변수는 서빙에 사용할 사전 빌드된 컨테이너를 Vertex AI에 알려줍니다. 이 명령어가 완료되면 Vertex 콘솔의 모델 섹션으로 이동하여 새 모델의 ID를 가져옵니다. 여기에서 확인할 수 있습니다.

콘솔에서 모델 ID 가져오기

이 ID를 복사하여 변수에 저장합니다.

MODEL_ID = "your_model_id"

이제 이 모델 내에 엔드포인트를 만들 차례입니다. 다음 gcloud 명령어를 사용하여 이 작업을 실행할 수 있습니다.

!gcloud beta ai endpoints create \
--display-name=xgb_mortgage_v1 \
--region=us-central1

완료되면 노트북 출력에 기록된 엔드포인트의 위치가 표시됩니다. 엔드포인트가 다음과 같은 경로로 생성되었다는 메시지가 표시된 줄을 찾습니다. projects/project_ID/locations/us-central1/endpoints/endpoint_ID. 그런 다음 아래 값을 위에서 만든 엔드포인트의 ID로 바꿉니다.

ENDPOINT_ID = "your_endpoint_id"

엔드포인트를 배포하려면 아래 gcloud 명령어를 실행합니다.

!gcloud beta ai endpoints deploy-model $ENDPOINT_ID \
--region=us-central1 \
--model=$MODEL_ID \
--display-name=xgb_mortgage_v1 \
--machine-type=n1-standard-2 \
--traffic-split=0=100

엔드포인트 배포는 완료하는 데 5~10분 정도 걸립니다. 엔드포인트가 배포되는 동안 콘솔의 모델 섹션으로 이동합니다. 모델을 클릭하면 엔드포인트가 배포되는 것을 볼 수 있습니다.

배포가 완료되면 로드 스피너가 있던 위치에 녹색 체크표시가 표시됩니다.

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

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

%%writefile predictions.json
{
  "instances": [
    [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]
  ]
}

다음 gcloud 명령어를 실행하여 모델을 테스트합니다.

!gcloud beta ai endpoints predict $ENDPOINT_ID \
--json-request=predictions.json \
--region=us-central1

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

9. 삭제

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

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

배포한 엔드포인트를 삭제하려면 Vertex 콘솔의 엔드포인트 섹션으로 이동하여 삭제 아이콘을 클릭합니다.

스토리지 버킷을 삭제하려면 Cloud 콘솔의 탐색 메뉴를 사용하여 스토리지로 이동하고 버킷을 선택하고 '삭제'를 클릭합니다.