머신 러닝을 위한 데이터 전처리 및 모델 구축 종합 가이드
목차
1. 소개
데이터 전처리는 머신 러닝 파이프라인에서 중요한 단계입니다. 이는 원시 데이터를 모델링에 적합한 형식으로 변환하여 예측 모델의 성능과 정확성을 향상시키는 과정을 포함합니다. 이 기사에서는 Kaggle에서 제공된 날씨 데이터셋을 사용하여 데이터 전처리 및 모델 구축 과정을 단계별로 설명합니다.
2. 데이터 가져오기 및 탐색
전처리에 들어가기 전에 데이터셋을 로드하고 이해하는 것이 필수적입니다.
1 2 3 4 5 6 7 8 |
import pandas as pd import seaborn as sns # Load the dataset data = pd.read_csv('weatherAUS.csv') # Display the last five rows print(data.tail()) |
샘플 출력:
1 2 |
Date Location MinTemp MaxTemp Rainfall Evaporation Sunshine WindGustDir WindGustSpeed WindDir9am ... Humidity3pm Pressure9am Pressure3pm Cloud9am Cloud3pm Temp9am Temp3pm RainToday RISK_MM RainTomorrow 142188 2017-06-20 Uluru 3.5 21.8 0.0 NaN NaN E 31.0 ESE ... 27.0 1024.7 1021.2 NaN NaN 9.4 20.9 No 0.0 No |
데이터셋의 구조를 이해하는 것은 효과적인 전처리에 매우 중요합니다. .info()
와 .describe()
를 사용하여 데이터 유형과 통계 요약 정보를 확인할 수 있습니다.
3. 결측치 처리
결측치는 분석 결과를 왜곡시킬 수 있습니다. 이를 적절하게 처리하는 것이 중요합니다.
수치 데이터
수치형 열의 경우, 결측값은 평균, 중앙값 또는 최빈값과 같은 전략을 사용하여 대체할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np from sklearn.impute import SimpleImputer # Identify numerical columns numerical_cols = list(np.where((X.dtypes == np.int64) | (X.dtypes == np.float64))[0]) # Initialize the imputer with a mean strategy imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') # Fit and transform the data X.iloc[:, numerical_cols] = imp_mean.fit_transform(X.iloc[:, numerical_cols]) |
범주형 데이터
범주형 열의 경우, 결측값은 가장 빈번한 값으로 대체할 수 있습니다.
1 2 3 4 5 6 7 8 |
# Identify string columns string_cols = list(np.where((X.dtypes == object))[0]) # Initialize the imputer with the most frequent strategy imp_freq = SimpleImputer(missing_values=np.nan, strategy='most_frequent') # Fit and transform the data X.iloc[:, string_cols] = imp_freq.fit_transform(X.iloc[:, string_cols]) |
4. 범주형 변수 인코딩
머신 러닝 모델은 수치 입력을 요구하기 때문에, 범주형 변수는 적절하게 인코딩되어야 합니다.
레이블 인코딩
레이블 인코딩은 범주형 레이블을 수치 값으로 변환합니다. 이는 이진 범주나 순서형 데이터에 적합합니다.
1 2 3 4 5 |
from sklearn import preprocessing def LabelEncoderMethod(series): le = preprocessing.LabelEncoder() return le.fit_transform(series) |
원-핫 인코딩
원-핫 인코딩은 범주형 변수를 이진 매트릭스로 변환합니다. 이는 두 개 이상의 범주를 가진 명목형 데이터에 이상적입니다.
1 2 3 4 5 6 |
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder def OneHotEncoderMethod(indices, data): columnTransformer = ColumnTransformer([('encoder', OneHotEncoder(), indices)], remainder='passthrough') return columnTransformer.fit_transform(data) |
임계값 기반 인코딩 선택
인코딩 프로세스를 간소화하기 위해, 각 열의 범주 수에 따라 인코딩 방법을 선택하는 함수를 만들 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def EncodingSelection(X, threshold=10): # Select string columns string_cols = list(np.where((X.dtypes == object))[0]) one_hot_encoding_indices = [] # Decide on encoding based on the number of unique categories for col in string_cols: length = len(pd.unique(X[X.columns[col]])) if length == 2 or length > threshold: X[X.columns[col]] = LabelEncoderMethod(X[X.columns[col]]) else: one_hot_encoding_indices.append(col) # Apply One-Hot Encoding to selected columns X = OneHotEncoderMethod(one_hot_encoding_indices, X) return X # Apply encoding selection X = EncodingSelection(X) |
5. 특징 선택
특징 선택은 모델 구축을 위해 가장 관련성 높은 특징을 선택하는 과정입니다. 상관 관계 분석, 히트맵, SelectKBest와 같은 방법을 사용하여 영향력 있는 특징을 식별할 수 있습니다.
6. 훈련-테스트 분할
데이터셋을 훈련 세트와 테스트 세트로 분할하는 것은 모델의 성능을 보지 못한 데이터에서 평가하는 데 필수적입니다.
1 2 3 4 5 6 7 |
from sklearn.model_selection import train_test_split # Split the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1) print(X_train.shape) # Output: (164, 199) |
7. 특징 스케일링
특징 스케일링은 모든 특징이 결과에 동등하게 기여하도록 보장합니다. 이는 경사 하강법의 수렴 속도를 가속화하는 데 도움이 됩니다.
표준화
표준화는 데이터의 평균을 0, 표준 편차를 1로 변환합니다.
1 2 3 4 5 6 7 8 9 10 |
from sklearn import preprocessing sc = preprocessing.StandardScaler(with_mean=False) sc.fit(X_train) X_train = sc.transform(X_train) X_test = sc.transform(X_test) print(X_train.shape) # Output: (164, 199) |
정규화
정규화는 데이터를 보통 0과 1 사이의 고정된 범위로 스케일링합니다.
1 2 3 4 5 |
from sklearn.preprocessing import MinMaxScaler min_max_scaler = MinMaxScaler() X_train = min_max_scaler.fit_transform(X_train) X_test = min_max_scaler.transform(X_test) |
8. 회귀 모델 구축
데이터 전처리가 완료되면, 다양한 회귀 모델을 구축하고 평가할 수 있습니다. 아래는 몇 가지 인기 있는 회귀 알고리즘의 구현 예시입니다.
선형 회귀
종속 변수와 하나 이상의 독립 변수 간의 관계를 모델링하는 기본 알고리즘입니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score # Initialize and train the model model = LinearRegression() model.fit(X_train, y_train) # Predict and evaluate y_pred = model.predict(X_test) score = r2_score(y_test, y_pred) print(f"Linear Regression R2 Score: {score}") # Output: 0.09741670577134398 |
다항 회귀
다항 회귀는 다항 항을 추가하여 선형 모델을 강화하고 비선형 관계를 포착합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures # Initialize polynomial features and linear regression poly = PolynomialFeatures(degree=2) X_train_poly = poly.fit_transform(X_train) model = LinearRegression() # Train and predict model.fit(X_train_poly, y_train) X_test_poly = poly.transform(X_test) y_pred = model.predict(X_test_poly) score = r2_score(y_test, y_pred) print(f"Polynomial Regression R2 Score: {score}") # Output: -0.4531422286977287 |
참고: 음수의 R² 점수는 모델 성능이 좋지 않음을 나타냅니다.
의사결정나무 회귀
특징 값에 따라 데이터를 하위 집합으로 분할하는 비선형 모델입니다.
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.tree import DecisionTreeRegressor # Initialize and train the model model = DecisionTreeRegressor(max_depth=4) model.fit(X_train, y_train) # Predict and evaluate y_pred = model.predict(X_test) score = r2_score(y_test, y_pred) print(f"Decision Tree Regressor R2 Score: {score}") # Output: 0.883961900453219 |
랜덤 포레스트 회귀
여러 개의 의사결정나무를 결합하여 성능을 향상하고 과적합을 줄이는 앙상블 방법입니다.
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.ensemble import RandomForestRegressor # Initialize and train the model model = RandomForestRegressor(n_estimators=25, random_state=10) model.fit(X_train, y_train) # Predict and evaluate y_pred = model.predict(X_test) score = r2_score(y_test, y_pred) print(f"Random Forest Regressor R2 Score: {score}") # Output: 0.9107611439295349 |
애다부스트 회귀
약한 학습기를 결합하여 강력한 예측기를 형성하는 또 다른 앙상블 기술입니다.
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.ensemble import AdaBoostRegressor # Initialize and train the model model = AdaBoostRegressor(random_state=0, n_estimators=100) model.fit(X_train, y_train) # Predict and evaluate y_pred = model.predict(X_test) score = r2_score(y_test, y_pred) print(f"AdaBoost Regressor R2 Score: {score}") # Output: 0.8806696893560713 |
XGBoost 회귀
속도와 성능을 최적화한 강력한 그래디언트 부스팅 프레임워크입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import xgboost as xgb # Initialize and train the model model = xgb.XGBRegressor( n_estimators=100, reg_lambda=1, gamma=0, max_depth=3, learning_rate=0.05 ) model.fit(X_train, y_train) # Predict and evaluate y_pred = model.predict(X_test) score = r2_score(y_test, y_pred) print(f"XGBoost Regressor R2 Score: {score}") # Output: 0.8947431439987505 |
서포트 벡터 머신(SVM) 회귀
SVM은 복잡한 관계를 포착하여 회귀 작업에 적응될 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.svm import SVR # Initialize and train the model model = SVR() model.fit(X_train, y_train) # Predict and evaluate y_pred = model.predict(X_test) score = r2_score(y_test, y_pred) print(f"SVM Regressor R2 Score: {score}") # Output: -0.02713944090388254 |
참고: 음수의 R² 점수는 모델이 수평선보다 성능이 떨어짐을 나타냅니다.
9. 모델 평가
R² 점수는 회귀 모델을 평가하는 일반적인 지표입니다. 이는 독립 변수로부터 예측 가능한 종속 변수의 분산 비율을 나타냅니다.
- 양수 R²: 모델이 분산의 일부를 설명합니다.
- 음수 R²: 모델이 분산을 설명하지 못하며, 단순 평균 기반 모델보다 성능이 떨어집니다.
이 가이드에서 랜덤 포레스트 회귀는 약 0.91의 R² 점수를 달성하여 테스트 데이터에서 강력한 성능을 보였습니다.
10. 결론
효과적인 데이터 전처리는 강력한 머신 러닝 모델을 구축하기 위한 기초를 마련합니다. 결측치를 신중하게 처리하고, 적절한 인코딩 기술을 선택하며, 특징을 스케일링함으로써 데이터의 품질을 향상시켜 모델 성능을 개선할 수 있습니다. 탐구한 회귀 모델 중에서는 랜덤 포레스트와 AdaBoost와 같은 앙상블 방법이 날씨 데이터셋에서 우수한 예측력을 보여주었습니다. 항상 모델을 철저히 평가하고 프로젝트 목표에 가장 적합한 모델을 선택하는 것을 잊지 마세요.
이러한 전처리 및 모델링 전략을 활용하여 데이터셋의 잠재력을 최대한 발휘하고 영향력 있는 머신 러닝 솔루션을 구현하세요.