H2O란?
H2O의 AutoML은 머신러닝 워크플로우를 자동화하는 데 사용될 수 있으며, 사용자가 지정한 시간 내에서 여러 모델을 자동으로 학습하고 튜닝합니다.
또한, H2O의 모델 설명 기능은 AutoML 객체 전체(즉, 여러 모델들로 구성된 모델 그룹)와 개별 모델(리더 모델 포함)에 적용할 수 있습니다. AutoML 실행 후 생성된 다양한 모델들에 대해 어떻게 작동하고 있는지, 각 모델의 예측이 어떻게 이루어졌는지 등을 설명할 수 있는 도구들을 제공합니다. AutoML 객체 자체가 앙상블 모델은 아니지만, AutoML이 생성한 앙상블 모델은 H2O의 모델 설명 기능을 통해 해석할 수 있습니다.
H2O AutoML 인터페이스
H2O AutoML 인터페이스는 가능한 한 적은 파라미터로 설계되어 있어, 사용자는 자신의 데이터셋을 지정하고, 예측할 열을 식별하며, 필요에 따라 학습 시간제한이나 학습할 모델 수의 제한을 설정하기만 하면 됩니다.
R과 Python API에서 AutoML은 다른 H2O 알고리즘과 동일하게 x, y, training_frame, validation_frame과 같은 데이터 관련 인수를 사용합니다. 대부분의 경우, 데이터 관련 인수만 지정하면 됩니다. 그런 다음, max_runtime_secs와/또는 max_models 값을 설정하여 학습 시간이나 모델 수에 대한 명확한 제한을 설정할 수 있습니다.
필수 파라미터
필수 데이터 파라미터
- y: 예측할 열의 이름 또는 인덱스를 지정하는 인수입니다.
- training_frame: 학습 데이터셋을 지정하는 인수입니다.
필수 중지 조건 파라미터
시간 기반 또는 모델 수 기반 중 하나의 인자를 반드시 지정해야 합니다. 두 옵션이 모두 설정된 경우, AutoML은 두 조건 중 하나에 도달하면 즉시 실행을 중지합니다.
- max_runtime_secs
AutoML 프로세스가 실행될 최대 시간을 지정하는 인수입니다. 기본값은 0(제한 없음)이며, 사용자가 max_runtime_secs나 max_models를 지정하지 않은 경우 동적으로 1시간으로 설정됩니다.
- max_models
AutoML 실행에서 학습할 최대 모델 수를 지정하는 인수입니다(스태킹 앙상블 모델 제외). 기본값은 NULL/None입니다. AutoML 실행의 재현성을 보장하려면 항상 이 파라미터를 설정해야 합니다.
# AutoML 설정 및 학습
aml = H2OAutoML(
max_models=20, # 최대 20개의 모델을 학습
max_runtime_secs=300 # 최대 300초(5분) 동안 모델 학습을 수행
seed=1, # 재현성을 위한 시드 설정
)
선택적 파라미터
1. 교차 검증 및 클래스 균형 관련
- nfolds (Default = 5)
데이터셋을 몇 개의 폴드로 나눌지 지정. 예를 들어, nfolds=5로 설정하면 5-폴드 교차 검증이 수행됨. 데이터셋을 5 등분하여, 각 폴드가 한 번씩 테스트 데이터로 사용, 나머지 폴드는 학습 데이터로 사용되는 과정을 5번 반복하는 것을 의미함.
- nfolds >= 2: 지정된 폴드 수로 교차 검증이 수행됩니다.
- nfolds = -1: AutoML이 폴드 수를 자동으로 선택하거나 블렌딩 모드를 사용할지 결정합니다.
- nfolds = 0: 교차 검증이 비활성화됩니다. 이 경우, 스태킹 앙상블 모델도 생성되지 않습니다.
- balance_classes=True로 설정하면, H2O는 소수 클래스에 대해 오버샘플링을 시도하여 클래스 분포를 균형 있게 맞추려고 합니다. (Default = False)
- class_sampling_factors (Default = None): 각 클래스의 오버/언더샘플링 비율을 지정합니다. 이 옵션을 사용하려면 balance_classes가 True로 설정되어야 합니다. 만약, sampling_factors = [1.0, 2.0]로 설정을 한다면, 클래스 0은 1.0 그대로, 클래스 1은 2.0 2배로 오버샘플링 되는 것
- max_after_balance_size (Default = 5)
오버샘플링된 후의 데이터셋 크기(개수)에 대한 최대 크기를 지정합니다. 5.0인 경우, 원본 데이터셋 크기의 최대 5배까지 오버샘플링할 수 있음을 의미합니다. 만약 오버샘플링으로 인해 데이터셋 크기가 max_after_balance_size로 설정된 값을 초과하게 되면, 데이터가 다시 샘플링되어 전체 데이터셋 크기가 이 최댓값을 초과하지 않도록 제한됩니다.
[예시]
원본 데이터셋
전체 데이터 크기: 10,000개 샘플 클래스 0: 9,000개 샘플 (다수 클래스) 클래스 1: 1,000개 샘플 (소수 클래스)
balance_classes=True를 사용한 경우
소수 클래스 1의 샘플 수를 늘리기 위해, H2O는 오버샘플링을 시도 → 클래스 1의 샘플을 9,000개로 오버샘플링
결과
오버샘플링된 후 데이터셋 크기: 9,000 (클래스 0) + 9,000 (클래스 1) = 18,000개
max_after_balance_size=5.0 설정
max_after_balance_size=5.0은 원본 데이터셋(10000)의 5배, 즉 50,000개 샘플까지 허용한다는 의미.
→ 이 예시에서는 오버샘플링 후 크기가 18,000개로, 50,000개를 초과하지 않음. 따라서 아무런 제약 없이 18,000개의 샘플이 유지됨
하지만, 만약 max_after_balance_size=1.5 로 설정했다면?
원본 데이터 크기의 1.5배, 즉 15,000개 샘플까지 허용. 하지만 오버샘플링된 데이터는 18,000개.
따라서 H2O는 클래스 1의 데이터(다수 클래스)를 다시 샘플링하여 크기를 15,000개로 줄입니다.
[예시 코드]
# 클래스 샘플링 비율 설정 (클래스 0은 1.0 그대로, 클래스 1은 2.0 2배로 오버샘플링)
sampling_factors = [1.0, 2.0]
# AutoML 설정 및 학습
aml = H2OAutoML(
max_models=20, # 최대 20개의 모델을 학습
seed=1, # 재현성을 위한 시드 설정
nfolds=5, # 5-폴드 교차 검증 수행
balance_classes=True, # 클래스 불균형 조정 활성화
class_sampling_factors=sampling_factors, # 클래스 샘플링 비율 적용
max_after_balance_size=3.0 # 오버샘플링 후 데이터셋 크기를 원본의 3배로 제한
)
2. sort_metric (AutoML 실행이 끝난 후 리더보드를 정렬하는 데 사용할 메트릭)
AUTO: 기본값으로, 문제 유형에 따라 자동으로 선택됩니다.
- 이진 분류: AUC가 기본값으로 사용됩니다.
- 다중 클래스 분류: mean_per_class_error가 기본값으로 사용됩니다.
- 회귀 문제: deviance가 기본값으로 사용됩니다.
회귀 지표 (Regression Metrics)
- deviance (평균 잔차 편차): 모델이 예측한 값과 실제 값 간의 차이를 측정하는 지표. 주로 회귀 모델에서 사용되며, 로그 우도(Log-likelihood)를 기반으로 계산됩니다.
- MSE (Mean Squared Error): 평균 제곱 오차로, 예측 값과 실제 값 간의 평균 제곱 차이를 계산합니다.
- RMSE (Root Mean Squared Error): 평균 제곱근 오차로, MSE의 제곱근을 취한 값입니다.
- MAE (Mean Absolute Error): 평균 절대 오차로, 예측 값과 실제 값 간의 평균 절대 차이를 계산합니다.
- RMSLE (Root Mean Squared Logarithmic Error): 로그 스케일에서 평균 제곱근 오차를 계산하여 예측 값과 실제 값 간의 상대적 차이를 측정합니다.
분류 지표 (Classification Metrics)
- logloss: 예측 확률과 실제 클래스 간의 차이를 측정하는 지표입니다. 낮을수록 좋으며, 특히 확률 기반 모델에서 중요합니다.
- AUC (Area Under the Curve): 이진 분류 문제에서 ROC 곡선 아래의 영역을 측정하여 모델 성능을 평가합니다.
- AUCPR (Area Under the Precision-Recall Curve): Precision-Recall 곡선 아래의 면적을 측정하는 지표로, 클래스 불균형이 심한 경우에 유용합니다.
- mean_per_class_error (클래스별 평균 오류율): 각 클래스에 대한 오분류율을 계산한 후, 그들의 평균을 구하는 지표입니다. 클래스 간 불균형이 있을 때 유용합니다.
3. 교차 검증(Cross-Validation)과 관련된 다양한 설정을 제어하는 파라미터
각 파라미터는 교차 검증 과정에서 생성된 데이터(예측 결과, 모델, 폴드 할당)를 유지할지 여부를 결정하는 역할을 합니다.
이를 통해 사용자가 모델을 반복적으로 실행하거나, 추가적인 분석을 수행할 수 있도록 지원합니다.
- keep_cross_validation_predictions: 교차 검증 예측 결과를 저장하여, 반복적인 AutoML 실행이나 추가적인 스태킹 앙상블 모델 구축에 사용. 기본값: FALSE (예측 결과를 유지하지 않음). 만약 AutoML 실행 후, 추가적인 앙상블 모델을 만들고자 하거나, 예측 결과를 분석하려면 이 옵션을 TRUE로 설정해야 합니다.
- keep_cross_validation_models: 교차 검증된 모델을 유지하여, 모델 비교나 추가 분석에 사용. 다만, 메모리 사용이 증가할 수 있음. 기본값: FALSE (모델을 유지하지 않음). 메모리 사용이 증가할 수 있으므로, 메모리 제약이 없는 상황에서 교차 검증 모델을 저장하고자 할 때 TRUE로 설정합니다.
- keep_cross_validation_fold_assignment: 교차 검증 과정에서 폴드 할당(어떤 데이터가 어떤 폴드에 포함되었는지)을 보존할지 여부를 결정합니다. 교차 검증 과정에서 데이터가 어떻게 분할되었는지를 분석하거나, 동일한 폴드 할당을 사용해 다른 모델을 학습시키고자 할 때 필요합니다. 기본값: FALSE (폴드 할당을 보존하지 않음). 특정 폴드 할당을 고정하여 같은 데이터를 여러 번 교차 검증하거나, 다른 모델을 동일한 폴드로 학습시키려는 경우 TRUE로 설정합니다.
4. 이 외에 파라미터
- seed: 재현성을 위해 사용할 정수 시드 값을 설정합니다.
- exploitation_ratio: 탐색 단계에 대한 예산 비율(0과 1 사이)을 지정합니다. 기본적으로 탐색 단계는 비활성화되어 있으며(exploitation_ratio=0), 활성화하려면 0.1 정도의 비율을 시도해 보는 것이 좋습니다. 현재 탐색 단계는 탐색 과정에서 발견된 최고의 XGBoost 및 GBM 모델을 미세 조정하는 데만 사용됩니다. 실험적 기능입니다.
aml = H2OAutoML(
max_models=20, # 최대 20개의 모델을 학습
max_runtime_secs=300, # 최대 300초(5분) 동안 모델 학습을 수행
exploitation_ratio=0.1, # 전체 예산의 10%를 탐색 단계에서 사용하여 성능이 좋은 모델을 미세 조정
seed=1 # 재현성을 위해 시드 설정
)
코드
### 1.1.H2O 모델 학습 ###
import h2o
from h2o.automl import H2OAutoML
from sklearn.model_selection import train_test_split
import pandas as pd
# 필요한 피처 선택 및 타겟 변수 변환
features = train.drop(['SAMPLE_ID','CI_HOUR'], axis = 1).columns
X_train = train[features]
y_train = train['CI_HOUR']
# H2O 초기화
h2o.init()
# Train-test split
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.2, random_state=42)
# H2O 프레임으로 변환
train_h2o = h2o.H2OFrame(pd.concat([X_train, y_train], axis=1))
train_h2o.columns = list(X_train.columns) + ['CI_HOUR']
valid_h2o = h2o.H2OFrame(pd.concat([X_valid, y_valid], axis=1))
valid_h2o.columns = list(X_valid.columns) + ['CI_HOUR']
# H2O AutoML 생성 및 학습 & 예측
aml = H2OAutoML(
max_runtime_secs=600,
seed=42,
sort_metric='MAE'
)
aml.train(y='CI_HOUR', training_frame=train_h2o)
### 1.2. 리더보드 생성 및 출력 ###
lb = aml.leaderboard # 리더보드 가져오기
lb.head(rows=lb.nrows) # 리더보드의 모든 모델과 성능 지표 출력
### 1.3. 검증 데이터 에측 ###
preds = aml.leader.predict(valid_h2o)
# 값의 타입 변환
preds_df = preds.as_data_frame()
pred_values = preds_df['predict'].values
### 1.4. 최적의 모델 선택
# mae 에서 성능이 가장 좋은 모델
m = aml.get_best_model(criterion="mae")
### 1.5. Default 모델 (MAE 성능이 가장 좋은 모델)로 Test 데이터 예측
test = pd.read_csv('test.csv')
X_test = test[features]
test_h2o = h2o.H2OFrame(X_test)
predictions = aml.leader.predict(test_h2o)
pred = predictions.as_data_frame()
print(pred.head())
공식 문서
https://docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html