AutoML 도구를 조합해 모델 개발 파이프라인 자동화하기
Featuretools, TPOT, H2O AutoML, NAS를 조합해 특징 생성부터 모델 탐색, 배포와 모니터링까지 자동화하는 운영 방법을 정리합니다.
2026-08-14 · 최초 발행 2025-10-14
모델 탐색 이전에 자동화할 범위를 정한다
AutoML은 데이터 전처리부터 특징 엔지니어링, 모델 탐색, 하이퍼파라미터 최적화, 앙상블, 배포까지 머신러닝 파이프라인을 자동화하는 기법 집합이다. 데이터 규모와 모델 복잡도가 커질수록 반복 실험을 사람이 모두 관리하기 어렵기 때문에, 재현성과 생산성을 함께 확보하는 방식으로 사용된다.
도구마다 자동화하는 대상은 다르다. Featuretools는 Deep Feature Synthesis를 기반으로 관계형·시계열 데이터에서 집계와 변환 특징을 만든다. TPOT은 scikit-learn 생태계를 중심으로 전처리, 모델, 하이퍼파라미터가 이어진 파이프라인을 유전 프로그래밍으로 탐색한다. H2O AutoML은 GBM, XGBoost, GLM, DeepLearning 등의 알고리즘과 스태킹 앙상블을 탐색하며, 분산 학습과 MOJO 배포를 지원한다.
Neural Architecture Search(NAS)는 층 수, 연결, 연산 종류처럼 신경망 토폴로지 자체를 탐색한다. 이미지와 텍스트 등 딥러닝 태스크에서 특히 활용할 수 있다.
데이터 검증과 특징 생성이 탐색의 출발점이다
자동화된 탐색이 유효하려면 먼저 스키마 검증, 결측치·이상치 처리, 누수 방지 규칙을 구성해야 한다. 검증 분할도 문제 유형에 따라 달라진다. 시계열이나 그룹 단위 데이터에는 그에 맞는 분할 전략이 필요하다.
Featuretools의 Deep Feature Synthesis는 연속형, 범주형, 시간 기반의 집계·변환 특징을 생성한다. 이 단계에서 특징 생성 깊이, primitive 화이트리스트, 엔티티 관계를 제한하면 과적합을 억제할 수 있다. 목표 누수가 의심되는 피처는 차단하고, 생성되는 피처의 깊이와 개수도 관리 대상에 포함한다.
TPOT은 전처리·모델·하이퍼파라미터 조합을 유전 탐색으로 최적화한다. H2O AutoML은 여러 알고리즘과 메타러너 스태킹을 구성하고, 리더보드와 교차 검증 결과를 바탕으로 후보를 선택한다. NAS에서는 KerasTuner, AutoKeras, NNI 등으로 연산, 채널, 스킵 연결의 탐색 범위를 설계하며, 검색 공간·예산·조기 중단 전략이 비용 대비 성능을 좌우한다.
운영 단계에서는 메트릭과 아티팩트의 버전 관리, Seed와 환경 스냅샷을 통한 재현성, 드리프트 모니터링이 필요하다. MOJO, ONNX, PMML 및 REST·배치 경로를 표준화하고 승인과 감사 추적 체계를 연결해야 한다.
탐색 결과를 배포와 재학습으로 이어가는 흐름
스키마가 맞지 않으면 변환 규칙을 롤백하고 데이터 소스를 격리한다. 특징 생성이 실패했을 때는 primitive를 대체하거나 깊이를 완화하고, 유의성 필터를 다시 적용한다. 탐색 예산을 초과하면 조기 중단을 적용하고 상위 k개 후보만 평가하며 비용 제한을 지킨다.
데이터와 모델 유형에 따른 적용 방식
탭울러 분류·회귀에서는 Featuretools로 기본 집계와 변환 특징을 만든 뒤 TPOT 또는 H2O AutoML로 모델을 탐색할 수 있다. 2~8시간 예산 안에서 AUC/LogLoss 베이스라인을 확보하고, 수작업 특징 엔지니어링의 출발점으로 삼는 방식이다.
시계열 수요·매출 예측에는 TimeSeriesSplit처럼 시계열에 안전한 분할과 시점 기준 래깅·롤링 집계가 필요하다. H2O AutoML의 스태킹 앙상블은 계절성과 프로모션 효과를 통합하는 데 사용할 수 있다.
컴퓨터 비전과 텍스트 분류에서는 NAS로 CNN, RNN, Transformer의 탐색 공간을 설계하고 Hyperband로 예산을 관리한다. 전이학습과 파인튜닝을 기본선으로 두고, NAS는 상위 5~10% 개선 목표에 맞춰 사용한다.
MLOps 환경에서는 모델·피처·데이터 버전을 연동하고 배치·실시간 경로를 표준화한다. 드리프트 감지, 재학습 트리거, 제한 예산 재탐색으로 이어지는 폐루프를 자동화할 수 있다.
자동화의 효과와 운영상 제약
베이스라인 구축 시간은 5080% 단축되고, 반복 실험 자동화로 사이클 타임을 줄일 수 있다. 강건한 스태킹과 탐색을 통해 AUC/Accuracy가 310pp 개선될 수 있으나, 이는 데이터와 문제에 따라 다르다. 탐색 예산, 조기 중단, 프루닝을 적용하면 GPU/CPU 비용을 20~40% 절감할 수 있다.
대신 탐색 공간을 줄이면 최적 성능의 잠재력도 함께 제한된다. 스태킹과 복합 파이프라인은 설명성을 낮출 수 있어 SHAP나 Permutation 중요도를 병행해야 한다. 규제 산업에서는 단순 모델과 제한된 탐색을 우선하고 설명 보고서를 자동화하는 편이 적합하다.
모델·피처·데이터의 계보를 추적하고 아티팩트 서명과 무결성 검증을 적용해야 한다. 개인정보 비식별화, 접근 제어, 감사 로그도 운영 체계에 포함한다. 라이브러리 버전과 API 변화가 빠르므로 배포 전 호환성 리허설과 최신 정보 확인이 필요하다.
| 도구 | 성능 | 확장성 | 일관성 | 안정성 | 운영 편의 |
|---|---|---|---|---|---|
| Featuretools | 모델 성능 간접 향상(유의미 특징 생성) | 고(병렬/대규모 가능) | 고(규칙 기반 DFS) | 고 | 중(피처 관리 필요) |
| TPOT | 중~고(탭울러 강점) | 중(멀티코어 병렬) | 중(유전 탐색 변동) | 중~고 | 중(파이프라인 코드 생성) |
| H2O AutoML | 고(스태킹 앙상블) | 고(분산/클러스터) | 고(리더보드·CV) | 고 | 고(MOJO/배포 용이) |
| NAS(KerasTuner/AutoKeras 등) | 고(딥러닝 태스크) | 중~고(GPU/TPU 필요) | 중(초기화·시드 민감) | 중 | 중(서빙 최적화 필요) |
Featuretools로 관계형 데이터의 특징을 만든다
설치: pip install featuretools pandas pyarrow
import pandas as pd
import featuretools as ft
from datetime import datetime, timedelta
# 샘플 데이터 구성
customers = pd.DataFrame({
"customer_id": [1, 2, 3]
})
orders = pd.DataFrame({
"order_id": [100, 101, 102, 103, 104],
"customer_id": [1, 1, 2, 3, 3],
"amount": [120.5, 42.0, 200.0, 15.0, 85.0],
"order_time": [datetime.now() - timedelta(days=d) for d in [1,3,2,7,8]]
})
# 엔터티셋 구성
es = ft.EntitySet(name="retail")
es = es.add_dataframe(dataframe_name="customers", dataframe=customers, index="customer_id")
es = es.add_dataframe(dataframe_name="orders", dataframe=orders, index="order_id", time_index="order_time")
# 관계 설정
es = es.add_relationship("customers", "customer_id", "orders", "customer_id")
# DFS 실행: 집계/변환 primitive 제한으로 과적합 억제
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name="customers",
agg_primitives=["mean", "sum", "count", "max", "min"],
trans_primitives=["day", "weekday"],
max_depth=2
)
print(feature_matrix.head())
TPOT으로 전처리와 모델 파이프라인을 탐색한다
설치: pip install tpot scikit-learn numpy pandas
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from tpot import TPOTClassifier
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42, test_size=0.2)
tpot = TPOTClassifier(
generations=5,
population_size=30,
scoring="roc_auc",
cv=5,
verbosity=2,
random_state=42,
n_jobs=-1
)
tpot.fit(X_train, y_train)
print("Test AUC:", tpot.score(X_test, y_test))
# 최종 파이프라인 코드 저장
tpot.export("tpot_best_pipeline.py")
H2O AutoML로 스태킹 앙상블을 평가한다
설치: pip install h2o
import h2o
from h2o.automl import H2OAutoML
from sklearn.datasets import load_breast_cancer
import pandas as pd
# H2O 초기화
h2o.init(max_mem_size="4G")
# 데이터 적재 및 변환
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
df = pd.concat([X, y.rename("target")], axis=1)
hdf = h2o.H2OFrame(df)
hdf["target"] = hdf["target"].asfactor()
train, test = hdf.split_frame(ratios=[0.8], seed=42)
x = [c for c in hdf.columns if c != "target"]
y = "target"
# AutoML 실행(시간 예산 설정)
aml = H2OAutoML(max_runtime_secs=600, seed=42, stopping_metric="AUC", sort_metric="AUC", nfolds=5)
aml.train(x=x, y=y, training_frame=train)
lb = aml.leaderboard
print(lb.head(rows=5))
leader = aml.leader
perf = leader.model_performance(test)
print("Test AUC:", perf.auc())
# MOJO/POJO로 내보내기 가능
# h2o.save_model(model=leader, path="./h2o_models", force=True)
NAS로 MLP 구조의 탐색 범위를 설정한다
설치: pip install keras-tuner tensorflow
import tensorflow as tf
from tensorflow import keras
import keras_tuner as kt
# 데이터 준비(MNIST)
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = (x_train.reshape(-1, 28*28) / 255.0).astype("float32")
x_test = (x_test.reshape(-1, 28*28) / 255.0).astype("float32")
def build_model(hp: kt.HyperParameters):
model = keras.Sequential()
model.add(keras.layers.Input(shape=(784,)))
for i in range(hp.Int("num_layers", 1, 3)):
units = hp.Int(f"units_{i}", min_value=64, max_value=512, step=64)
model.add(keras.layers.Dense(units, activation="relu"))
model.add(keras.layers.Dropout(hp.Choice(f"dropout_{i}", [0.0, 0.2, 0.4])))
model.add(keras.layers.Dense(10, activation="softmax"))
lr = hp.Choice("lr", [1e-2, 5e-3, 1e-3])
model.compile(optimizer=keras.optimizers.Adam(lr),
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
return model
tuner = kt.Hyperband(
build_model,
objective="val_accuracy",
max_epochs=10,
factor=3,
directory="kt_mnist",
project_name="mlp_nas",
seed=42
)
stop_early = keras.callbacks.EarlyStopping(monitor="val_accuracy", patience=3, restore_best_weights=True)
tuner.search(x_train, y_train, validation_split=0.1, epochs=20, callbacks=[stop_early], verbose=1)
best_model = tuner.get_best_models(1)[0]
test_loss, test_acc = best_model.evaluate(x_test, y_test, verbose=0)
print("Test Accuracy:", test_acc)
자동화 뒤에도 남는 판단
Featuretools로 특징 기반을 구성하고 TPOT 또는 H2O AutoML로 탭울러 모델을 탐색하며, NAS를 딥러닝 구조 탐색에 연결할 수 있다. 자동화는 초기 베이스라인 구축 이후 도메인 지식으로 정교화하는 과정을 대체하지 않는다.
입력부터 처리, 출력, 모니터링까지의 경로를 표준화하고 예산·재현성·거버넌스를 함께 관리할 때 AutoML은 반복 실험을 운영 가능한 파이프라인으로 바꾼다.