[KT AIVLE] DX트랙 머신러닝(7주차) 복습(K-Fold Cross Validation, Hyperparameter 튜닝, 앙상블)

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()

 

순서

  1. 주어진 데이터를 탐색
  2. 분석에 용이하도록 전처리
  3. 여러 알고리즘의 성능을 비교
  4. 가장 성능이 좋은 알고리즘을 선택
  5. 하이퍼파라미터 튜닝
  6. 나름 최선의 모델을 완성
  7. 새로운 데이터에 대해 예측하고 평가

 

728x90