Cloud AI Platform을 사용한 사기 감지 모델 설명

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 모델 API 사용 설정

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

d0d38662851c6af3.png

2단계: Compute Engine API 사용 설정

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

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

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

9e2b62be57fff946.png

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

fa67fe02f2a9ba73.png

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

4390b1614ae8eae4.png

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()

미리보기에서 다음과 같이 표시됩니다.

8d3d9e022fce1e7f.png

2단계: 불균형 데이터 반영

위에서 언급했듯이 현재 데이터 세트에는 사기가 아닌 예가 99.9% 포함되어 있습니다. 데이터로 모델을 있는 그대로 학습시키면 데이터의 99.9% 가 사기가 아닌 사례라는 이유로 모든 거래가 사기가 아니라고 추측하여 99.9% 의 정확성에 도달할 가능성이 높아집니다.

불균형 데이터를 처리하는 데는 몇 가지 접근 방식이 있습니다. 여기에서는 다운샘플링이라는 기법을 사용합니다. 다운샘플링은 대다수의 클래스 중 소수의 클래스만 학습에 사용하는 것을 의미합니다. 이 경우 '사기 아님' 데이터의 99.9% 를 차지하기 때문에 대부분의 클래스입니다.

데이터 세트를 다운샘플링하기 위해 약 8,000개의 허위 사례와 약 31,000개의 사기 사례가 아닌 무작위 샘플을 모두 취합니다. 이렇게 하면 결과 데이터 세트의 사기 케이스 비율은 이전 0 .1% 와 비교하여 25% 가 됩니다.

먼저 데이터를 두 개의 DataFrame으로 분할합니다. 하나는 사기용이고 하나는 사기가 아닌용입니다. 이 부분은 나중에 모델을 배포할 때 Codelab에서 사용합니다.

fraud = data[data['isFraud'] == 1]
not_fraud = data[data['isFraud'] == 0]

그런 다음 사기가 아닌 케이스에서 무작위 샘플을 추출합니다. 0 .005% 를 사용하면 사기/사기가 아닌 거래를 25 / 75 비율로 분할하여 제공할 수 있습니다. 이렇게 하면 데이터를 다시 합치고 셔플할 수 있습니다. 작업을 단순화하기 위해 학습에 사용하지 않을 몇 개의 열도 삭제됩니다.

# 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')

*동 A. 로페즈-로하스 , A. 엘미르, S. 악셀손. 'PaySim: 사기 감지를 위한 금융 모바일 화폐 시뮬레이터' 참여: 제28회 유럽 모델링 및 시뮬레이션 심포지엄-EMSS, 라르나카, 키프로스. 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를 사용하여 모델을 빌드하겠습니다. 학습하는 동안 추적할 여러 측정항목이 있으므로 데이터 세트의 각 클래스에서 모델의 성능을 이해하는 데 도움이 됩니다.

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)

그래프는 다음과 비슷해야 하지만 완전히 동일하지는 않습니다.

f98a88e530bb341f.png

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

그리고 모델의 데이터를 전달하여 플롯을 만듭니다. 여기서는 혼동 행렬이 올바른 예측 수와 부정확한 예측 수를 백분율로 표시하도록 normalizeTrue로 설정합니다.

classes = ['not fraud', 'fraud']
plot_confusion_matrix(cm, classes, normalize=True)

다음과 같이 표시됩니다 (정확한 숫자는 다를 수 있음).

b52ef4ccddce5d8c.png

여기서 모델이 테스트 세트에서 발생한 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에서 원하는 용도가 아닙니다. DORA에서는 모델에서 거래를 사기로 분류하는 사례를 설명하는 데 가장 중점을 둡니다. 즉, 비교하려는 기준 사례는 사기가 아닌 트랜잭션입니다.

이를 설명하기 위해 데이터 세트에 있는 사기가 아닌 거래의 중앙값을 기준으로 사용하겠습니다. 위에서 추출한 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()

이를 실행하면 다음과 같은 시각화가 생성됩니다.

67211d9396197146.png

이 예시에서는 거래가 발생하기 전 계정의 초기 잔액이 사기의 가장 큰 지표였으며, 이로 인해 모델의 예측이 기준값보다 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)
)

이 모델에서는 Explainable AI로 할 수 있는 작업이 많습니다. 몇 가지 아이디어는 다음과 같습니다.

  • 모델에 많은 예를 전송하고 기여 분석 값의 평균을 구하여 특정 특성이 전반적으로 더 중요한지 확인합니다. 이를 활용하여 모델을 개선하고 중요하지 않은 특성을 삭제할 수 있습니다.
  • 모델에서 사기로 신고했지만 사기가 아닌 거래인 거짓양성을 찾고 기여 분석 값을 검토합니다.
  • 다른 기준을 사용하여 기여 분석 값에 미치는 영향 확인

🎉 수고하셨습니다. 🎉

불균형 데이터를 처리하는 방법과, 사기 거래를 감지하도록 TensorFlow 모델을 학습시키는 방법, Explainable AI SDK를 사용하여 모델이 개별 예측을 수행하는 데 가장 많이 사용하는 특성을 확인하는 방법을 알아봤습니다. 원한다면 여기서 멈추실 수 있습니다. 노트북 내에서 SDK를 사용하면 모델을 배포하기 전에 설명에 액세스할 수 있어 모델 개발 프로세스를 간소화할 수 있습니다. 만족할 만한 모델을 빌드했다면 이 모델을 배포하여 대규모로 예측을 수행하려고 할 것입니다. 이 경우에 해당한다면 다음 단계(선택사항)를 진행합니다. 완료되면 삭제 단계로 건너뜁니다.

7. 선택사항: AI Platform Prediction에 모델 배포

이 단계에서는 AI Platform Prediction에 모델을 배포하는 방법을 알아봅니다.

1단계: 저장된 모델 디렉터리를 Cloud Storage 버킷에 복사

앞서 실행한 SDK 단계를 통해 모델을 AI Platform에 배포하는 데 필요한 모든 것을 갖추었습니다. 배포를 준비하려면 Explainable AI 서비스에서 읽을 수 있는 Cloud Storage 버킷에 저장된 모델 애셋과 설명 메타데이터를 저장해야 합니다.

이를 위해 몇 가지 환경 변수를 정의하겠습니다. 아래에 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를 사용하여 다음 다섯 가지 예시를 모델에 전송할 수 있습니다.

!gcloud beta ai-platform explain \
--model=$MODEL \
--version=$VERSION \
--region='us-central1' \
--json-request=prediction.json

응답 JSON에서 이 예시의 각 특성에 대한 기여 분석 값을 볼 수 있습니다. 각 예의 example_score 키에는 모델의 예측(이 경우 특정 거래가 사기일 가능성 백분율)이 포함됩니다.

8. 삭제

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

879147427150b6c7.png

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

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