머신러닝에서 앙상블 기법 마스터하기: 투표 분류기와 수동 앙상블 심층 분석
끊임없이 진화하는 머신러닝 환경에서 최적의 모델 성능을 달성하기 위해서는 종종 여러 알고리즘을 활용해야 합니다. 이때 앙상블 기법이 중요한 역할을 합니다. 앙상블 방법은 다양한 모델의 강점을 결합하여 단일 모델이 자체적으로 달성할 수 있는 것보다 더 정확하고 견고한 예측을 제공합니다. 이 포괄적인 가이드에서는 두 가지 핵심 앙상블 기법인 투표 분류기와 수동 앙상블을 탐구할 것입니다. Python의 scikit-learn 라이브러리를 사용한 구현과 Kaggle의 날씨 데이터셋을 활용한 실용적인 예제를 함께 살펴보겠습니다.
목차
앙상블 기법 소개
앙상블 학습은 머신러닝에서 강력한 패러다임으로, 종종 “약한 학습자”라고 불리는 여러 모델을 전략적으로 결합하여 “강한 학습자”를 형성합니다. 기본 전제는 개별 모델은 정확도가 다양할 수 있지만, 그들의 집단적인 지혜는 성능 향상, 분산 감소 및 일반화 향상을 가져올 수 있다는 것입니다.
왜 앙상블 기법을 사용할까요?
- 정확도 향상: 여러 모델을 결합하면 종종 더 나은 예측 성능을 얻을 수 있습니다.
- 과적합 감소: 앙상블은 개별 모델의 편향과 분산을 균형 있게 조절하여 과적합을 완화할 수 있습니다.
- 다용도성: 다양한 분야에서 적용 가능하며, 다양한 유형의 모델과 호환됩니다.
투표 분류기 이해하기
투표 분류기는 가장 간단하고 효과적인 앙상블 방법 중 하나입니다. 여러 다른 모델의 예측을 결합하여 다수의 표를 획득한 클래스를 출력합니다.
하드 투표 vs 소프트 투표
- 하드 투표: 최종 예측은 각 모델의 예측 클래스의 최빈값입니다. 본질적으로 각 모델은 동등한 표를 가지며, 가장 많은 표를 얻은 클래스가 승리합니다.
- 소프트 투표: 예측된 클래스에만 의존하는 대신, 소프트 투표는 각 클래스의 예측 확률을 고려합니다. 최종 예측은 확률의 합을 기반으로 하며, 가장 높은 집계 확률을 가진 클래스가 선택됩니다.
Python에서 투표 분류기 구현하기
Python의 scikit-learn 라이브러리를 사용한 실용적인 구현을 살펴보겠습니다. 날씨 데이터셋을 활용하여 내일 비가 올지 예측해보겠습니다.
1. 필요한 라이브러리 가져오기
1 2 3 4 5 6 7 8 |
import pandas as pd import numpy as np import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.impute import SimpleImputer from sklearn.preprocessing import OneHotEncoder, LabelEncoder, StandardScaler from sklearn.feature_selection import SelectKBest, chi2 from sklearn.metrics import accuracy_score, classification_report |
2. 데이터 로딩 및 전처리
1 2 3 4 5 |
# 데이터셋 로드 data = pd.read_csv('weatherAUS - tiny.csv') # 마지막 몇 행 표시 print(data.tail()) |
3. 결측치 처리
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 특징과 타겟 분리 X = data.iloc[:, :-1] y = data.iloc[:, -1] # 수치형 열 numerical_cols = X.select_dtypes(include=['int64', 'float64']).columns imputer_num = SimpleImputer(strategy='mean') X[numerical_cols] = imputer_num.fit_transform(X[numerical_cols]) # 범주형 열 categorical_cols = X.select_dtypes(include=['object']).columns imputer_cat = SimpleImputer(strategy='most_frequent') X[categorical_cols] = imputer_cat.fit_transform(X[categorical_cols]) |
4. 범주형 변수 인코딩
1 2 3 4 5 6 7 8 |
# 원-핫 인코딩 encoder = OneHotEncoder(drop='first', sparse=False) encoded_cols = encoder.fit_transform(X[categorical_cols]) encoded_col_names = encoder.get_feature_names_out(categorical_cols) X_encoded = pd.DataFrame(encoded_cols, columns=encoded_col_names) # 수치형 특징과 결합 X = pd.concat([X[numerical_cols], X_encoded], axis=1) |
5. 특징 선택
1 2 3 4 5 6 7 8 9 10 |
# 특징 스케일링 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 상위 5개 특징 선택 selector = SelectKBest(score_func=chi2, k=5) X_new = selector.fit_transform(X_scaled, y) selected_features = selector.get_support(indices=True) feature_names = X.columns[selected_features] print(f"선택된 특징: {feature_names}") |
6. 훈련-테스트 분할
1 2 3 |
X_train, X_test, y_train, y_test = train_test_split( X_new, y, test_size=0.20, random_state=1 ) |
7. 개별 분류기 구축
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier import xgboost as xgb # 모델 초기화 knn = KNeighborsClassifier(n_neighbors=3) lr = LogisticRegression(random_state=0, max_iter=200) gnb = GaussianNB() svc = SVC(probability=True) dtc = DecisionTreeClassifier() rfc = RandomForestClassifier(n_estimators=500, max_depth=5) abc = AdaBoostClassifier() xgb_model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss') |
8. 개별 모델 훈련 및 평가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 모델 목록과 이름 models = [ ('KNN', knn), ('Logistic Regression', lr), ('GaussianNB', gnb), ('SVC', svc), ('Decision Tree', dtc), ('Random Forest', rfc), ('AdaBoost', abc), ('XGBoost', xgb_model) ] # 훈련 및 평가 for name, model in models: model.fit(X_train, y_train) y_pred = model.predict(X_test) accuracy = accuracy_score(y_pred, y_test) print(f"{name} 정확도: {accuracy:.4f}") |
1 2 3 4 5 6 7 8 |
KNN 정확도: 0.8455 Logistic Regression 정확도: 0.8690 GaussianNB 정확도: 0.8220 SVC 정확도: 0.8700 Decision Tree 정확도: 0.8345 Random Forest 정확도: 0.8720 AdaBoost 정확도: 0.8715 XGBoost 정확도: 0.8650 |
9. 투표 분류기 구현하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from sklearn.ensemble import VotingClassifier # 소프트 투표로 투표 분류기 초기화 voting_clf = VotingClassifier( estimators=[ ('knn', knn), ('lr', lr), ('gnb', gnb), ('svc', svc), ('dtc', dtc), ('rfc', rfc), ('abc', abc), ('xgb', xgb_model) ], voting='soft' ) # 투표 분류기 훈련 voting_clf.fit(X_train, y_train) # 예측 및 평가 y_pred_voting = voting_clf.predict(X_test) voting_accuracy = accuracy_score(y_pred_voting, y_test) print(f"투표 분류기 정확도: {voting_accuracy:.4f}") |
1 |
투표 분류기 정확도: 0.8650 |
수동 앙상블 방법 탐구
투표 분류기는 앙상블 학습에 직관적인 접근법을 제공하지만, 수동 앙상블 방법은 모델 예측을 결합하는 맞춤 전략을 허용하여 더 큰 유연성을 제공합니다. 이 섹션에서는 개별 분류기의 예측 확률을 평균화하여 수동 앙상블을 구현하는 과정을 단계별로 살펴봅니다.
수동 앙상블 단계별 구현
1. 개별 모델로 확률 예측
1 2 3 4 5 |
# KNN으로 확률 예측 p1 = knn.predict_proba(X_test) # 로지스틱 회귀로 확률 예측 p2 = lr.predict_proba(X_test) |
2. 확률 평균화
1 2 |
# 예측된 확률 평균화 p_avg = (p1 + p2) / 2 |
3. 평균화된 확률을 기반으로 최종 예측
1 2 3 4 5 6 |
# 평균화된 확률을 최종 예측으로 변환 y_pred_manual = np.argmax(p_avg, axis=1) # 정확도 평가 manual_accuracy = accuracy_score(y_pred_manual, y_test) print(f"수동 앙상블 정확도: {manual_accuracy:.4f}") |
1 |
수동 앙상블 정확도: 0.8600 |
실용적인 구현: 날씨 예측
앙상블 기법의 적용을 설명하기 위해, 다양한 기상 요소를 기반으로 내일 비가 올지를 예측하는 Kaggle의 날씨 데이터셋을 사용할 것입니다.
데이터 전처리
효과적인 머신러닝 모델 구축을 위해 적절한 데이터 전처리는 매우 중요합니다. 여기에는 결측치 처리, 범주형 변수 인코딩, 관련 특징 선택 및 데이터 스케일링이 포함됩니다.
1. 결측치 처리
- 수치형 특징: 평균 전략을 사용하여 대체.
- 범주형 특징: 최빈값 전략을 사용하여 대체.
2. 범주형 변수 인코딩
- 원-핫 인코딩: 고유한 범주가 두 개 이상인 범주형 특징에 적용.
- 라벨 인코딩: 이진 범주형 특징에 적용.
3. 특징 선택
SelectKBest와 카이제곱 통계를 사용하여 타겟 변수와 가장 강한 관계를 가진 상위 5개 특징을 선택합니다.
4. 특징 스케일링
특징 세트를 정규화하기 위해 StandardScaler를 적용하여 각 특징이 모델의 성능에 동일하게 기여하도록 합니다.
모델 구축
K-최근접 이웃, 로지스틱 회귀, 가우시안 나이브 베이즈, 서포트 벡터 머신, 의사결정 나무, 랜덤 포레스트, AdaBoost 및 XGBoost를 포함한 여러 개별 분류기를 구축하고 평가했습니다.
앙상블 기법 평가
투표 분류기와 수동 앙상블을 모두 구현하여 개별 모델과 비교하여 성능을 평가했습니다.
결론
앙상블 기법, 특히 투표 분류기와 수동 앙상블은 머신러닝 전문가의 도구상자에서 매우 중요한 도구입니다. 여러 모델을 전략적으로 결합함으로써 이러한 방법은 예측 성능을 향상시키고, 과적합 위험을 줄이며, 다양한 알고리즘의 강점을 활용합니다. 더 높은 정확도나 더 견고한 모델을 목표로 하든, 앙상블 방법을 마스터하는 것은 머신러닝 프로젝트를 크게 향상시킬 수 있습니다.
핵심 요점:
- 투표 분류기: 다수 투표 또는 확률 평균화를 사용하여 여러 모델을 결합하는 간단하지만 효과적인 방법을 제공합니다.
- 수동 앙상블: 예측을 결합하는 방식을 세밀하게 제어할 수 있어, 표준화된 앙상블 방법보다 더 나은 성능을 발휘할 수 있는 맞춤 전략을 허용합니다.
- 데이터 전처리: 모델이 깨끗하고 잘 구조화된 데이터로 학습되도록 보장하는 데 필수적이며, 앙상블 기법의 효과에 직접적인 영향을 미칩니다.
- 모델 평가: 앙상블 방법이 개별 모델에 비해 추가적인 가치를 제공하는지 검증하기 위해 항상 비교해야 합니다.
앙상블 학습을 활용하여 머신러닝 모델의 잠재력을 최대한 발휘하고, 프로젝트에서 더 정확하고 신뢰할 수 있는 예측을 이끌어 내세요.
키워드: 앙상블 기법, 투표 분류기, 수동 앙상블, 머신러닝, Python, scikit-learn, 모델 정확도, 데이터 전처리, 특징 선택, 날씨 예측, K-최근접 이웃, 로지스틱 회귀, 가우시안 나이브 베이즈, 서포트 벡터 머신, 의사결정 나무, 랜덤 포레스트, AdaBoost, XGBoost