Machine Learning (기계학습) - part 12 [AutoML (Automated Machine Learning)]
2021년도에 대학교 과목으로 들었던 '기계학습' 강의를 복습 및 정리 + 추가적인 공부를 위해 이 글을 작성한다. (세종대학교 최유경 교수님 '2021 기계학습'수업)
이번 파트는 대망의 마지막 파트로 지금까지 배운 모든 기계학습 개념을 하나의 툴로써 전부 적용하여 최고의 모델을 자동으로 산출해주는 AutoML을 살펴 보려한다.
AutoML
AutoML이란, Automated Machine Learning로, 기계 학습 파이프 라인(전처리, 학습, 검증 등)에서 이루어지는 작업들을 자동으로 처리해주고 이 과정의 모든 경우의 수들 중 가장 적합하고 성능이 좋은 모델을 산출해주는 기능이다. 한마디로 혁신 그자체인 것이다. 앞선 파트들에서 해왔듯이 데이터 전처리, 모델 학습 및 검증 등 다양한 과정을 거치며 그 와중에서도 어떤 방법이 최적의 방법인지 우리는 일일히 실험적으로 평가해오는, 어떻게 보면 많은 노력과 시간을 들여 하나의 파이프라인을 구축해왔다. 이런 비효율성 때문에 AutoML은 머신러닝을 적용할 때 마다 반복되는 이 일련의 비효율적인 작업을 최대한 자동화하여 생산성과 효율을 높이기 위하여 등장했다. 즉, AutoML은 예측 모델 개발에 많은 시간을 소요했던 코딩, 알고리즘 선택, 튜닝 작업 등을 한번에 자동화하는 혁신을 일으킨 것이다. 간단한 코드, 버튼 클릭을 통하여 그 동안 복잡했던 여러 수작업, 반복하여 실험적으로 접근했던 작업들을 자동으로 처리해주어 보다 나은 머신러닝 환경을 구축해 주며 더 나아가 비전문가들 또한 부담없이 접근하고 활용할 수 있기에 더 각광받고 있다.
이런 AutoML은 가장 초반에는 우리가 알고 있는 GridSearchCV와 같이 학습에 필요한 학습률, 규제, 등 하이퍼파라미터를 최적화하여 더 나은 모델을 학습시키는 하이퍼파라미터 최적화용 기술이었다. 하지만, 이후 더 나아가 학습을 통해 유의미한 변수(Feature)를 추출하는 Feature Learning 기술도 포함하고, 모델링 전체 프로세스를 사람이 직접 설계하던 것에서 학습을 통해 최적의 아키텍처(Architecture, 구조)를 설계하는 Architecture Search로 까지 발전해 왔다. 또한 이제 AutoML은 이러한 파이프라인을 자동으로 유지 및 관리할 수 있도록 범위가 확대되어 모델의 자율성 또한 증가하고 있는 상황이다. 즉, 한마디로 이야기하면 '데이터만 던져주면 하나부터 열까지 AutoML이 다한다!'는 것이다.
실습
그럼 이런 AutoML은 어디서 어떻게 사용해야 될까?
먼저, AutoML은 다양한 패키지 툴킷에서 제공한다. 대표적으로 Auto-WEKA (2013), auto-sklearn (2015), TPOT (2016)가 있다. 또한, ML의 자동화 뿐만 아닌 딥러닝 분야에서의 자동화를 제공하는 툴킷들도 있다. AutoKeras (2019), Neural Network Intelligence (2019), AutoGluon (2020)
우린 이들 중 sklearn에서 제공하는 auto-sklearn을 통해 실습을 진행할 예정이다. (데이터는 보스턴 집값 데이터)
(Colab 환경에서는 auto-sklearn 설치가 안되어 Kaggle Notebook사용)
import pandas as pd
data = pd.read_csv('Boston.csv')
data.head()
#학습데이터 및 라벨 생성
x_train = data.drop(['index','Price'],axis=1)
y_train = data['Price']
이제 AutoML을 사용하기 위해 auto-sklearn toolkit을 설치해준다.
#autosklearn 설치
! apt-get install build-essential swig
! pip3 install auto-sklearn
그 다음 본격적으로 AutoML을 사용해 주기 전, 내가 사용할 수 있는 모델들을 확인하고 사용할 모델들을 포함시켜 준다.
#estimators 확인
from autosklearn.pipeline.components import regression
regression._regressors.keys() # autoML에서 사용할 수 있는 모든 Regression 학습 모델 들
# 그 모델들 중 내가 포함시킬 모델들을 선택
model = ['adaboost','decision_tree', 'k_nearest_neighbors','libsvm_svr','random_forest']
autosklearn에서는 앞서 말한 것과 같이 다양한 학습모델들을 제공한다. 이 사용 가능한 모델들에는 우리가 지금까지 배운 모든 ML모델, 앙상블 모델(GBM의 개선버전들은 포함되지 않음)에 더하여 더 다양한 ML모델, 심지어는 딥러닝에 사용되는 MLP도 있다. 이는 위의 코드를 통해서 확인할 수도 있고, auto-sklearn 깃헙에서도 확인이 가능하다. 이렇게 사용 가능한 모델들을 확인한 후 내가 사용할 모델들을 선택하여 준다.
이제 본격적으로 AutoML 학습을 시작한다. AutoML은 사용자가 일부 설정만 조정해주면 알아서 해당 환경에 맞게 최적의 데이터 전처리, 내가 선택한 모델들 중에서의 최적의 학습 모델, 그에 따른 최적의 하이퍼파라미터를 설정하여 최고의 파이프라인을 산출해준다.
# autoML 학습
from autosklearn.regression import AutoSklearnRegressor # 회귀를 위한 autoML
automl = AutoSklearnRegressor( # 학습 설정
time_left_for_this_task=300, # 전체 학습 시간 설정
per_run_time_limit=60, # 각 최대 탐색 시간 설정
include_estimators=model, # 방금 설정한 모델들만을 가지고 탐색
n_jobs = -1
)
automl.fit(x_train_std, y_train) # 학습 시작
AutoML은 모든 경우의 수를 탐색하기에 오래걸리는 단점이 있다. 이렇기에 우리는 각자의 리소스에 맞게 학습에 제한 시간을 둘 필요가 있을 것이다. 이게 바로 time_left_for_this_task, per_run_time_limit 이다. AutoML의 전체적인 학습시간이 300초를 넘지 못하게 하고 각 모델 당 최적의 조합을 탐색하는데에는 60초를 넘기지 못하게 설정한 것이다.
이와 같이 간단한 설정만 해준다면 AutoML은 그 환경에 맞는 최적의 모델을 찾아낸다. 이제 결과를 확인해 보자.
#best모델 확인
data = pd.DataFrame(automl.cv_results_)
data['params'][data['rank_test_scores'].sort_values().index[0]]
결과의 key값들을 보면 어떤 데이터 전처리가 사용되었는지, 어떤 특징 전처리(차원축소, .. )가 사용되었는지, 그 특징 전처리 기법의 어떤 하이퍼 파라미터가 사용되었는지, 어떤 모델을 선택하였는지, 그 모델의 하이퍼파라미터는 어떻게 조정했는지 등을 모두 확인할 수 있고, 이 모든 값들을 AutoML이 학습하여 최적의 경우들을 산출해냈다는 것을 알 수 있다. 대표적으로 몇 개를 보자면, 데이터 전처리의 결측치는 중앙값으로 채워졌고, 스캐일러는 minmax scaler가 사용되었고, 차원축소 역할을 하는 주성분 분석에서는 polynomial 이라는 비선형 PCA를 사용했고, 그에 따른 하이퍼파라미터들을 조절한 것을 확인할 수 있다. 마지막으로 예측 모델은 비선형 SVR을 사용하고 그에 따른 하이퍼파라미터들을 조정한 것을 알 수 있다. 이 모든 것을 내가 직접 GridSearchCV나 다양한 코드를 통해 설정한 것이 아닌, AutoML에서 자동으로 최적의 경우를 산출해준 것이다.
이제 이 예측 결과를 확인해보자.
data[data['rank_test_scores']==1]['mean_test_score':'status']
해당 최적의 모델의 예측 결과 및 학습 시간 등을 알 수 있고, 검증이 잘 되었다는 것을 확인할 수 있다.
만약 사용자의 리소스가 충분하여 해당 실습과는 다르게 auto-sklearn에서 제공하는 모든 모델을 사용하고 가동시간을 늘려 사용한다면 훨씬 더 최적의 모델을 얻을 수 있을 것이다.