html
분류 모델의 마스터링: 데이터 과학을 위한 종합적인 파이썬 템플릿
목차
- 분류 모델 소개
- 환경 설정
- 데이터 가져오기 및 탐색
- 결측치 처리
- 범주형 변수 인코딩
- 특징 선택
- 학습 및 테스트 분할
- 특징 스케일링
- 모델 구축 및 평가
- 결론
1. 분류 모델 소개
분류 모델은 감독 학습의 핵심으로, 입력 특징을 기반으로 이산 레이블을 예측할 수 있게 합니다. 이러한 모델은 이메일 스팸 감지에서 의료 진단에 이르기까지 다양한 응용 분야에서 중요한 역할을 합니다. 이 모델을 마스터하기 위해서는 데이터 전처리, 특징 공학, 모델 선택, 평가 지표에 대한 이해가 필요합니다.
2. 환경 설정
모델 구축에 뛰어들기 전에, 파이썬 환경에 필요한 라이브러리가 설치되어 있는지 확인하세요. 환경을 설정하는 방법은 다음과 같습니다:
|
# Install necessary libraries !pip install pandas seaborn scikit-learn xgboost |
필수 라이브러리를 임포트합니다:
|
import pandas as pd import seaborn as sns import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, LabelEncoder, OneHotEncoder from sklearn.impute import SimpleImputer from sklearn.compose import ColumnTransformer from sklearn.feature_selection import SelectKBest, chi2 from sklearn.metrics import accuracy_score 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 |
3. 데이터 가져오기 및 탐색
이 튜토리얼에서는 Kaggle의 Weather Australia Dataset을 사용할 것입니다. 이 포괄적인 데이터셋은 분류 모델 구축에 이상적인 다양한 날씨 관련 특징을 제공합니다.
|
# Import data data = pd.read_csv('weatherAUS.csv') # Ensure the CSV file is in your working directory print(data.tail()) |
샘플 출력:
|
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 E 31.0 ESE ... 27.0 1024.7 1021.2 NaN NaN 9.4 20.9 No 0.0 No 142189 2017-06-21 Uluru 2.8 23.4 0.0 NaN E 31.0 SE ... 24.0 1024.6 1020.3 NaN NaN 10.1 22.4 No 0.0 No 142190 2017-06-22 Uluru 3.6 25.3 0.0 NaN NNW 22.0 SE ... 21.0 1023.5 1019.1 NaN NaN 10.9 24.5 No 0.0 No 142191 2017-06-23 Uluru 5.4 26.9 0.0 NaN N 37.0 SE ... 24.0 1021.0 1016.8 NaN NaN 12.5 26.1 No 0.0 No 142192 2017-06-24 Uluru 7.8 27.0 0.0 NaN SE 28.0 SSE ... 24.0 1019.4 1016.5 3.0 2.0 15.1 26.0 No 0.0 No |
4. 결측치 처리
데이터의 무결성은 신뢰할 수 있는 모델을 구축하는 데 매우 중요합니다. 숫자형 및 범주형 특징 모두에서 결측치를 해결해 봅시다.
숫자형 결측치 처리
Scikit-learn의 SimpleImputer을 사용하여 각 열의 평균으로 숫자형 결측치를 채웁니다.
|
from sklearn.impute import SimpleImputer # Separate features and target X = data.iloc[:, :-1] # All columns except the last one y = data.iloc[:, -1] # Target column # Identify numeric columns numerical_cols = X.select_dtypes(include=['int64', 'float64']).columns # Impute missing numeric values with mean imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') X[numerical_cols] = imp_mean.fit_transform(X[numerical_cols]) |
범주형 결측치 처리
범주형 변수의 경우, 가장 빈번한(최빈) 값으로 결측치를 채웁니다.
|
# Identify categorical columns categorical_cols = X.select_dtypes(include=['object']).columns # Impute missing categorical values with the most frequent value imp_freq = SimpleImputer(missing_values=np.nan, strategy='most_frequent') X[categorical_cols] = imp_freq.fit_transform(X[categorical_cols]) |
5. 범주형 변수 인코딩
머신 러닝 모델은 숫자 입력을 필요로 합니다. 따라서 범주형 변수는 인코딩되어야 합니다. 이진 범주에는 레이블 인코딩을, 다중 클래스 범주에는 원-핫 인코딩을 사용합니다.
레이블 인코딩
|
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() y = le.fit_transform(y) # Encoding the target variable |
원-핫 인코딩
고유 카테고리 수에 따라 인코딩을 처리하는 방법을 구현합니다.
|
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder def one_hot_encode(columns, data): ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), columns)], remainder='passthrough') return ct.fit_transform(data) # Example usage: # X = one_hot_encode(['WindGustDir', 'WindDir9am'], X) |
또는 고유 카테고리 임계값을 기준으로 인코딩 프로세스를 자동화합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
def encoding_selection(X, threshold=10): # Identify string columns string_cols = X.select_dtypes(include=['object']).columns one_hot_encoding_cols = [] for col in string_cols: unique_count = X[col].nunique() if unique_count == 2 or unique_count > threshold: X[col] = le.fit_transform(X[col]) else: one_hot_encoding_cols.append(col) if one_hot_encoding_cols: X = one_hot_encode(one_hot_encoding_cols, X) return X X = encoding_selection(X) |
6. 특징 선택
특징 수를 줄이면 모델 성능을 향상시키고 계산 비용을 줄일 수 있습니다. Chi-Squared 테스트와 함께 SelectKBest를 사용하여 상위 특징을 선택합니다.
|
from sklearn.feature_selection import SelectKBest, chi2 from sklearn.preprocessing import MinMaxScaler # Scale features scaler = MinMaxScaler() X_scaled = scaler.fit_transform(X) # Select top K features k = 10 # You can adjust this based on your requirement selector = SelectKBest(score_func=chi2, k=k) X_selected = selector.fit_transform(X_scaled, y) # Get selected feature indices selected_indices = selector.get_support(indices=True) selected_features = X.columns[selected_indices] print("Selected Features:", selected_features) |
7. 학습 및 테스트 분할
데이터셋을 학습 세트와 테스트 세트로 분할하는 것은 모델의 퍼포먼스를 보지 못한 데이터에서 평가하기 위해 필수적입니다.
|
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.20, random_state=1) print("Training set shape:", X_train.shape) print("Test set shape:", X_test.shape) |
출력:
|
Training set shape: (113754, 10) Test set shape: (28439, 10) |
8. 특징 스케일링
특징을 표준화하면 KNN이나 SVM과 같은 알고리즘에서 거리 계산에 각 특징이 동등하게 기여하도록 합니다.
|
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) print("Scaled Training set shape:", X_train.shape) print("Scaled Test set shape:", X_test.shape) |
출력:
|
Scaled Training set shape: (113754, 10) Scaled Test set shape: (28439, 10) |
9. 모델 구축 및 평가
데이터 전처리가 완료되었으므로 이제 다양한 분류 모델을 구축하고 평가할 수 있습니다. 모델을 정확도 점수를 기반으로 평가할 것입니다.
K-최근접 이웃 (KNN)
|
from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) print("KNN Accuracy:", accuracy_score(y_test, y_pred)) |
출력:
로지스틱 회귀
|
from sklearn.linear_model import LogisticRegression log_reg = LogisticRegression(random_state=0, max_iter=200) log_reg.fit(X_train, y_train) y_pred = log_reg.predict(X_test) print("Logistic Regression Accuracy:", accuracy_score(y_test, y_pred)) |
출력:
|
Logistic Regression Accuracy: 0.99996 |
가우시안 나이브 베이즈
|
from sklearn.naive_bayes import GaussianNB gnb = GaussianNB() gnb.fit(X_train, y_train) y_pred = gnb.predict(X_test) print("GaussianNB Accuracy:", accuracy_score(y_test, y_pred)) |
출력:
|
GaussianNB Accuracy: 0.97437 |
서포트 벡터 머신 (SVM)
|
from sklearn.svm import SVC svm = SVC() svm.fit(X_train, y_train) y_pred = svm.predict(X_test) print("SVM Accuracy:", accuracy_score(y_test, y_pred)) |
출력:
의사 결정 트리 분류기
|
from sklearn.tree import DecisionTreeClassifier dtc = DecisionTreeClassifier() dtc.fit(X_train, y_train) y_pred = dtc.predict(X_test) print("Decision Tree Accuracy:", accuracy_score(y_test, y_pred)) |
출력:
|
Decision Tree Accuracy: 1.0 |
랜덤 포레스트 분류기
|
from sklearn.ensemble import RandomForestClassifier rfc = RandomForestClassifier(n_estimators=500, max_depth=5) rfc.fit(X_train, y_train) y_pred = rfc.predict(X_test) print("Random Forest Accuracy:", accuracy_score(y_test, y_pred)) |
출력:
|
Random Forest Accuracy: 1.0 |
AdaBoost 분류기
|
from sklearn.ensemble import AdaBoostClassifier abc = AdaBoostClassifier() abc.fit(X_train, y_train) y_pred = abc.predict(X_test) print("AdaBoost Accuracy:", accuracy_score(y_test, y_pred)) |
출력:
XGBoost 분류기
|
import xgboost as xgb xgb_model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss') xgb_model.fit(X_train, y_train) y_pred = xgb_model.predict(X_test) print("XGBoost Accuracy:", accuracy_score(y_test, y_pred)) |
출력:
XGBoost의 평가 지표에 관한 경고는 위와 같이 eval_metric
매개변수를 명시적으로 설정하여 억제할 수 있습니다.
10. 결론
분류 모델 구축이 반드시 어려울 필요는 없습니다. 데이터 전처리, 인코딩, 특징 선택, 모델 평가에 대한 체계적인 접근 방식을 통해 특정 요구에 맞춘 견고한 모델을 효율적으로 개발할 수 있습니다. 이 기사에서 설명한 마스터 템플릿은 데이터 수집부터 모델 평가까지의 워크플로우를 간소화하는 포괄적인 가이드 역할을 합니다. 초보자이든 숙련된 데이터 과학자이든 이러한 템플릿을 활용하면 생산성과 모델 성능을 향상시킬 수 있습니다.
주요 요점:
- 데이터 전처리: 모델 정확도를 보장하기 위해 데이터를 꼼꼼하게 정리하고 준비하세요.
- 인코딩 기술: 다양한 알고리즘에 맞게 범주형 변수를 적절히 인코딩하세요.
- 특징 선택: 특징 선택 방법을 활용하여 모델 효율성과 성능을 향상시키세요.
- 모델 다양성: 다양한 모델을 실험하여 데이터셋에 가장 적합한 모델을 찾아보세요.
- 평가 지표: 정확도뿐만 아니라 정밀도, 재현율, F1-점수와 같은 다른 지표도 고려하여 전체적인 평가를 하세요.
이러한 실천 방법을 수용하여 데이터 과학 프로젝트에 명확성과 정밀성을 더하세요!