pythonML

[pythonML] Autogluon 사용법 | Autogluon 매개변수, 속성, 메소드 | Autogluon 코드 적용

독립성이 강한 ISFP 2024. 9. 1. 01:40
728x90
반응형

 

AutoGluon 이란?

AutoGluon은 머신러닝 워크플로우를 자동화하는 강력한 도구로, 사용자가 최소한의 코드만으로도 다양한 모델을 자동으로 학습하고 튜닝할 수 있습니다. AutoGluon은 데이터 전처리, 피처 엔지니어링, 하이퍼파라미터 최적화, 앙상블 학습 등의 복잡한 작업을 자동으로 수행하며, 다양한 데이터 유형을 지원합니다. 특히, 모델 성능을 최적화하기 위해 다양한 모델을 시도하고, 최적의 모델을 선택하거나 여러 모델을 결합하여 최상의 예측 성능을 제공합니다. GPU를 활용한 고속 학습도 지원하여, 대규모 데이터셋에서도 효율적으로 작동합니다.


TabularPredictor 클래스의 매개변수

 

label(str)

 

예측할 타겟 변수를 포함하는 열의 이름.

 

problem_type (str, 기본값 = None)

 

예측 문제의 유형. 즉, 이 문제는 이진/다중 클래스 분류 문제인지, 회귀 문제인지 ('binary', 'multiclass', 'regression' 옵션). problem_type이 None인 경우, 제공된 데이터셋의 타겟 변수 값을 기반으로 문제 유형이 자동으로 추론됩니다.

 

eval_metric (str 또는 Scorer, 기본값 = None)

 

테스트 데이터에서 예측을 궁극적으로 평가할 지표. 

기본값(None)은 이진 및 다중 클래스 분류의 경우 'accuracy', 회귀의 경우 'root_mean_squared_error'

 

- 분류 문제에 대한 옵션

['accuracy', 'balanced_accuracy', 'f1', 'f1_macro', 'f1_micro', 'f1_weighted', 'roc_auc', 'roc_auc_ovo_macro', 'average_precision', 'precision', 'precision_macro', 'precision_micro', 'precision_weighted', 'recall', 'recall_macro', 'recall_micro', 'recall_weighted', 'log_loss', 'pac_score']

 

- 회귀 문제에 대한 옵션

['root_mean_squared_error', 'mean_squared_error', 'mean_absolute_error', 'median_absolute_error', 'mean_absolute_percentage_error', 'r2', 'symmetric_mean_absolute_percentage_error']

 

verbosity (int, 기본값 = 2): 출력될 정보의 양을 제어하는 레벨(0~4). 숫자가 클수록 더 많은 정보가 출력됩니다.

 

- 0: 예외만 기록

- 1: 경고와 예외만 기록

- 2: 표준 로그

- 3: 상세한 로그(예: 매 50번의 반복마다 검증 점수 기록)

- 4: 최대한 상세한 로그(예: 매 반복마다 검증 점수 기록)

 

sample_weight (str, 기본값 = None): 각 행(row)의 가중치를 지정.

 

- 각 행(row)에 다른 중요도를 부여하여 모델이 더 중요하거나 덜 중요한 데이터 포인트를 다르게 처리할 수 있게 합니다.

- sample_weight는 분류(Classification)와 회귀(Regression) 모두에서 사용할 수 있습니다.

- sample_weight는 하나의 열로 존재하며, 각 행의 가중치를 나타냅니다.

- 이 피처는 사용자가 직접 생성해야 하며, 데이터의 특성이나 분석 목표에 따라 가중치를 설정합니다.

- 이 가중치 열을 TabularPredictor에 전달하면, 모델 학습 과정에서 각 행에 해당 가중치가 반영됩니다.

- 이 가중치 열은 예측 피처로 간주되지 않습니다. 샘플 가중치는 음수가 아닌 값이어야 하며(NaN일 수 없음), 값이 클수록 해당 행이 더 중요함을 나타냅니다


"수동"으로 sample_weight 피처 만드는 방법

 

1. 클래스 불균형 처리: 만약 클래스 불균형 문제를 다루고 있다면, 소수 클래스에 더 높은 가중치를 부여하여 sample_weight를 생성할 수 있습니다. df['sample_weight'] = df['class'].apply(lambda x: 10 if x == 'minority_class' else 1)

 

2. 특정 피처 기반: 특정 피처 값에 따라 행의 중요도를 조절하고 싶을 때, 해당 피처를 이용해 가중치를 계산할 수 있습니다. 예를 들어, 피처 'A'의 값이 클수록 가중치를 높게 설정 df['sample_weight'] = df['A'] / df['A'].mean()

 

