1. 개요
이 실습에서는 AI Platform Notebooks를 사용하여 허위 거래를 식별하는 모델을 빌드하고 학습시키며, Explainable AI SDK를 사용하여 모델의 예측을 이해합니다. 사기 탐지는 금융 서비스에 특화된 이상 감지 유형으로, 본질적으로 불균형한 데이터 세트와 모델 결과를 설명해야 하는 필요성 등 ML 모델에 흥미로운 과제를 제시합니다.
학습 내용
다음 작업을 수행하는 방법을 배우게 됩니다.
- 불균형 데이터 세트 처리
- AI Platform Notebooks에서 tf.keras를 사용하여 사기 감지 모델 빌드 및 평가
- 노트북 내에서 Explainable AI SDK를 사용하여 모델이 거래를 사기로 분류한 이유를 파악합니다.
- 설명과 함께 AI Platform에 모델을 배포하고 배포된 모델에 대한 예측 및 설명 가져오기
Google Cloud에서 이 실습을 진행하는 데 드는 총 비용은 약 $1입니다.
2. 사기 행위 감지가 필요한 이유
데이터에서 이상치를 식별하기 위해 일련의 규칙 기반 문을 작성하기 어려운 경우가 많으므로 이상치 감지는 머신러닝에 적합한 후보가 될 수 있습니다. 사기 감지는 이상 감지의 한 유형이며 머신러닝과 관련해 두 가지 흥미로운 과제가 있습니다.
- 매우 불균형한 데이터 세트: 이상치는 이상치이므로 이상치가 많지 않습니다. ML은 데이터 세트가 균형을 이룰 때 가장 잘 작동하므로 이상치가 데이터의 1% 미만을 차지하면 복잡해질 수 있습니다.
- 결과 설명 필요: 사기 행위를 찾는 경우 시스템의 말을 그대로 받아들이기보다는 시스템에서 특정 항목을 사기로 표시한 이유를 알고 싶을 것입니다. 설명 가능성 도구가 도움이 될 수 있습니다.
3. 환경 설정
이 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 섹션으로 이동하여 새 인스턴스를 클릭합니다. 그런 다음 GPU가 없는 TensorFlow Enterprise 2.1 인스턴스 유형을 선택합니다.

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

인스턴스를 열 때 런처에서 Python 3 노트북을 선택합니다.

4단계: Python 패키지 가져오기
새 셀을 만들고 이 Codelab에서 사용할 라이브러리를 가져옵니다.
import itertools
import numpy as np
import pandas as pd
import tensorflow as tf
import json
import matplotlib as mpl
import matplotlib.pyplot as plt
import explainable_ai_sdk
from sklearn.utils import shuffle
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
from tensorflow import keras
from explainable_ai_sdk.metadata.tf.v2 import SavedModelMetadataBuilder
4. 데이터 다운로드 및 처리
Kaggle의 이 합성 데이터 세트를 사용하여 모델을 학습시킵니다. 원래 데이터 세트에는 630만 개의 행이 포함되어 있으며 그중 8, 000개가 사기 거래입니다. 이는 전체 데이터 세트의 0.1% 에 불과합니다.
1단계: Kaggle 데이터 세트 다운로드 및 Pandas로 읽기
Google Cloud Storage에서 Kaggle 데이터 세트를 사용할 수 있습니다. Jupyter 노트북에서 다음 gsutil 명령어를 실행하여 다운로드할 수 있습니다.
!gsutil cp gs://financial_fraud_detection/fraud_data_kaggle.csv .
다음으로 데이터 세트를 Pandas DataFrame으로 읽고 미리 봅니다.
data = pd.read_csv('fraud_data_kaggle.csv')
data = data.drop(columns=['type'])
data.head()
미리보기에는 다음과 같이 표시됩니다.

