본문 바로가기
AI 빅데이터/Google Cloud Platform

[GCP] What-If Tool Analysis 사용하기

by 마고커 2020. 4. 9.


작년에 구글에서 What If Tool(이하 WIT)을 소개하였다. 말 그대로 데이터가 바뀌면 (What-if) 어떻게 변할까를 그래픽으로 표현해 주는 것인데, 아직까지 경험으로는 Tensorboard의 확장판 정도로 이해된다. GCP의 AI Platform과 강하게 결합되어 있어서, AI Platform으로 모델을 배포한 뒤 What-if Tool의 라이브러리를 호출해 주는 것으로 사용할 수 있다. 아직 결과에 대한 해석은 충분하지 않으므로 해석하는 방법은 추후에 포스팅할 예정이다.

 

대상 모델은 Pima 인디언의 당뇨(diabetes)를 예측하는 모델이다. 우선 Keras로 모델 작성부터 끝내자.

import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
import tensorflow as tf

df = pd.read_csv('pima/pima-indians-diabetes.csv', names=["pregnant", "plasma", "pressure", "thickness", "insulin", "BMI", "pedigree", "age", "class"])

np.random.seed(3)
tf.random.set_seed(3)

from sklearn.utils import shuffle
data = shuffle(df, random_state=4)

# 80%를 Training으로 나머지를 Test로
labels = data['class']
data = data.drop(columns=['class'])
train_size = int(len(data) * 0.8)
train_data = data[:train_size]
train_labels = labels[:train_size]
test_data = data[train_size:]
test_labels = labels[train_size:]

# 추후에 모델에 serving Function을 붙일 때 필요하다
input_size = len(train_data.iloc[0])
print(input_size)

# Keras로 간단히 모델 만들기
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 당뇨 예측이므로 이진 분류
model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit(train_data.values,train_labels.values, epochs=200, batch_size=10)

print("accuracy: %.4f" % (model.evaluate(test_data.values,test_labels.values)))

 

안타깝게도 데이터가 적어서 정확도는 높지 않다 (60% 수준)

 

모델 작성이 끝났으므로 ai-platfrom으로 배포한다.

# Serving Function
class ServingInput(tf.keras.layers.Layer):
  # the important detail in this boilerplate code is "trainable=False"
  def __init__(self, name, dtype, batch_input_shape=None):
    super(ServingInput, self).__init__(trainable=False, name=name, dtype=dtype, batch_input_shape=batch_input_shape)
  def get_config(self):
    return {'batch_input_shape': self._batch_input_shape, 'dtype': self.dtype, 'name': self.name }
    
# 만들어 놓은 모델 앞에 Data를 Serving하는 Layer를 추가한다.
restored_model = model    
serving_model = tf.keras.Sequential()
serving_model.add(ServingInput('serving', tf.float32, (None, input_size)))
serving_model.add(restored_model)

# project와 bucket을 설정
GCP_PROJECT = 'ai-infra-project-1'
KERAS_MODEL_BUCKET = 'gs://gcs-transfer-test-bkt'
KERAS_VERSION_NAME = 'v1'

# Model을 Bucket에 저장
import os
serving_model.save(os.path.join(KERAS_MODEL_BUCKET, 'pima_export'))  # export the model to your GCS bucket
export_path = KERAS_MODEL_BUCKET + '/pima_export'

# Model 배포. AI Platform의 TF Runtime은 현재 1.14까지만 지원
!gcloud config set project $GCP_PROJECT
!gcloud ai-platform models create pima_diabetes
!gcloud beta ai-platform versions create $KERAS_VERSION_NAME --model pima_diabetes \
--origin=$export_path \
--python-version=3.5 \
--runtime-version=1.14 \
--framework='TENSORFLOW'

 

모델 배포가 끝났으면, What If Tool로 호출해 주면 끝이다.

 

import witwidget
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

# test 데이터와 레이블을 하나로 묶는다
test_data = np.hstack((test_data.values,test_labels.values.reshape(-1,1)))
print(test_data.shape)

# What-if Tool의 설정을 잡아준다. test_data와 column이름을 list로 넣어주고
# 모델을 설정해준뒤, target column과 model type을 지정해준다
config_builder = (WitConfigBuilder(test_data.tolist(), data.columns.tolist() + ['class'])
  .set_ai_platform_model(GCP_PROJECT, 'pima_diabetes', KERAS_VERSION_NAME)
  .set_target_feature('class')
  .set_model_type('classification')
  )
 
 # 설정을 widget으로 표현해준다. 높이 800
 WitWidget(config_builder, height=800)

 

잠시 뒤 WIT가 모델을 해석해서 아래와 같이 결과를 내보내어 준다.

 

Datapoint Editor가 Main인듯하고 Features는 기존 Tensorflow Extended의 Data Validation을 차용하고 있다. Performance & Fairness는 성능 개선을 위한 가이드를 제시할 듯 한데 추후에 분석해 보려한다. DataPoint는 각 데이터가 어떻게 분류되었는 지를 나타내는데, DataPoint를 찍으면 아래와 같이 필드 값을 수정할 수 있게 된다.

 

노란 커서가 보이는데 왼쪽 패널의 값을 수정할 수 있다. 나이만 51세로 바꾸어보자.

 

이 친구에게서 당뇨는 사라지는 정도가 아니라 꽤 낮은 수준으로 유지되고 있는 사람으로 바뀌게 된다.

 

이 정도 할 수 있는 도구는 분명 아닐테고, 향후에 사용법을 더 숙지하여 포스팅하겠습니다.



댓글