3. 도메인 지식 활용: 도메인 지식에 따라 특정 샘플이 더 중요하다고 판단되는 경우, 수동으로 가중치를 부여할 수 있습니다. 도메인 지식에 따라 특정 조건에 가중치 부여 df['sample_weight'] = 1 df.loc[df['A'] > 10, 'sample_weight'] = 5 # A가 10보다 큰 경우 가중치 5 부여

 

4. 랜덤 하게 가중치 부여: 테스트 목적으로 무작위로 가중치를 설정할 수도 있습니다. df['sample_weight'] = np.random.rand(len(df))

 

"자동"으로 sample_weight 피처 만드는 방법 (회귀에서는 주로 자동으로 설정하지는 않음)

 

1. auto_weight: 가중치 설정이 데이터 특성에 따라 다르며, 많은 클래스에 큰 가중치가 부여될 수 있는 유연한 접근입니다.

2. balance_weight (분류에서 클래스 간 균등 가중치, 회귀에는 영향 없음): 많은 클래스에 작은 가중치를 부여하고, 소수 클래스에 큰 가중치를 부여하여 학습을 균등하게 하는 접근입니다.

 

weight_evaluation (bool, 기본값 = False)

 

- sample_weight 열이 None이 아닌 경우에만 고려됩니다.

- 평가 메트릭을 계산할 때 샘플 가중치를 고려할지 여부를 결정합니다.

- True로 설정하면 지정된 sample_weight를 기반으로 가중치가 적용된 메트릭이 보고됩니다. (이 경우 샘플 가중치 열이 테스트 데이터에도 있어야 합니다).

- 참고: sample_weight가 'auto_weight' 또는 'balance_weight'일 때는 weight_evaluation을 지정하지 않은 것이 좋습니다. 대신 적절한 eval_metric을 지정하세요.


path
(Union[str, pathlib.Path], 기본값 = None)

 

모델과 중간 출력물이 저장될 디렉토리 경로. 지정하지 않으면, 현재 작업 디렉토리에 "AutogluonModels/ag-[TIMESTAMP]"라는 타임스탬프가 있는 폴더가 생성되어 모든 모델이 저장됩니다.

 

positive_class (str 또는 int, 기본값 = None)

 

- 이진 분류 문제에서 양성 클래스를 지정하는 데 사용됩니다.

- f1과 같은 특정 메트릭은 어떤 클래스가 양성 클래스로 간주되는지에 따라 점수가 달라집니다.

- 예를 들어, 클래스가 [0, 1]이면 1이 양성 클래스로 선택됩니다. 만약 설정하지 않으면 기본적으로 두 번째 고유 클래스가 양성 클래스로 간주됩니다.


TabularPredictor 클래스의 속성 

각 속성은 TabularPredictor 객체가 학습된 후에 얻을 수 있는 정보를 나타내며, 모델의 학습 및 예측 과정에서 중요한 역할을 합니다.

 

path

Predictor가 사용하는 모든 모델이 저장된 디렉토리 경로입니다.

print(predictor.path)

> AutogluonModels/ag-20240831_145546

 

feature_metadata or feature_metadata.type_map_raw

각 피처의 데이터 타입(예: 정수형, 실수형, 범주형, 텍스트형 등)을 확인할 수 있게 해 줍니다. 이 정보를 통해 모델이 각 피처를 어떻게 인식하고 처리했는지 이해할 수 있습니다. 예를 들어, 어떤 피처가 숫자형으로 처리되었는지, 범주형으로 처리되었는지 등을 확인할 수 있습니다.

print(predictor.feature_metadata)

> ('int', []) : 1 | ['feature1']

print(predictor.feature_metadata.type_map_raw)

> {'feature1': 'int'}

 

 

class_labels

다중 클래스 문제의 경우, predict_proba() 메서드를 사용하여 각 클래스에 대한 확률을 반환할 때, class_labels 속성의 순서대로 확률 값이 매핑됩니다. 즉, class_labels 속성을 사용하면 예측된 확률이 어떤 클래스에 해당하는지 쉽게 파악할 수 있습니다.

print(predictor.class_labels)

> ['A', 'B', 'C']

 

class_labels_internal

다중 클래스 문제에서 내부 predict_proba() 출력의 순서대로 정렬된 내부 클래스 레이블의 리스트입니다. 이진 분류 문제의 경우, [0, 1]로 항상 설정되며 0은 음성 클래스, 1은 양성 클래스를 나타냅니다.

print(predictor.class_labels_internal)

> [0, 1, 2]

 

class_labels_internal_map

이진 및 다중 클래스 분류 문제에서 원래 레이블을 내부 레이블로 매핑하는 사전을 포함합니다. 예를 들어, 이진 분류에서 True와 False가 각각 1과 0으로 매핑됩니다.

