html
Python을 이용한 날씨 예측을 위한 의사 결정 트리, 랜덤 포레스트, XGBoost, AdaBoost 구현
목차
소개
날씨 조건을 예측하는 것은 기계 학습의 고전적인 문제로, 농업, 항공, 이벤트 계획 등 다양한 산업에 귀중한 통찰력을 제공합니다. 이 종합 가이드에서는 Weather Australia 데이터셋을 사용하여 내일 비가 올지 예측하기 위해 의사 결정 트리, 랜덤 포레스트, XGBoost, AdaBoost를 포함한 여러 기계 학습 모델을 구현하는 방법을 자세히 설명합니다. 데이터 전처리, 모델 훈련, 평가 및 이러한 모델을 실제 웹 애플리케이션에 배포하는 과정까지 다룹니다.
데이터셋 개요
Weather Australia 데이터셋은 Kaggle에서 제공되며, 호주 전역 여러 지역에서 기록된 기상 조건과 관련된 24개의 특징을 포함합니다. 주된 목표는 다음 날 비가 올지 여부를 나타내는 RainTomorrow 속성을 예측하는 것입니다.
데이터셋 특징
- Date: 관측 날짜.
- Location: 기상 관측소의 지리적 위치.
- MinTemp: 최저 기온 (°C).
- MaxTemp: 최고 기온 (°C).
- Rainfall: 강수량 (mm).
- Evaporation: 증발량 (mm).
- Sunshine: 일조 시간 (시간).
- WindGustDir: 가장 강한 돌풍의 방향.
- WindGustSpeed: 가장 강한 돌풍의 속도 (km/h).
- WindDir9am: 오전 9시의 풍향.
- WindDir3pm: 오후 3시의 풍향.
- ...그리고 더 많은 것들.
데이터 전처리
효과적인 데이터 전처리는 정확하고 신뢰할 수 있는 기계 학습 모델을 구축하는 데 중요합니다. 결측치 처리, 범주형 변수 인코딩, 특징 선택, 스케일링 등을 다룹니다.
결측치 처리
결측 데이터는 모델 성능에 상당한 영향을 줄 수 있습니다. 수치 데이터와 범주형 데이터에 대해 별도로 결측치를 처리합니다.
수치 데이터
수치형 열에 대해서는 평균 대체를 사용하여 결측치를 채웁니다.
12345678910111213
import numpy as npimport pandas as pdfrom sklearn.impute import SimpleImputer # Load datadata = pd.read_csv('weatherAUS.csv') # Identify numerical columnsnumerical_cols = data.select_dtypes(include=['int64', 'float64']).columns # Impute missing values with meanimp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')data[numerical_cols] = imp_mean.fit_transform(data[numerical_cols])
범주형 데이터
범주형 열에 대해서는 최빈값 대체를 사용합니다.
123456
# Identify categorical columnscategorical_cols = data.select_dtypes(include=['object']).columns # Impute missing values with the most frequent valueimp_freq = SimpleImputer(missing_values=np.nan, strategy='most_frequent')data[categorical_cols] = imp_freq.fit_transform(data[categorical_cols])
범주형 변수 인코딩
기계 학습 알고리즘은 수치 입력을 필요로 합니다. 각 특징의 고유 카테고리 수에 따라 라벨 인코딩과 원-핫 인코딩을 모두 사용합니다.
12345678910111213141516171819202122
from sklearn.preprocessing import LabelEncoder, OneHotEncoderfrom sklearn.compose import ColumnTransformer def encode_features(df, threshold=10): label_enc_cols = [col for col in df.columns if df[col].dtype == 'object' and df[col].nunique() <= threshold] onehot_enc_cols = [col for col in df.columns if df[col].dtype == 'object' and df[col].nunique() > threshold] # Label Encoding le = LabelEncoder() for col in label_enc_cols: df[col] = le.fit_transform(df[col]) # One-Hot Encoding ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), onehot_enc_cols)], remainder='passthrough') df = ct.fit_transform(df) return df X = data.drop('RainTomorrow', axis=1)y = data['RainTomorrow'] X = encode_features(X)
특징 선택
모델 성능을 향상시키고 계산 복잡성을 줄이기 위해 SelectKBest 방법과 Chi-Squared 통계를 사용하여 상위 특징을 선택합니다.
1234567891011121314
from sklearn.feature_selection import SelectKBest, chi2from sklearn.preprocessing import MinMaxScaler # Scale featuresscaler = MinMaxScaler()X_scaled = scaler.fit_transform(X) # Select top 10 featuresselector = SelectKBest(score_func=chi2, k=10)X_selected = selector.fit_transform(X_scaled, y) # Further reduce to top 2 features for visualizationbest_features = selector.get_support(indices=True)X_final = X_selected[:, :2]
훈련-테스트 분할 및 특성 스케일링
데이터를 훈련 세트와 테스트 세트로 분할하면 모델의 성능을 보지 못한 데이터에서 평가할 수 있습니다.
12345678910
from sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScaler # Split the dataX_train, X_test, y_train, y_test = train_test_split(X_final, y, test_size=0.20, random_state=1) # Feature Scalingscaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)
모델 구현 및 평가
다양한 기계 학습 모델을 구현하고 정확도 점수를 사용하여 성능을 평가합니다.
K-최근접 이웃 (KNN)
12345678
from sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import accuracy_score knn = KNeighborsClassifier(n_neighbors=3)knn.fit(X_train, y_train)y_pred_knn = knn.predict(X_test)knn_accuracy = accuracy_score(y_pred_knn, y_test)print(f'KNN Accuracy: {knn_accuracy:.2f}')
KNN 정확도: 0.80
로지스틱 회귀
1234567
from sklearn.linear_model import LogisticRegression log_reg = LogisticRegression(random_state=0, max_iter=200)log_reg.fit(X_train, y_train)y_pred_lr = log_reg.predict(X_test)lr_accuracy = accuracy_score(y_pred_lr, y_test)print(f'Logistic Regression Accuracy: {lr_accuracy:.2f}')
로지스틱 회귀 정확도: 0.83
가우시안 나이브 베이즈
1234567
from sklearn.naive_bayes import GaussianNB gnb = GaussianNB()gnb.fit(X_train, y_train)y_pred_gnb = gnb.predict(X_test)gnb_accuracy = accuracy_score(y_pred_gnb, y_test)print(f'Gaussian Naive Bayes Accuracy: {gnb_accuracy:.2f}')
가우시안 나이브 베이즈 정확도: 0.80
서포트 벡터 머신 (SVM)
1234567
from sklearn.svm import SVC svm = SVC()svm.fit(X_train, y_train)y_pred_svm = svm.predict(X_test)svm_accuracy = accuracy_score(y_pred_svm, y_test)print(f'SVM Accuracy: {svm_accuracy:.2f}')
SVM 정확도: 0.83
의사 결정 트리
1234567
from sklearn.tree import DecisionTreeClassifier dtc = DecisionTreeClassifier()dtc.fit(X_train, y_train)y_pred_dtc = dtc.predict(X_test)dtc_accuracy = accuracy_score(y_pred_dtc, y_test)print(f'Decision Tree Accuracy: {dtc_accuracy:.2f}')
의사 결정 트리 정확도: 0.83
랜덤 포레스트
1234567
from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=500, max_depth=5)rf.fit(X_train, y_train)y_pred_rf = rf.predict(X_test)rf_accuracy = accuracy_score(y_pred_rf, y_test)print(f'Random Forest Accuracy: {rf_accuracy:.2f}')
랜덤 포레스트 정확도: 0.83
XGBoost와 AdaBoost
초기 구현에서는 XGBoost와 AdaBoost를 다루지 않았지만, 이러한 앙상블 방법은 모델 성능을 더욱 향상시킬 수 있습니다. 다음은 이를 구현하는 간단한 예시입니다:
XGBoost
1234567
from xgboost import XGBClassifier xgb = XGBClassifier(use_label_encoder=False, eval_metric='logloss')xgb.fit(X_train, y_train)y_pred_xgb = xgb.predict(X_test)xgb_accuracy = accuracy_score(y_pred_xgb, y_test)print(f'XGBoost Accuracy: {xgb_accuracy:.2f}')
AdaBoost
1234567
from sklearn.ensemble import AdaBoostClassifier ada = AdaBoostClassifier(n_estimators=100, random_state=0)ada.fit(X_train, y_train)y_pred_ada = ada.predict(X_test)ada_accuracy = accuracy_score(y_pred_ada, y_test)print(f'AdaBoost Accuracy: {ada_accuracy:.2f}')
참고: xgboost
라이브러리를 pip install xgboost
을 사용하여 설치해야 합니다.
결정 영역 시각화
결정 경계를 시각화하면 다양한 모델이 데이터를 어떻게 분류하는지 이해하는 데 도움이 됩니다. 아래는 Iris 데이터셋을 사용한 예시입니다:
123456789101112131415161718192021
from mlxtend.plotting import plot_decision_regionsimport matplotlib.pyplot as pltfrom sklearn import datasets # Load Iris datasetiris = datasets.load_iris()X_vis = iris.data[:, :2]y_vis = iris.target # Train KNNknn_vis = KNeighborsClassifier(n_neighbors=3)knn_vis.fit(X_vis, y_vis) # Plot decision regionsplot_decision_regions(X_vis, y_vis, clf=knn_vis) plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.title('KNN Decision Regions')plt.legend()plt.show()
시각화 출력: KNN 분류기가 만든 결정 경계를 보여주는 그래프.
결론
이 가이드에서는 Weather Australia 데이터셋을 사용하여 날씨 조건을 예측하기 위해 다양한 기계 학습 모델—의사 결정 트리, 랜덤 포레스트, 로지스틱 회귀, KNN, 가우시안 나이브 베이즈, SVM—을 구현하는 방법을 살펴보았습니다. 각 모델은 경쟁력 있는 정확도 점수를 보여주었으며, 로지스틱 회귀, SVM, 의사 결정 트리, 랜덤 포레스트는 약 83%의 정확도를 달성했습니다.
성능을 향상시키기 위해 XGBoost와 AdaBoost와 같은 앙상블 방법을 통합할 수 있습니다. 또한, 이러한 모델을 웹 애플리케이션에 배포하면 실시간 날씨 예측을 제공하여 최종 사용자가 활용할 수 있는 통찰력을 제공할 수 있습니다.
참고 문헌