모델 선택의 중요성
머신러닝 프로젝트에서 적절한 모델을 선택하는 것은 성공의 핵심이다. 같은 데이터셋이라도 모델에 따라 성능이 크게 달라질 수 있으며, 각 모델은 서로 다른 장단점을 가지고 있다.
모델 선택 기준
모델을 선택할 때 고려해야 할 주요 요소들:
- 문제 유형: 분류(Classification) vs 회귀(Regression)
- 데이터 크기: 작은 데이터셋 vs 큰 데이터셋
- 특성 수: 적은 특성 vs 많은 특성
- 해석 가능성: 모델의 설명 가능성 요구 여부
- 성능 요구사항: 정확도 vs 속도
- 데이터 특성: 선형 관계 vs 비선형 관계
1. 문제 유형에 따른 모델 선택
분류 문제 (Classification)
분류 문제는 데이터를 미리 정의된 카테고리로 분류하는 것이다.
작은 데이터셋 (< 10,000 샘플)
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
# 1. Decision Tree - 해석 가능, 빠른 학습
model = DecisionTreeClassifier(max_depth=5, random_state=42)
# 2. Random Forest - Decision Tree의 앙상블, 더 나은 성능
model = RandomForestClassifier(n_estimators=100, random_state=42)
# 3. SVM - 복잡한 경계를 가진 데이터에 적합
model = SVC(kernel='rbf', random_state=42)
# 4. K-Nearest Neighbors - 간단하고 직관적
model = KNeighborsClassifier(n_neighbors=5)
중간 데이터셋 (10,000 ~ 100,000 샘플)
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
# 1. Gradient Boosting - 높은 성능, 해석 가능
model = GradientBoostingClassifier(n_estimators=100, random_state=42)
# 2. Logistic Regression - 선형 관계, 빠르고 해석 가능
model = LogisticRegression(max_iter=1000, random_state=42)
# 3. Random Forest - 여전히 좋은 선택
model = RandomForestClassifier(n_estimators=200, random_state=42)
큰 데이터셋 (> 100,000 샘플)
from sklearn.linear_model import SGDClassifier
from sklearn.ensemble import RandomForestClassifier
# 1. SGD Classifier - 대용량 데이터에 효율적
model = SGDClassifier(loss='hinge', random_state=42)
# 2. Random Forest - 충분한 메모리가 있다면
model = RandomForestClassifier(n_estimators=100, n_jobs=-1, random_state=42)
회귀 문제 (Regression)
회귀 문제는 연속적인 값을 예측하는 것이다.
선형 관계가 예상되는 경우
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
# 1. Linear Regression - 가장 기본, 해석 가능
model = LinearRegression()
# 2. Ridge Regression - 과적합 방지 (L2 정규화)
model = Ridge(alpha=1.0)
# 3. Lasso Regression - 특성 선택 효과 (L1 정규화)
model = Lasso(alpha=1.0)
비선형 관계가 예상되는 경우
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.svm import SVR
# 1. Decision Tree Regressor - 해석 가능
model = DecisionTreeRegressor(max_depth=5, random_state=42)
# 2. Random Forest Regressor - 강력한 성능
model = RandomForestRegressor(n_estimators=100, random_state=42)
# 3. Gradient Boosting Regressor - 매우 높은 성능
model = GradientBoostingRegressor(n_estimators=100, random_state=42)
# 4. SVR - 복잡한 패턴 학습
model = SVR(kernel='rbf')
2. 데이터 특성에 따른 모델 선택
특성 수가 적은 경우 (< 20 특성)
# 모든 모델 사용 가능
# 특히 해석 가능한 모델들이 유리
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
model = DecisionTreeClassifier(max_depth=5)
# 또는
model = LogisticRegression()
특성 수가 많은 경우 (> 100 특성)
# 정규화가 있는 모델들이 유리
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import Ridge
from sklearn.ensemble import RandomForestClassifier
# L1 정규화로 특성 선택
model = LogisticRegression(penalty='l1', solver='liblinear')
# 또는 Random Forest (자동으로 특성 중요도 계산)
model = RandomForestClassifier(n_estimators=100)
고차원 데이터 (특성 수 > 샘플 수)
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
# 정규화가 필수
model = LogisticRegression(penalty='l2', C=0.1)
# 또는
model = SVC(kernel='linear', C=0.1)
3. 해석 가능성 요구사항
해석 가능성이 중요한 경우
의료, 금융, 법률 등에서 모델의 결정 과정을 설명해야 하는 경우:
# 1. Linear/Logistic Regression - 계수로 영향도 파악
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
# 특성 중요도 확인
feature_importance = abs(model.coef_[0])
# 2. Decision Tree - 시각화 가능
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
model = DecisionTreeClassifier(max_depth=3)
model.fit(X_train, y_train)
plt.figure(figsize=(20, 10))
plot_tree(model, filled=True)
plt.show()
# 3. Random Forest - 특성 중요도 제공
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
feature_importance = model.feature_importances_
해석 가능성이 덜 중요한 경우
성능이 최우선인 경우:
# 1. Gradient Boosting - 최고 성능 중 하나
from sklearn.ensemble import GradientBoostingClassifier
model = GradientBoostingClassifier(n_estimators=200, learning_rate=0.1)
# 2. XGBoost (별도 설치 필요)
# pip install xgboost
from xgboost import XGBClassifier
model = XGBClassifier(n_estimators=200, learning_rate=0.1)
# 3. Neural Network (복잡한 패턴 학습)
from sklearn.neural_network import MLPClassifier
model = MLPClassifier(hidden_layer_sizes=(100, 50), max_iter=500)
4. 성능 vs 속도 트레이드오프
빠른 학습이 필요한 경우
# 1. Linear/Logistic Regression - 매우 빠름
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
# 2. Naive Bayes - 매우 빠름
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
# 3. Decision Tree - 상대적으로 빠름
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth=5)
높은 성능이 필요한 경우
# 1. Gradient Boosting - 높은 성능, 상대적으로 느림
from sklearn.ensemble import GradientBoostingClassifier
model = GradientBoostingClassifier(n_estimators=200)
# 2. Random Forest - 좋은 성능, 병렬 처리 가능
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=200, n_jobs=-1)
# 3. SVM - 복잡한 패턴, 느릴 수 있음
from sklearn.svm import SVC
model = SVC(kernel='rbf', probability=True)
5. 주요 모델 비교표
| 모델 | 학습 속도 | 예측 속도 | 해석 가능성 | 성능 | 메모리 사용량 |
|---|---|---|---|---|---|
| Linear/Logistic Regression | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Decision Tree | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| Random Forest | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Gradient Boosting | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| SVM | ⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
| KNN | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| Neural Network | ⭐⭐ | ⭐⭐⭐⭐ | ⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ |
6. 모델 선택 의사결정 트리
분류 문제
데이터 크기 확인
│
├─ 작은 데이터 (< 10K)
│ ├─ 해석 필요? → Decision Tree / Logistic Regression
│ └─ 성능 우선? → Random Forest / SVM
│
├─ 중간 데이터 (10K ~ 100K)
│ ├─ 해석 필요? → Gradient Boosting / Random Forest
│ └─ 성능 우선? → Gradient Boosting / XGBoost
│
└─ 큰 데이터 (> 100K)
├─ 선형 관계? → Logistic Regression / SGD
└─ 비선형 관계? → Random Forest / Gradient Boosting
회귀 문제
데이터 특성 확인
│
├─ 선형 관계 예상
│ ├─ 과적합 우려? → Ridge Regression
│ ├─ 특성 선택 필요? → Lasso Regression
│ └─ 기본? → Linear Regression
│
└─ 비선형 관계 예상
├─ 해석 필요? → Decision Tree / Random Forest
└─ 성능 우선? → Gradient Boosting / XGBoost
7. 실전 모델 선택 예시
예시 1: 타이타닉 생존 예측 (분류, 작은 데이터, 해석 필요)
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
# 해석 가능성과 성능의 균형
model = RandomForestClassifier(
n_estimators=100,
max_depth=5,
random_state=42
)
# 또는 더 해석 가능한 모델
model = DecisionTreeClassifier(
max_depth=4,
random_state=42
)
예시 2: 주택 가격 예측 (회귀, 중간 데이터, 성능 우선)
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import RandomForestRegressor
# 높은 성능
model = GradientBoostingRegressor(
n_estimators=200,
learning_rate=0.1,
max_depth=5,
random_state=42
)
# 또는 빠른 학습
model = RandomForestRegressor(
n_estimators=100,
random_state=42
)
예시 3: 이미지 분류 (분류, 큰 데이터, 성능 우선)
# 전통적인 ML 모델보다는 딥러닝 권장
# 하지만 sklearn으로는:
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
# 특성 추출 후 사용
model = RandomForestClassifier(
n_estimators=200,
n_jobs=-1,
random_state=42
)
8. 모델 비교 및 선택 실습
여러 모델을 비교하여 최적의 모델을 선택하는 방법:
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
# 여러 모델 정의
models = {
'Logistic Regression': LogisticRegression(max_iter=1000, random_state=42),
'Decision Tree': DecisionTreeClassifier(max_depth=5, random_state=42),
'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42),
'Gradient Boosting': GradientBoostingClassifier(n_estimators=100, random_state=42),
'SVM': SVC(random_state=42),
'KNN': KNeighborsClassifier(n_neighbors=5)
}
# 각 모델의 성능 비교
results = {}
for name, model in models.items():
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
results[name] = {
'mean': scores.mean(),
'std': scores.std()
}
print(f"{name}: {scores.mean():.4f} (+/- {scores.std()*2:.4f})")
# 최고 성능 모델 선택
best_model_name = max(results, key=lambda x: results[x]['mean'])
print(f"\n최고 성능 모델: {best_model_name}")
9. 모델 선택 체크리스트
모델을 선택하기 전에 다음 질문들에 답해보자:
-
✅ 문제 유형은 무엇인가?
- 분류 (Classification)
- 회귀 (Regression)
-
✅ 데이터 크기는?
- 작음 (< 10,000 샘플)
- 중간 (10,000 ~ 100,000 샘플)
- 큼 (> 100,000 샘플)
-
✅ 특성 수는?
- 적음 (< 20)
- 중간 (20 ~ 100)
- 많음 (> 100)
-
✅ 해석 가능성이 필요한가?
- 예 → Linear/Logistic Regression, Decision Tree
- 아니오 → Gradient Boosting, XGBoost
-
✅ 학습 속도가 중요한가?
- 예 → Linear/Logistic Regression, Naive Bayes
- 아니오 → Gradient Boosting, SVM
-
✅ 데이터의 관계는?
- 선형 → Linear/Logistic Regression
- 비선형 → Tree-based, SVM, Neural Network
-
✅ 과적합 우려가 있는가?
- 예 → 정규화 (Ridge, Lasso), 앙상블 (Random Forest)
- 아니오 → 기본 모델 사용
10. 일반적인 권장사항
시작점으로 좋은 모델들
- 분류 문제: Random Forest 또는 Logistic Regression
- 회귀 문제: Random Forest Regressor 또는 Linear Regression
- 해석 필요: Decision Tree 또는 Logistic Regression
- 최고 성능: Gradient Boosting 또는 XGBoost
모델 선택 전략
- 베이스라인 모델부터 시작: Logistic Regression (분류) 또는 Linear Regression (회귀)
- 여러 모델 비교: Cross-validation으로 성능 비교
- 하이퍼파라미터 튜닝: GridSearchCV 또는 RandomSearchCV 사용
- 앙상블 고려: 단일 모델보다 앙상블이 보통 더 좋은 성능
주의사항
- 과적합 주의: 복잡한 모델은 작은 데이터에서 과적합되기 쉽다
- 데이터 품질: 좋은 데이터가 좋은 모델보다 중요하다
- 반복적 개선: 한 번에 완벽한 모델을 찾으려 하지 말고, 점진적으로 개선한다
결론
적절한 모델을 선택하는 것은 데이터와 문제의 특성을 깊이 이해하는 것에서 시작한다. 위의 가이드를 참고하되, 실제로는 여러 모델을 시도해보고 비교하는 것이 가장 좋은 방법이다.
기억하자: "모든 모델은 틀렸지만, 일부는 유용하다" (All models are wrong, but some are useful) - George Box