print(predictor.class_labels_internal_map)

> {'A': 0, 'B': 1, 'C': 2}

TabularPredictor 클래스의 메서드 

feature_importance

모델이 학습된 후 각 피처의 중요도를 계산하는 메서드입니다. 피처가 타겟 변수에 미치는 영향을 평가하여, 모델이 예측에 얼마나 의존하는지를 수치화한 값을 반환합니다.

feature_importances = predictor.feature_importance(train)
print(feature_importances)

 

 

calibrate_decision_threshold

이진 분류 문제에서 결정 임계값을 조정하여 모델의 성능을 최적화하는 데 사용됩니다. 기본적으로 이진 분류에서는 예측 확률이 0.5를 넘으면 양성 클래스(1)로, 0.5 이하면 음성 클래스(0)로 분류됩니다. 하지만,`predictor.calibrate_decision_threshold(test_data)`는 테스트 데이터셋(`test`)을 사용하여 모델의 결정 임계값을 자동으로 계산하여 최적화합니다. 예를 들어, F1 스코어를 극대화하는 임계값으로 조정할 수 있습니다.

결정 임계값 조정이 필요한 이유: 정밀도와 재현율 간의 균형 - 예를 들어, 양성 클래스(1)를 더 많이 예측하도록 하고 싶다면, 임계값을 0.5보다 낮게 설정할 수 있습니다. 반대로, 음성 클래스(0)를 더 많이 예측하려면 임계값을 높일 수 있습니다.

if predictor.problem_type == 'binary':
    predictor.calibrate_decision_threshold(test)

 

 

presets

1. medium_quality(기본값):
   - 모델 품질: 다른 AutoML 프레임워크와 경쟁할 수 있는 수준의 성능.

2. good_quality:
   - 모델 품질: 다른 AutoML 프레임워크보다 더 강력함.
   - 사용 사례: 고성능, 휴대성, 매우 빠른 추론이 필요한 경우(예: 대규모 배치 추론, 실시간 추론).

3. high_quality:
   - 모델 품질: `good_quality`보다 더 나음.
   - 사용 사례: 매우 강력하고, 빠른 추론이 필요한 경우(예: 대규모 배치 추론).

4. best_quality:
   - 모델 품질: 최첨단(State-of-the-Art) 성능, `high_quality`보다 훨씬 더 나음.
   - 사용 사례: 정확도가 가장 중요한 경우.

추천 사용 방법
- 초기 설정: 처음에는 `medium_quality`로 시작하여 문제를 파악하고, 데이터 관련 문제를 확인하는 것이 좋습니다.
- 최종 설정: `medium_quality`로 성능이 만족스럽지 않다면, `best_quality`를 사용해 최상의 성능을 도출하도록 시도합니다.
- 중간 옵션: `high_quality`나 `good_quality` 프리셋을 시도하여, 성능과 자원 사용량 간의 균형을 맞출 수 있습니다.

 

GPU


코드

import pandas as pd
from sklearn.model_selection import train_test_split
from autogluon.tabular import TabularPredictor

# 필요한 피처 선택 및 타겟 변수 변환
features = train.drop(['SAMPLE_ID', 'CI_HOUR'], axis=1).columns
X_train = train[features]
y_train = train['CI_HOUR']

# 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)

# Train 및 Validation 데이터를 하나의 DataFrame으로 결합
train_Autogluon = pd.concat([X_train, y_train], axis=1)
valid_Autogluon = pd.concat([X_valid, y_valid], axis=1)

### 2.1. AutoGluon을 사용한 모델 학습
time_limit = 20
predictor = TabularPredictor(
    label='CI_HOUR',
    problem_type='regression',
    eval_metric='mean_absolute_error'
).fit(train_Autogluon, time_limit=time_limit)

### 2.2. 모델 성능 평가
performance = predictor.evaluate(valid_Autogluon)

# 마이너스 부호 제거 (아마 회귀여서 마이너스 부호가 붙여서 출력된 듯 하다.)
performance_abs = {k: abs(v) for k, v in performance.items()}
print(performance_abs)

### 2.3. 리더보드 생성 및 출력
predictor.leaderboard(valid_Autogluon)

### 2.4. 예측 & 제출
test = pd.read_csv('test.csv')
X_test = test[features]

pred = predictor.predict(X_test)

submission = pd.read_csv('sample_submission.csv')
submission['CI_HOUR'] = pred

submission.to_csv('1_sub_Autogluon.csv', index = False)

공식 문서

https://auto.gluon.ai/stable/api/autogluon.tabular.TabularPredictor.html

 

autogluon.tabular.TabularPredictor

Previous AutoGluon Time Series FAQ

auto.gluon.ai

 

728x90
반응형