pandas
다양한 머신러닝 알고리즘 비교 및 하이퍼파라미터 튜닝
난개발자
2025. 1. 31. 22:28
728x90
머신러닝 모델의 성능을 최적화하려면 여러 알고리즘을 비교하고, 각 모델의 하이퍼파라미터를 튜닝하는 과정이 필요합니다.
이번 글에서는 Scikit-Learn을 활용하여 여러 알고리즘을 비교하고, 최적의 모델을 찾는 방법을 소개하겠습니다.
1. 라이브러리 설치 및 불러오기
먼저 필요한 라이브러리를 설치합니다.
pip install pandas scikit-learn seaborn matplotlib
이제 라이브러리를 불러옵니다.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
2. 데이터 불러오기 및 전처리
(1) 데이터 불러오기
# 타이타닉 데이터셋 로드
df = sns.load_dataset("titanic")
# 데이터 확인
print(df.head())
print(df.info())
(2) 결측값 처리
df['age'].fillna(df['age'].median(), inplace=True)
df['embarked'].fillna(df['embarked'].mode()[0], inplace=True)
df.drop(columns=['deck'], inplace=True)
(3) 범주형 데이터를 숫자로 변환
df['sex'] = df['sex'].map({'male': 0, 'female': 1})
df = pd.get_dummies(df, columns=['embarked'], drop_first=True)
(4) 불필요한 열 제거
df.drop(columns=['alive', 'who', 'adult_male', 'class', 'embark_town'], inplace=True)
3. 데이터셋 분리 및 정규화
# 특성과 타겟 변수 설정
X = df.drop(columns=['survived'])
y = df['survived']
# 훈련 데이터와 테스트 데이터 분리 (80:20 비율)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 데이터 정규화 (SVM과 로지스틱 회귀에 필요)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
4. 다양한 머신러닝 모델 비교
(1) 여러 모델 훈련 및 평가
models = {
"Logistic Regression": LogisticRegression(),
"Support Vector Machine": SVC(),
"Random Forest": RandomForestClassifier(n_estimators=100, random_state=42),
"Gradient Boosting": GradientBoostingClassifier(n_estimators=100, random_state=42)
}
# 모델별 성능 비교
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"{name} 정확도: {acc:.4f}")
출력 예시:
Logistic Regression 정확도: 0.7980
Support Vector Machine 정확도: 0.8101
Random Forest 정확도: 0.8323
Gradient Boosting 정확도: 0.8427
(2) 교차 검증을 통한 성능 비교
for name, model in models.items():
scores = cross_val_score(model, X_train, y_train, cv=5)
print(f"{name} 평균 정확도: {scores.mean():.4f}")
교차 검증을 통해 모델의 안정적인 성능을 확인할 수 있습니다.
5. 하이퍼파라미터 튜닝 (GridSearchCV 활용)
(1) 랜덤 포레스트 하이퍼파라미터 튜닝
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X_train, y_train)
print("최적 하이퍼파라미터:", grid_search.best_params_)
print("최고 교차 검증 정확도:", grid_search.best_score_)
(2) SVM 하이퍼파라미터 튜닝
param_grid = {
'C': [0.1, 1, 10],
'kernel': ['linear', 'rbf']
}
grid_search = GridSearchCV(SVC(), param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X_train, y_train)
print("최적 하이퍼파라미터:", grid_search.best_params_)
print("최고 교차 검증 정확도:", grid_search.best_score_)
6. 최적 모델 평가
튜닝된 최적 모델을 활용하여 성능을 평가합니다.
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)
# 최종 정확도 및 보고서 출력
print(f"최적 모델 정확도: {accuracy_score(y_test, y_pred):.4f}")
print(classification_report(y_test, y_pred))
728x90