[머신러닝] K-Fold Cross Validataion, GridSearch, RandomSearch

syEON·2023년 8월 31일
0
post-thumbnail

성능예측

🌈 K-Fold Cross Validaton (K분할 교차 검증)

모델을 만든 후 바로 테스트 데이터로 평가하기 전에 여러 번의 검증 과정을 거치고 싶다면 K분할 교차 검증을 사용한다. 모델의 성능을 높이는 것과는 무관하며 단순히 검증해보는 것이다.

검증과정에서 Split으로 K번 나눈 데이터가 1번씩 평가에 사용하고 학습에 k-1번 사용된다.
K개의 평균과 표준편차가 나오면 성능을 일반화해볼 수 있다.

알아두자
K는 2이상 되어야 평가와 검증으로 나눌 수 있다!
Test data는 건들지 않고 Training data인 흔히 x_train, y_train만 가지고 분리해서 사용한다. 따라서 Training data전부를 가지고 모델을 만든 것이 아님으로 성능예측으로만 사용하고 실제 모델링은 다시 수행한다!

사용방법
cross_val_score() 옵션 2가지
cv : (default) 5 / train데이터를 5등분하여 5번 교차검증 수행
scoring : 성능평가모델


예시1. DecisionTreeClassifier사용한 k분할 교차 검증 사용 _분류모델

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score

model = DecisionTreeClassifier(max_depth=3) #내부적으로 model이 fit이 되는데, 전체 train데이터로 fitting되는 것이 아니기 때문에 실제 모델링을 할 때는 사용하지 않는다. 
cv_score = cross_val_score(model, x_train, y_train, cv=10, , scoring='accuracy') # 분류모델은 scoring을 명시하지 않으면 기본적으로 accuracy이다. precision(정밀도)로 바꾸면 결과값이 달라짐을 볼수 있다.

# 확인
print(cv_score) 
print(cv_score.mean())

예시2. DecisionTreeRegressor 사용한 k분할 교차 검증 사용 _회귀모델
# 불러오기
from sklearn.tree import DecisionTreeRegressor

# 선언하기
model = DecisionTreeRegressor(random_sate=1, max_depth=5)

# 검증하기
cv = cross_val_score(model, x_train, y_train, cv=10)

# 확인
print(cv)
print(cv.std(), cv.mean())
result['DecisionTree'] = cv.mean()

<결론>
여러가지 적합하다고 생각되는 알고리즘 모델을 각각 교차검증으로 수행해보면서 평균적으로 가장 성능이 좋은 알고리즘을 찾는다. 그 후 아래 gird search나 random search를 통해 하이퍼파라미터를 조절하면서 성능튜닝한다.


성능튜닝

지난번 Logistic Regression | K-Nearest Neighbor | Decision Tree | Logistic Regression 와 같은 알고리즘을 알아보면서 하이퍼파라미터를 임의로 설정하여 모델을 만들었다. 최적의 하이퍼파라미터를 찾기위해서 random search와 grid search에 대해 알아보자. 둘은 찾는 방법이 다르다.

라이브러리: GridSearchCV in model.selection

진행순서
① 성능을 테스트할 파라미터 값의 범위를 지정(딕셔너리 형태)
② 위 파라미터 값 범위를 모두 사용하는 Grid Search 모델 선언 후 학습
③ 학습 데이터에 대해 가장 좋은 성능을 보인 파라미터 값으로 자동으로 학습함.
④ 이후 예측 및 평가 과정을 바로 진행하면 됨

단점: 모든 경우의 수를 다 수행함으로 시간이 오래 소요됨으로 부담이 크다. 따라서 진행순서 2번의 파라미터 설정을 조절하여 진행한다.

예시1. 교차검증으로 KNeighborsClassifier가 가장 적합하다는 판단하에 성능튜닝을 해본 코드이다.

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

# 파라미터 선언
param = {'n_neighbors': range(1, 500, 10), 'metric': ['euclidean', 'manhattan']}

# 기본모델 선언
knn_model = KNeighborsClassifier()

# Grid Search 선언
model = GridSearchCV(knn_model, param, cv=3)

# 학습하기, 최적의 성능 모델 만들어진다 (데이터에 따라 오랜 수행하는데 오래 걸림)
model.fit(x_train, y_train)

##결과확인 (모델 정보 확인)
#수행정보
model.cv_results_  
# 최적 파라미터
model.best_params_
# 최고 성능
model.best_score_
#변수 중요도 확인 
model.best_estimator_.feature_importances_

#최종 test데이터 셋으로 성능평가
y_pred = model.predict(x_test)

라이브러리: RandomizedSearchCV in model.selection

진행순서
① 성능을 테스트할 파라미터 값의 범위를 지정(딕셔너리 형태)
② 위 파라미터 값 범위에서 몇 개 선택할 지 정하여 Random Search 모델 선언 후 학습.
(실제 모델이 수행되는 횟수는 n_iter * cv값)
③ 학습 데이터에 대해 가장 좋은 성능을 보인 파라미터 값으로 자동으로 학습함
④ 이후 예측 및 평가 과정을 바로 진행하면 됨

단점: 랜덤으로 뽑기 때문에 뽑히지 않은 조합에 대한 미련이 남아있다.

RandomizedSearchCV 속성
n_iter: param으로 설정된 범위내에서 수행할 조합의 갯수 (랜덤으로 추출)

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import RandomizedSearchCV

#파라미터 선언
param = {'n_neighbors': range(1, 500, 10), 
'metric': ['euclidean', 'manhattan']}

# 기본모델 선언
knn_model = KNeighborsClassifier()

# Random Search 선언
model = RandomizedSearchCV(knn_model, #기본 모델
param, #파라미터 변수
cv=3,  #K-Fold 분할 개수(기본값=5)
n_iter=20) #시도 횟수(기본값=10)

# 학습하기, 최적의 성능 모델 만들어진다
model.fit(x_train, y_train)

##결과확인 (모델 정보 확인)
#수행정보
model.cv_results_  
# 최적 파라미터
model.best_params_
# 최고 성능
model.best_score_
#변수 중요도 확인 
model.best_estimator_.feature_importances_

#최종 test데이터 셋으로 성능평가
y_pred = model.predict(x_test)

0개의 댓글