728x90
머신러닝 복습
K-Fold Cross Validation(교차 검증)
- 머신러닝 모델의 성능을 평가하는 방법 중 하나
- 데이터를 여러 개로 나눈 뒤, 각각의 나눈 것들을 사용하여 모델을 학습하고 나머지로 모델을 검증하는 과정을 반복하는 것
- 과소적합 문제 방지 가능
- 좀 더 일반화된 모델을 만들 수 있음
- 반복 횟수가 많아서 모델 학습과 평가에 많은 시간이 소요된다는 단점
K-분할 교차 검증 사용 방법
# 1단계: 불러오기
from sklearn.tree import DecisionTreeClassifier # KNN, Logistic
from sklearn.model_selection import cross_val_score
# 2단계: 선언하기
model = DecisionTreeClassifier(max_depth=3)
# 3단계: 검증하기
cv_score = cross_val_score(model, x_train, y_train, cv=10) # 기본 분할 개수(cv) 5
# 확인
print(cv_score)
print(cv_score.mean())
# 기록
result = {}
result['Decision Tree'] = cv_score.mean()
# result['KNN'] = cv_score.mean()
# result['Logistic Regression'] = cv_score.mean()
- cross_val_score(모델, x_train, y_train, 분할 개수)
알고리즘 별 성능비교
plt.figure(figsize=(5, 5))
plt.barh(y=list(result), width=result.values())
plt.xlabel('Score')
plt.ylabel('Model')
plt.show()
Hyperparameter 튜닝
1. Hyperparameter
- 알고리즘을 사용해 모델링할 때 모델성능을 최적화하기 위해 조절할 수 있는 매개변수
- ex) KNN - n_neighbors, Decision Tree - max_depth
K-Nearest Neighbor
- k 값 (n_neighbors) 이 가장 클 때(=전체데이터개수) 가장 단순 모델 → 평균, 최빈값
- k 값이 작을 수록 복잡한 모델이 됨
Decision Tree
max_depth | 트리의 최대 깊이를 지정(기본값: None) 이 값이 작을 수록 모델이 단순해 짐 |
min_samples_split | 분할을 위해 노드에 필요한 최소 샘플 수를 지정(기본값: 2) 이 값이 클 수록 모델이 단순해 짐 |
min_samples_leaf | 리프노드가 되기 위한 최소한의 샘플 수를 지정(기본값: 1) 이 값이 클 수록 모델이 단순해 짐 |
2. Random Search, Grid Search
Grid Search
- 파라미터 값 범위(딕셔너리형태) 를 모두 사용해서 가능한 모든 조합을 시도하여 최적의 조합을 찾는 방법
# 1단계: 불러오기
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.metrics import mean_absolute_error, r2_score
# 2단계: 선언하기
model_dt = DecisionTreeRegressor(random_state=1)
# 3단계: 검증하기
cv_score = cross_val_score(model_dt, x_train, y_train, cv=5)
# 확인
print(cv_score)
print(cv_score.mean())
모델 튜닝
# 파라미터 선언
# max_depth: 1~50
param = {'max_depth' : range(1, 51)}
# 선언하기
model_dt = DecisionTreeRegressor(random_state=2022)
# Grid Search 선언
# cv=5
# scoring='r2'
model = GridSearchCV(model_dt, # 기본 모델 이름
param, # 앞에서 선언한 튜닝용 파라미터 변수
cv=5, # k-Fold Cross Validation (default=5)
scoring='r2') # 평가 방법
# 학습하기
model.fit(x_train, y_train)
결과(중요 정보) 확인
print(model.cv_results_['mean_test_score'])
print('최적파라미터:', model.best_params_)
print('최고성능:', model.best_score_)
Random Search
- 파라미터 값 범위(딕셔너리형태)에서 무작위로 조합된 하이퍼파라미터를 사용하여 모델을 여러 번 학습하고 검증하는 방법
# 불러오기
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import RandomizedSearchCV, cross_val_score
from sklearn.metrics import mean_absolute_error, r2_score
# 선언하기
model_dt = DecisionTreeRegressor()
# 성능예측
cv_score = cross_val_score(model_dt, x_train, y_train)
# 결과확인
print(cv_score)
print(cv_score.mean())
모델 튜닝
# 파라미터 선언
# max_depth: 1~50
param = {'max_depth': range(1, 51)}
# Random Search 선언
# cv=5
# n_iter=20
# scoring='r2'
model = RandomizedSearchCV(model_dt, # 기본 모델 이름
param, # 앞에서 선언한 튜닝용 파라미터 변수
cv=5, # k-Fold Cross Validation (default=5)
n_iter=20, # Random하게 시도할 횟수 (default=10)
scoring='r2') # 평가 방법
# 학습하기
model.fit(x_train, y_train)
결과(중요 정보) 확인
print(model.cv_results_['mean_test_score'])
print('최적파라미터:', model.best_params_)
print('최고성능:', model.best_score_)
- Grid Search, Random Search를 사용할 때 내부적인 K-Fold Cross Validation을 위해 cv 값을 지정하므로 실제 수행되는 횟수는 파라미터 조합 수 * cv 값이 됨
- 일반적으로는 먼저 Random Search를 사용하여 대략적인 하이퍼파라미터 공간을 탐색하고, 그 후에 Grid Search를 사용하여 더 세밀하게 탐색하는 것이 효율적인 방법일 수 있음
앙상블(Ensemble)
- 여러 개의 예측 모델을 결합하여 더 나은 성능을 얻는 머신러닝 방법
- 보팅, 배깅, 부스팅, 스태킹 등
보팅(Voting)
- 여러 모델들의 예측 결과를 투표를 통해 최종 예측 결과를 결정하는 방법
- 다른 유형의 알고리즘 기반 모델들을 사용
배깅(Bagging)
- 데이터로부터 부트스트랩 한 데이터로 모델들을 학습시킨 후, 모델들의 예측 결과를 집계해 최종 결과를 얻는 방법
- 같은 유형의 알고리즘 기반 모델들을 사용
- ex) 랜덤 포레스트(Random Forest): 여러 개의 의사 결정 트리(Decision Tree)를 생성하여 예측을 결합하는 방법
랜덤 포레스트
- 여러 개의 의사 결정 트리(Decision Tree)를 사용하여 분류 또는 회귀 문제를 다루는 배깅의 대표적인 알고리즘
- 대부분 Decision Tree와 같은 하이퍼파라미터를 가짐
랜덤 포레스트 분류모델 구현
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import *
# 선언하기
model = RandomForestClassifier(max_depth = 5, n_estimators = 100)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
부스팅(Boosting)
- 같은 유형의 알고리즘 기반 모델 여러 개에 대해 순차적으로 학습을 수
- 예측하지 못한 데이터(오차)에 가중치를 부여하여 이전 모델이 놓친 샘플에 집중하고, 순차적으로 모델을 학습시켜 성능을 향상
- 배깅에 비해 성능이 좋지만, 속도가 느리고 과적합 발생 가능성 존재
- ex) XGBoost, LightGBM
XGBoost 분류모델 구현
from xgboost import XGBClassifier
# 선언하기
model = XGBClassifier(max_depth=5, random_state=1)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
LightGBM
from lightgbm import LGBMClassifier
# 선언하기
model = LGBMClassifier(max_depth=5, random_state=1, verbose=-100)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
스태킹
- 여러 모델의 예측 값을 최종 모델의 학습 데이터로 사용하여 예측하는 방법
# 라이브러리 불러오기
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.metrics import *
model = RandomForestClassifier(max_depth = 5, n_estimators = 100) # XGBClassifier, LGBMClassifier
Feature 중요도 시각화
plt.barh(y= list(x), width = model.feature_importances_)
plt.show()
순서
- 주어진 데이터를 탐색
- 분석에 용이하도록 전처리
- 여러 알고리즘의 성능을 비교
- 가장 성능이 좋은 알고리즘을 선택
- 하이퍼파라미터 튜닝
- 나름 최선의 모델을 완성
- 새로운 데이터에 대해 예측하고 평가
728x90