본문 바로가기
AI 빅데이터/Open Source Software

[OSS] AutoKeras로 자동학습(AutoML) 하기

by 마고커 2020. 3. 4.


최근 회사 업무를 하면서 AutoML을 조사할 일이 있었는데, AutoKeras가 작년말 정식 Release 되었다는 것을 알았다. AutoKeras는 Texas A&M에서 만든 것으로 많은 AutoML솔루션들이 Table 데이터 처리를 위한 최적의 머신러닝 모델을 찾아주는 것에 반해, Google AutoML과 마찬가지로 비정형 데이터까지 모델링 해 준다.

AutoKeras는 무엇보다 설치가 간단하다. 기존에 사용하던 머신에 AutoKeras 패키지만 설치해 주면 잘 동작한다(설치조건: Tensorflow 2.1, Python 3.6). GPU 설정은 공통된 부분이고, 요즘은 AWS SageMaker나 GCP AI Platform에서 설정되어 나오니 크게 신경쓰지 않아도 된다.

pip install autokeras


AutoML을 가능하게 한 3가지 요소는 1) Auto Feature Engineering 2) Neural Search Architecture 3) Hyper Parameter Tuning으로 각각에 대한 설명은 인터넷에 많이 공개되어 있다. (원리를 잘 몰라서 설명을...)

간단한 예제를 통해 얼마나 결과를 잘 뽑아주는 지 비교해 보았다. 간단한 Table Data로는 큰 차이를 볼 수 없기에, IMDB 영화 평가를 Sentiment Analysis하는 예제를 수행해 보았다. 특별히 모델링이라고 할 것도 없고, TextClassifier를 만들고, fit 한 것이 전부다. AutoKeras 홈페이지에는 fit 할 때 epochs을 따로 주지 않아 1,000으로 디폴트 설정되는데 너무 오래 걸려서 15번만 하게 바꾸었다.

import numpy as np
import tensorflow as tf

import autokeras as ak


def imdb_raw():
    max_features = 20000
    index_offset = 3  # word index offset

    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(
        num_words=max_features,
        index_from=index_offset)
    x_train = x_train
    y_train = y_train.reshape(-1, 1)
    x_test = x_test
    y_test = y_test.reshape(-1, 1)

    word_to_id = tf.keras.datasets.imdb.get_word_index()
    word_to_id = {k: (v + index_offset) for k, v in word_to_id.items()}
    word_to_id["<PAD>"] = 0
    word_to_id["<START>"] = 1
    word_to_id["<UNK>"] = 2

    id_to_word = {value: key for key, value in word_to_id.items()}
    x_train = list(map(lambda sentence: ' '.join(
        id_to_word[i] for i in sentence), x_train))
    x_test = list(map(lambda sentence: ' '.join(
        id_to_word[i] for i in sentence), x_test))
    x_train = np.array(x_train, dtype=np.str)
    x_test = np.array(x_test, dtype=np.str)
    return (x_train, y_train), (x_test, y_test)


# Prepare the data.
(x_train, y_train), (x_test, y_test) = imdb_raw()
print(x_train.shape)  # (25000,)
print(y_train.shape)  # (25000, 1)
print(x_train[0][:50])  # <START> this film was just brilliant casting <UNK>

# Initialize the TextClassifier
clf = ak.TextClassifier(max_trials=3, epochs=15)
# Search for the best model.
clf.fit(x_train, y_train)
# Evaluate on the testing data.
print('Accuracy: {accuracy}'.format(clf.evaluate(x_test, y_test)))


결과는 20분쯤 뒤에 나왔고 (AWS g4dn.2xlarge), 69.3% 정도의 정확도를 보였다. (Confusion Matrix로 좀 더 세밀하게 평가해야 하지만, 일단 AutoML을 소개하는 정도여서)

Accuracy: [0.6931472323129854, 0.5]


AutoML이 아닌 Keras로 LSTM 모델을 통해 평가하여 비교해 보았다. (소스는 Keras 홈페이지에서)

from __future__ import print_function

from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Embedding
from keras.layers import LSTM
from keras.datasets import imdb

max_features = 20000
# cut texts after this number of words (among top max_features most common words)
maxlen = 80
batch_size = 32

print('Loading data...')
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
print(len(x_train), 'train sequences')
print(len(x_test), 'test sequences')

print('Pad sequences (samples x time)')
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)

print('Build model...')
model = Sequential()
model.add(Embedding(max_features, 128))
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))

# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

print('Train...')
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=15,
          validation_data=(x_test, y_test))
score, acc = model.evaluate(x_test, y_test,
                            batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)


15분 정도 소요됐고 AutoKeras보다 10% 정도 더 나은 결과를 보여줬다. 꽤 큰 차이이긴 하지만, AutoKeras 학습 시 Epochs을 대폭 줄여서 실행한 원인이 클 것이다. 도메인과 AI 모델링에 전문성을 갖고 있다면 굳이 자원을 과다하게 사용해 가며 AutoML을 사용할 필요는 없지만, 단지 데이터를 불러오는 것으로도 나쁘지 않은 결과를 얻을 수 있어 나 같은 초중급 분석가가 활용하기엔 괜찮아 보인다.

Test accuracy: 0.81112


컨설팅회사 캡제미나이는 AutoML 솔루션을 평가하면서 현재 가지고 있는 공통적 약점을 정리하였다.
https://www.capgemini.com/gb-en/2020/02/automatic-machine-learning/

  • Unsupervised Learning: as unsupervised learning does not rely on labelled datasets, there is no clear measure of success that can be used to assess the quality of results to compare algorithms directly.
  • Complex Data Types: most AutoML systems initially designed to work with structured, tabular or relational data, then further extended to handle unstructured data such as text and images. However, by now, network data and web data are still not included in any AutoML products.
  • Feature Engineering Embedded with Domain Knowledge: some AutoML systems offer automatic feature engineering such as DataRobot, H2O Driverless AI, but none of them could incorporate domain knowledge into the ML process.

현업이 바로 이용하기에 가장 큰 허들은 세번째 Domain Data와 결합되지 않는 Feature Engineering 일 듯 싶다. 그렇다 하더라도, 데이터 분석이나 통계에 경험이 있는 현업 종사자들이 AI 모델링을 배우지 않은 상태에서 일부 전처리만으로 비교적 최적 결과를 얻어낼 수 있다는 건 충분히 매력적일 것이다.



댓글