운동하는 공대생
[Data Preprocessing] 교차검증(K-Fold, Stratified K-Fold, GridSearchCV) 본문
[Data Preprocessing] 교차검증(K-Fold, Stratified K-Fold, GridSearchCV)
운동하는 공대생 2022. 12. 28. 09:41교차 검증
모델을 학습하면서 교차 검증을 하는 이유는 무엇일까. 이유는 바로 과적합(Overfitting)의 문제를 보안하기 위해서 이다. 과적합 문제는 모델학습 과정에서 항상 주의를 해야 하는 문제로 훈련 데이터에만 모델이 치중하여 학습을 하면 실제 데이터를 가지고 예측을 하였을 때 성능이 떨어지는 문제를 말한다.
그렇다면 교차 검증 방식은 어떻게 작용할까?
교차 검증 방식은 데이터 편중을 막기 위해서 학습 데이터 세트를 가지고 학습 데이터와 검증 데이터 세트를 또한번 나눠서 실제 학습을 하기 이전에 1차 평가를 하는 방식이다. 그렇게 된다면 최종 학습을 하기 위해서 모델의 최적화를 학습 이전에 가능하다.
K-Fold
K-Fold 교차 검증 방식은 가장 보편적으로 사용되는 교차 검증 기법이다. K-Fold 교차 검증 방식은 학습 데이터 세트를 K개로 나누고 K번만큼 각 폴트 세트에 학습과 검증을 반복적으로 진행하는 방식이다.

k-fold 방식은 그림 1 에서 처럼 데이터 세트를 검증 세트(파란색) 학습 세트(회색)로 나눠서 학습과 검증을 반복적으로 진행하고 그 결과에 대한 평가의 편균 치를 가지고 모델을 최적화를 진행하는 프로세스를 가지고 있다.
구현 코드
from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import numpy as np
iris=load_iris()
features=iris.data
label=iris.target
model=DecisiontressClassifier()
# 데이터 세트를 총 5개로 분리하는 K-Fold 객체와 폴드 세트별 정확도를 담을 리스트 객체 생성
kfold=KFold(n_split=5)
cv_accuracy=[]
n_iter=0
for train_index, test_index in kfold.split(features):#모델 학습 데이터
X_train, X_test= features[train_index],features[test_index] #데이터의 학습 세트를 분리
y_train, y_test= label[train_index], label[test_index] #데이터의 검증 세트를 분리
model.fit(X_train,y_train)
pred=model.predict(x_test)
n_iter +=1
accuracy=np.round(accuracy_score(y_test,pred),4)
cv_accuracy.append(accuracy)
print('모델 평균 검증 정확도',np.mean(cv_accuracy))
Stratified K-Fold
Stratified K-Fold 는 불균형한 분포도를 가진 레이블 데이터 집합을 위한 방식이다. 불균형한 분포도는 예를 들자면 대출 사기 데이터를 예측하는 상황을 예로 들 수 있다. 대출 사기가 1, 정상 대출 0이라고 구성된 데이터가 있다면 대부분 데이터들은 정상 대출 상황이 많을 것이다. 이런 상황의 데이터 세트에서 K-Fold로 단순하게 데이터 세트를 나눈다면 모델의 정확도에 대한 검증을 하기는 어려울 것이다. 그래서 Stratified K-Fold는 타깃으로 하는 데이터를 같이 지정하여 항상 타깃과 학습하려는 데이터의 비율을 맞춰준다.
코드구현
from sklearn.model_selection import StratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import numpy as np
iris=load_iris()
features=iris.data
label=iris.target
model=DecisiontressClassifier()
# 데이터 세트를 총 5개로 분리하는 K-Fold 객체와 폴드 세트별 정확도를 담을 리스트 객체 생성
kfold=StratifiedKFold(n_split=5)
cv_accuracy=[]
n_iter=0
for train_index, test_index in kfold.split(features,label):#모델 학습 데이터
X_train, X_test= features[train_index],features[test_index] #데이터의 학습 세트를 분리
y_train, y_test= label[train_index], label[test_index] #데이터의 검증 세트를 분리
model.fit(X_train,y_train)
pred=model.predict(x_test)
n_iter +=1
accuracy=np.round(accuracy_score(y_test,pred),4)
cv_accuracy.append(accuracy)
print('모델 평균 검증 정확도',np.mean(cv_accuracy))
cross_val_score()
사이킷런 라이브러리에서는 좀 더 편리하게 교차 검증을 수행하기 위해서 API를 제공한다. 그것이 바로 cross_val_score()이다.
from sklearn.model_selection import cross_val_score, cross_validata
#모델,훈련데이터,타겟데이터, 예측 성능 평가 지표 기술, 교차 검증 폴드 수(몇 세트로 나눠서 학습을 하는지)를
#지정하고 API를 호출
scores = cross_val_score(model,data,label,scoring='accuracy',cv=3)
GridSearchCV
이전까지 모델에 대한 정확도를 검증을 했다면 이제 모델을 최적화를 해야 한다. 교차 검증과 그리고 모델의 최적화를 한 번에 수행하는 게 GridSearchCV 방식이다. 이 방식은 모델을 학습하는 파라미터를 조정하는 방식으로 미리 파라미터를 지정을 해주고 학습을 진행한다. 그리고 교차 검증 과정을 진행하면서 최적의 파라미터값을 찾아준다. 하지만 이 방식의 단점을 파라미터를 하나하나 대입하여 학습을 진행하는 방식이라 상대적으로 시간이 많이 걸리는 작업니다.
GridSearchCV 주요 파라미터
- estimator: classifier, regressor, pipeline에 주로 사용
- param_grid: key+리스트 형식의 딕셔너리로 주어진다. 여기서 파라미터를 여기서 추가가 가능
- scoring: 예측 성능을 측정할 평가 방법은 지정
- cv: 교차 검증을 위해 분할되는 학습/테스트 세트의 개수를 지정
- refit:디폴트가 True이며 생성 시 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator 객체를 재학습시킨다.
코드 구현
from sklearn.model_selection import GridSearchCV
grid_parameters = {'max_depth':[1,2,3],'min_samples_split':[2,3]}
grid_model=GridSearchCV(model,param_grid=parameters,cv=3)
grid_model.fit(train_X,test_y)
'Machine Learning' 카테고리의 다른 글
[Clustering]Maximum Likelihood Estimation-최대우도법 (0) | 2023.07.25 |
---|---|
Automated Machine Learning (AutoML) (0) | 2023.05.12 |
Data Preprocessing(데이터 전처리)-Label encoding(레이블 인코딩),One-Hot encoding(원-핫 인코딩) (0) | 2022.11.22 |
Regression(회귀)-다항 회귀와 과적합/과소적합 이해 (0) | 2022.11.15 |
Regression(회귀) - Gradient Descent(경사 하강법) (0) | 2022.11.04 |