2단계: 불균형 데이터 고려
위에서 언급한 것처럼 현재 데이터 세트에는 사기가 아닌 예가 99.9% 포함되어 있습니다. 데이터를 그대로 사용하여 모델을 학습하면 데이터의 99.9% 가 사기가 아닌 사례이기 때문에 모델이 모든 거래가 사기가 아니라고 추측하여 99.9% 의 정확도에 도달할 가능성이 있습니다.
불균형 데이터를 처리하는 방법에는 여러 가지가 있습니다. 여기서는 다운샘플링이라는 기법을 사용합니다. 다운샘플링은 학습에서 다수 클래스의 일부만 사용하는 것을 의미합니다. 이 경우 데이터의 99.9% 를 차지하는 '사기 아님'이 다수 클래스입니다.
데이터 세트를 다운샘플링하기 위해 사기 사례 약 8,000개와 사기가 아닌 사례 약 31,000개의 무작위 샘플을 가져옵니다. 이렇게 하면 결과 데이터 세트에 사기 사례가 25% 포함됩니다(이전에는 0 .1% 였음).
먼저 데이터를 두 개의 DataFrame으로 분할합니다. 하나는 사기용이고 다른 하나는 사기 외용입니다. 이는 Codelab에서 나중에 모델을 배포할 때 사용됩니다.
fraud = data[data['isFraud'] == 1]
not_fraud = data[data['isFraud'] == 0]
그런 다음 사기가 아닌 케이스를 무작위로 샘플링합니다. 사기/비사기 거래를 25 / 75로 분할하므로 0 .005% 를 사용합니다. 이제 데이터를 다시 합치고 섞을 수 있습니다. 간소화를 위해 학습에 사용하지 않을 몇 가지 열도 삭제합니다.
# Take a random sample of non fraud rows
not_fraud_sample = not_fraud.sample(random_state=2, frac=.005)
# Put it back together and shuffle
df = pd.concat([not_fraud_sample,fraud])
df = shuffle(df, random_state=2)
# Remove a few columns (isFraud is the label column we'll use, not isFlaggedFraud)
df = df.drop(columns=['nameOrig', 'nameDest', 'isFlaggedFraud'])
# Preview the updated dataset
df.head()
이제 훨씬 더 균형 잡힌 데이터 세트가 있습니다. 하지만 모델이 정확도 75% 로 수렴하는 경우 모든 사례에서 '사기 아님'을 추측할 가능성이 높습니다.
3단계: 데이터를 학습 세트와 테스트 세트로 분할하기
모델을 빌드하기 전에 마지막으로 해야 할 일은 데이터를 분할하는 것입니다. 80/20 학습-테스트 분할을 사용합니다.
train_test_split = int(len(df) * .8)
train_set = df[:train_test_split]
test_set = df[train_test_split:]
train_labels = train_set.pop('isFraud')
test_labels = test_set.pop('isFraud')
*E. A. Lopez-Rojas , A. Elmir, and S. Axelsson 'PaySim: A financial mobile money simulator for fraud detection'(PaySim: 사기 감지를 위한 금융 모바일 머니 시뮬레이터) In: The 28th European Modeling and Simulation Symposium-EMSS, Larnaca, Cyprus. 2016
5. tf.keras 모델 빌드, 학습, 평가
TensorFlow의 tf.keras API를 사용하여 빌드합니다. 이 섹션의 모델 코드는 TensorFlow 문서의 이 튜토리얼을 기반으로 합니다. 먼저 데이터를 정규화한 다음 class_weight 매개변수를 사용하여 나머지 데이터 불균형을 고려하여 모델을 빌드하고 학습시킵니다.
1단계: 데이터 정규화하기
수치 데이터로 모델을 학습할 때는 데이터를 정규화하는 것이 중요합니다. 특히 각 열이 서로 다른 범위에 속하는 경우 더욱 그렇습니다. 이렇게 하면 학습 중에 손실이 폭발하는 것을 방지할 수 있습니다. 다음과 같이 데이터를 정규화할 수 있습니다.
scaler = StandardScaler()
train_set = scaler.fit_transform(train_set) # Only normalize on the train set
test_set = scaler.transform(test_set)
# clip() ensures all values fall within the range [-5,5]
# useful if any outliers remain after normalizing
train_set = np.clip(train_set, -5, 5)
test_set = np.clip(test_set, -5, 5)
그런 다음 정규화된 데이터를 미리 봅니다.
train_set
2단계: 클래스 가중치 결정
데이터를 다운샘플링할 때 사기가 아닌 거래의 하위 집합을 유지하여 이러한 거래에 관한 정보를 잃지 않으려고 했기 때문에 데이터가 완벽하게 균형을 이루지 않았습니다. 데이터 세트가 여전히 불균형하고 사기 거래를 올바르게 식별하는 것이 가장 중요하므로 모델이 데이터 세트에서 사기 예시에 더 많은 가중치를 부여하도록 합니다.
Keras class_weight 매개변수를 사용하면 데이터 세트에서 각 클래스가 발생하는 빈도에 따라 각 클래스의 예시에 부여할 가중치를 정확하게 지정할 수 있습니다.
weight_for_non_fraud = 1.0 / df['isFraud'].value_counts()[0]
weight_for_fraud = 1.0 / df['isFraud'].value_counts()[1]
class_weight = {0: weight_for_non_fraud, 1: weight_for_fraud}
다음 단계에서 모델을 학습할 때 이 변수를 사용합니다.
3단계: 모델 학습 및 평가
Keras Sequential Model API를 사용하여 모델을 빌드합니다. 이 API를 사용하면 모델을 레이어 스택으로 정의할 수 있습니다. 학습 중에 추적하는 여러 측정항목이 있으며, 이를 통해 데이터 세트의 각 클래스에서 모델이 얼마나 잘 작동하는지 파악할 수 있습니다.
METRICS = [
keras.metrics.TruePositives(name='tp'),
keras.metrics.FalsePositives(name='fp'),
keras.metrics.TrueNegatives(name='tn'),
keras.metrics.FalseNegatives(name='fn'),
keras.metrics.BinaryAccuracy(name='accuracy'),
keras.metrics.Precision(name='precision'),
keras.metrics.Recall(name='recall'),
keras.metrics.AUC(name='auc'),
]
def make_model(metrics = METRICS):
model = keras.Sequential([
keras.layers.Dense(
16, activation='relu',
input_shape=(train_set.shape[-1],)),
keras.layers.Dropout(0.5),
keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(
optimizer=keras.optimizers.Adam(lr=1e-3),
loss=keras.losses.BinaryCrossentropy(),
metrics=metrics)
return model
그런 다음 학습 중에 사용할 몇 가지 전역 변수와 조기 중지 매개변수를 정의합니다.
EPOCHS = 100
BATCH_SIZE = 512
early_stopping = tf.keras.callbacks.EarlyStopping(
monitor='val_auc',
verbose=1,
patience=10,
mode='max',
restore_best_weights=True)
마지막으로 위에서 정의한 함수를 호출하여 모델을 만듭니다.
model = make_model()
model.summary()
위에서 정의한 매개변수를 전달하여 fit() 메서드로 모델을 학습시킬 수 있습니다.
results = model.fit(
train_set,
train_labels,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
callbacks = [early_stopping],
validation_data=(test_set, test_labels),
class_weight=class_weight)
학습을 실행하는 데 몇 분 정도 걸립니다.
4단계: 모델 측정항목 시각화하기
학습된 모델이 있으니 학습 에포크 전반에 걸쳐 다양한 측정항목을 플롯하여 모델의 성능을 살펴보겠습니다.
mpl.rcParams['figure.figsize'] = (12, 10)
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
def plot_metrics(history):
metrics = ['loss', 'auc', 'precision', 'recall']
for n, metric in enumerate(metrics):
name = metric.replace("_"," ").capitalize()
plt.subplot(2,2,n+1)
plt.plot(history.epoch, history.history[metric], color=colors[0], label='Train')
plt.plot(history.epoch, history.history['val_'+metric],
color=colors[0], linestyle="--", label='Val')
plt.xlabel('Epoch')
plt.ylabel(name)
if metric == 'loss':
plt.ylim([0, plt.ylim()[1]])
elif metric == 'auc':
plt.ylim([0.8,1])
else:
plt.ylim([0,1])
plt.legend()
plot_metrics(results)
그래프는 다음과 비슷하게 표시됩니다 (정확히 동일하지는 않음).

5단계: 혼동 행렬 출력
혼동 행렬은 테스트 데이터 세트에서 모델이 어떤 성능을 보였는지 시각화하는 좋은 방법입니다. 각 클래스에 대해 모델이 올바르게 예측한 테스트 예시와 잘못 예측한 테스트 예시의 비율을 보여줍니다. Scikit Learn에는 혼동 행렬을 만들고 플롯하는 유틸리티가 있으며 여기에서 이를 사용합니다.
노트북 시작 부분에서 confusion_matrix 유틸리티를 가져왔습니다. 이를 사용하려면 먼저 모델의 예측 목록을 만들어야 합니다. 여기서는 모델에서 반환된 값을 반올림하여 이 목록이 정답 라벨 목록과 일치하도록 합니다.
predicted = model.predict(test_set)
y_pred = []
for i in predicted.tolist():
y_pred.append(int(round(i[0])))
이제 정답 라벨과 함께 이 데이터를 confusion_matrix 메서드에 입력할 준비가 되었습니다.
cm = confusion_matrix(test_labels.values, y_pred)
print(cm)
이를 통해 테스트 세트에서 모델이 올바르게 예측한 수와 잘못 예측한 수를 절대값으로 확인할 수 있습니다. 왼쪽 상단의 숫자는 모델이 테스트 세트에서 사기가 아닌 것으로 올바르게 예측한 예시의 수를 나타냅니다. 오른쪽 하단의 숫자는 사기로 올바르게 예측된 수를 나타냅니다 (이 숫자가 가장 중요함). 각 클래스에 대해 대부분의 샘플을 올바르게 예측한 것을 확인할 수 있습니다.
이를 더 쉽게 시각화하기 위해 Scikit Learn 문서의 plot_confusion_matrix 함수를 적용했습니다. 여기에 함수를 정의합니다.
def plot_confusion_matrix(cm, classes,
normalize=False,
title='Confusion matrix',
cmap=plt.cm.Blues):
"""
This function prints and plots the confusion matrix.
Normalization can be applied by setting `normalize=True`.
"""
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45)
plt.yticks(tick_marks, classes)
if normalize:
cm = np.round(cm.astype('float') / cm.sum(axis=1)[:, np.newaxis], 3)
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, cm[i, j],
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
모델의 데이터를 전달하여 플롯을 만듭니다. 여기서는 혼동 행렬에 올바른 예측과 잘못된 예측의 수가 백분율로 표시되도록 normalize을 True로 설정합니다.
classes = ['not fraud', 'fraud']
plot_confusion_matrix(cm, classes, normalize=True)
다음과 같이 표시됩니다 (정확한 숫자는 다를 수 있음).

여기서 모델이 테스트 세트의 1,594건의 사기 거래 중 약 85% 를 올바르게 예측한 것을 확인할 수 있습니다. 이 실습에서는 모델 품질에 중점을 두지 않습니다. 프로덕션 환경에 사기 감지 모델을 배포하는 경우 사기 클래스의 정확도가 85% 보다 높아야 할 수 있습니다. 이 실습의 목표는 불균형 데이터 세트에서 학습된 모델을 설명하는 도구를 소개하는 것입니다.
다음으로 Explainable AI SDK를 사용하여 모델이 이러한 예측을 수행하는 데 사용하는 특성을 파악합니다.
6. Explainable AI SDK 사용
Explainable AI SDK는 모델에 대한 설명을 가져오는 유틸리티 메서드를 제공합니다. Tensorflow AI Platform Notebook 인스턴스에 사전 설치되어 있습니다. 실습 시작 시 노트북에 가져온 것을 확인하세요. SDK를 사용하면 노트북 인스턴스 내에서 모델의 특성 기여도를 가져올 수 있으므로 모델을 사용하기 위해 클라우드에 배포할 필요가 없습니다.
이 섹션에서는 방금 학습한 모델을 TensorFlow SavedModel로 내보낸 다음 저장된 모델 애셋을 가리키도록 SDK를 설정하여 설명을 가져옵니다.
1단계: 학습된 모델 내보내기
먼저 모델을 노트북 인스턴스의 디렉터리에 저장합니다.
model_dir = 'fraud_model'
tf.saved_model.save(model, model_dir)
노트북의 왼쪽 사이드바에서 폴더 뷰를 새로고침하면 fraud_model/라는 새 디렉터리가 생성됩니다.
2단계: SDK로 설명 메타데이터 가져오기
그런 다음 Explainable AI SDK가 해당 디렉터리를 가리키도록 합니다. 이렇게 하면 모델 설명을 가져오는 데 필요한 메타데이터가 생성됩니다. get_metadata() 메서드는 SDK가 모델에서 추론한 메타데이터(예: 입력 이름)를 보여줍니다.
model_builder = SavedModelMetadataBuilder(model_dir)
metadata = model_builder.get_metadata()
print(metadata)
설명 가능성은 '모델이 왜 사기라고 생각했지?'라는 질문에 답하는 데 도움이 됩니다.
3단계: 모델의 기준 지정하기
표 형식 데이터의 경우 Explainable AI 서비스는 각 특성의 기여 분석 값을 반환하여 작동합니다. 이 값은 특정 특성이 예측에 영향을 미친 정도를 나타냅니다. 특정 거래 금액으로 인해 모델에서 예측한 사기 확률이 0.2% 증가했다고 가정해 보겠습니다. '무엇에 대한 0.2% 인가?'라고 생각하실 수 있습니다. 이러한 이유로 기준선이라는 개념이 등장합니다.
모델의 기준은 기본적으로 비교 대상입니다. 모델의 각 특성에 대한 기준 값을 선택하면 특성이 기준 값으로 설정될 때 모델이 예측하는 값이 기준 예측이 됩니다.
기준선 선택은 해결하려는 예측 작업에 따라 달라집니다. 숫자 특성의 경우 데이터 세트의 각 특성 중앙값을 기준선으로 사용하는 것이 일반적입니다. 하지만 사기 감지의 경우 이것이 정확히 원하는 것은 아닙니다. Google은 모델이 거래에 사기 라벨을 지정하는 경우를 설명하는 데 가장 중점을 둡니다. 즉, 비교할 기준 사례는 사기가 아닌 거래입니다.
이를 고려하기 위해 데이터 세트에서 사기가 아닌 거래의 중간값을 기준선으로 사용합니다. 위에서 추출한 not_fraud_sample DataFrame을 사용하고 모델의 예상 입력과 일치하도록 확장하여 중앙값을 구할 수 있습니다.
not_fraud_sample = not_fraud_sample.drop(columns=['nameOrig', 'nameDest', 'isFlaggedFraud', 'isFraud'])
baseline = scaler.transform(not_fraud_sample.values)
baseline = np.clip(baseline, -5, 5)
baseline_values = np.median(baseline, axis=0)
기준선을 지정할 필요가 없습니다. 그렇지 않으면 SDK는 모델에서 예상하는 각 입력 값의 기준으로 0을 사용합니다. 사기 감지 사용 사례에서는 기준을 지정하는 것이 좋습니다. 아래에서 기준을 지정해 보겠습니다.
input_name = list(metadata['inputs'])[0]
model_builder.set_numeric_metadata(input_name, input_baselines=[baseline_values.tolist()], index_feature_mapping=df.columns.tolist()[:6])
model_builder.save_metadata(model_dir)
위의 save_metadata() 메서드를 실행하면 모델의 디렉터리에 explanation_metadata.json이라는 파일이 생성되었습니다. 노트북에서 fraud_model/ 디렉터리로 이동하여 파일이 생성되었는지 확인합니다. 여기에는 SDK가 기능 기여도를 생성하는 데 사용하는 메타데이터가 포함됩니다.
4단계: 모델 설명 가져오기
이제 개별 예시에서 특성 기여도를 가져올 준비가 되었습니다. 이렇게 하려면 먼저 SDK를 사용하여 모델에 대한 로컬 참조를 만듭니다.
local_model = explainable_ai_sdk.load_model_from_local_path(
model_dir,
explainable_ai_sdk.SampledShapleyConfig()
)
다음으로 사기로 분류되어야 하는 예시 거래에서 모델에 대한 예측과 설명을 가져옵니다.
fraud_example = [0.722,0.139,-0.114,-0.258,-0.271,-0.305]
response = local_model.explain([{input_name: fraud_example}])
response[0].visualize_attributions()
이 코드를 실행하면 다음과 같은 시각화가 생성됩니다.

이 예에서는 거래가 발생하기 전 계정의 초기 잔액이 사기의 가장 큰 지표였으며, 이로 인해 모델의 예측이 기준선에서 0.5 이상으로 상승했습니다. 거래 금액, 대상 계정의 잔액, 단계가 그 다음으로 큰 지표였습니다. 데이터 세트에서 'step'은 시간 단위를 나타냅니다 (1단계는 1시간). 기여 분석 값은 음수일 수도 있습니다.
시각화 위에 인쇄된 '근사치 오류'를 통해 설명을 얼마나 신뢰할 수 있는지 알 수 있습니다. 일반적으로 오류가 5% 를 초과하면 기능 기여도를 신뢰할 수 없습니다. 설명의 품질은 사용한 학습 데이터와 모델에 따라 달라집니다. 학습 데이터, 모델을 개선하거나 다른 모델 기준을 사용하면 근사 오차를 줄일 수 있습니다.
설명 방법에 사용되는 단계 수를 늘려 이 오류를 줄일 수도 있습니다. 설명 구성에 path_count 매개변수를 추가하여 SDK로 이를 변경할 수 있습니다 (지정하지 않으면 기본값은 10임).
local_model = explainable_ai_sdk.load_model_from_local_path(
model_dir,
explainable_ai_sdk.SampledShapleyConfig(path_count=20)
)
이 모델에서 설명 가능한 AI로 할 수 있는 작업은 훨씬 더 많습니다. 예를 들면 다음과 같습니다.
- 모델에 많은 예시를 전송하고 기여도 값을 평균하여 특정 특성이 전반적으로 더 중요한지 확인합니다. 이를 통해 모델을 개선하고 중요하지 않은 기능을 삭제할 수 있습니다.
- 모델에서 사기로 표시했지만 사기가 아닌 거래를 거짓양성으로 찾아내고 기여도 값을 검사합니다.
- 다른 기준을 사용하여 기여도 값에 미치는 영향 확인
🎉 수고하셨습니다. 🎉
불균형 데이터를 고려하고, 허위 거래를 감지하도록 TensorFlow 모델을 학습시키고, Explainable AI SDK를 사용하여 모델이 개별 예측을 수행하는 데 가장 많이 사용하는 기능을 확인하는 방법을 알아봤습니다. 원한다면 여기서 멈춰도 됩니다. 노트북 내에서 SDK를 사용하면 모델을 배포하기 전에 설명을 확인할 수 있으므로 모델 개발 프로세스를 간소화할 수 있습니다. 만족스러운 모델을 빌드했다면 대규모로 예측을 수행하기 위해 모델을 배포하고 싶을 것입니다. 이 경우 다음 선택 단계를 계속 진행하세요. 완료되면 정리 단계로 건너뜁니다.
7. 선택사항: AI Platform Prediction에 모델 배포
이 단계에서는 AI Platform Prediction에 모델을 배포하는 방법을 알아봅니다.
1단계: 저장된 모델 디렉터리를 Cloud Storage 버킷에 복사합니다.
이전에 실행한 SDK 단계를 통해 AI Platform에 모델을 배포하는 데 필요한 모든 것을 갖추었습니다. 배포를 준비하려면 설명 가능한 AI 서비스가 읽을 수 있는 Cloud Storage 버킷에 SavedModel 애셋과 설명 메타데이터를 넣어야 합니다.
이를 위해 몇 가지 환경 변수를 정의합니다. 아래에 Google Cloud 프로젝트 이름과 만들려는 버킷 이름 (전역적으로 고유해야 함)을 입력합니다.
# Update these to your own GCP project and model
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
이제 내보낸 TensorFlow 모델 애셋을 저장할 스토리지 버킷을 만들 준비가 되었습니다. 모델을 배포할 때 AI Platform이 이 버킷을 가리키도록 합니다.
노트북 내에서 다음 gsutil 명령어를 실행하여 버킷을 만듭니다.
!gsutil mb -l 'us-central1' $MODEL_BUCKET
그런 다음 로컬 모델 디렉터리를 해당 버킷에 복사합니다.
!gsutil -m cp -r ./$model_dir/* $MODEL_BUCKET/explanations
2단계: 모델 배포하기
다음으로 배포 명령어에 사용할 몇 가지 변수를 정의합니다.
MODEL = 'fraud_detection'
VERSION = 'v1'
model_path = MODEL_BUCKET + '/explanations'
다음 gcloud 명령어를 사용하여 모델을 만들 수 있습니다.
!gcloud ai-platform models create $MODEL --region=us-central1
이제 gcloud를 사용하여 이 모델의 첫 번째 버전을 배포할 준비가 되었습니다. 버전이 배포되는 데 약 5~10분이 소요됩니다.
!gcloud beta ai-platform versions create $VERSION \
--model $MODEL \
--origin $model_path \
--runtime-version 2.1 \
--framework TENSORFLOW \
--python-version 3.7 \
--machine-type n1-standard-4 \
--explanation-method 'sampled-shapley' \
--num-paths 10 \
--region=us-central1
origin 플래그에서 저장된 모델과 메타데이터 파일의 Cloud Storage 위치를 전달합니다. Explainable AI에는 현재 테이블 형식 모델에 사용할 수 있는 두 가지 설명 방법이 있습니다. 여기서는 샘플링된 Shapley를 사용합니다. num-paths 매개변수는 각 입력 특성에 대해 샘플링된 경로의 수를 나타냅니다. 일반적으로 모델이 복잡할수록 적절한 수렴에 도달하는 데 더 많은 근사 단계가 필요합니다.
모델이 올바르게 배포되었는지 확인하려면 다음 gcloud 명령어를 실행합니다.
!gcloud ai-platform versions describe $VERSION --model $MODEL --region=us-central1
상태는 READY이어야 합니다.
3단계: 배포된 모델에서 예측 및 설명 가져오기
설명 가능성이라는 측면에서 Google은 모델이 사기를 예측하는 사례를 설명하는 데 가장 큰 관심을 두고 있습니다. 모두 사기 거래인 5개의 테스트 예시를 모델에 전송합니다.
Google Cloud CLI를 사용하여 예측을 가져옵니다. 다음 코드를 실행하여 테스트 세트에서 모든 사기 예시의 색인을 가져옵니다.
fraud_indices = []
for i,val in enumerate(test_labels):
if val == 1:
fraud_indices.append(i)
다음으로 모델이 예상하는 형식으로 예시 5개를 저장하고 파일에 씁니다.
num_test_examples = 5
instances = []
for i in range(num_test_examples):
ex = test_set[fraud_indices[i]]
instances.append({input_name: ex.tolist()})
with open('prediction.json', 'a') as outputfile:
json.dump({"instances": instances}, outputfile)
gcloud를 사용하여 이러한 5가지 예시를 모델에 전송할 수 있습니다.
!gcloud beta ai-platform explain \
--model=$MODEL \
--version=$VERSION \
--region='us-central1' \
--json-request=prediction.json
응답 JSON에는 이러한 예시 전반에 걸쳐 각 기능의 기여 값이 표시됩니다. 각 예의 example_score 키에는 모델의 예측이 포함됩니다. 이 경우 특정 거래가 사기일 가능성을 나타내는 백분율입니다.
8. 삭제
이 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Notebooks UI에서 노트북을 선택한 다음 중지를 선택합니다.

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