문제의 발단
딥러닝 모델을 학습시키기 위해서는 방대한
양의 데이터셋이 필요하다. 하지만 현실에서
데이터셋을 다량으로 구축하기는 쉽지 않은
일이다.
그럼에도 불구하고 예측정확도가 높은 모델을
만들어야 하는 프로그래머들이 연구한 결과
해결책을 찾았다. 바로 K겹 교차검증이다.
K겹 교차검증이란(k-fold cross validation)?
데이터셋을 먼저 여러개로 나눈다. 예들들어
데이터셋을 5개로 구분한다고 하면 80%는
학습 데이터로 사용하고, 나머지 20%는
테스트셋으로 사용하는 것이다.
한번의 학습이 완료되면 다시 데이터셋을
5개로 구분하고 이번에도 다시 학습셋과
테스트셋을 구분한다. 구성만 다르게 해서,
다시 학습을 진행한다.
이 과정이 반복되면, 적은 데이터셋을 가지고도
많은 학습을 진행할 수 있고, 정확도를 올리는데
기여할 수 있게 되는 것이다.
실제 예제로 k겹 교차검증을 구현하는 방법을
알아본다.
기본 코드는 이전글의 코드와 동일하다.
이전글을 참고하면 코드에 대한 이해도를 올릴
수 있다.
참고글
k겹 교차검증을 하기 위해서는 사이킷런 라이브러리의
stratifiedKFold()함수를 사용한다. 데이터셋을 쪼갤
n_fold를 먼저 정의한다. 아래 예제에서는 10개로
데이터셋을 구분해서 학습을 진행한다.
데이터의 관련성을 제거하기 위해 seed값을 인자로 받고,
shuffle 모드를 작동하면 데이터를 랜덤리하게 받아온다.
모델설정, 컴파일, 학습은 skf.split()함수를 사용한다.
skf.split()함수는 train, test 데이터셋을 구분해서 반환
한다.
반환된 train, test 데이터를 for문으로 돌리면서
모델을 생성하고 실행하고 학습을 진행하면 된다.
최종적으로 출력값은 accrucay 리스트에 담아서
한번에 출력한다. 10개의 출력값이 나오는 것을
확인할 수 있다.
확실히 한번의 학습을 진행하는 것보다 다수의
학습을 진행하고 테스트까지 진행하면서 모델의
정확도를 올리고 오차를 줄일 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
from keras.models import Sequential
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
import pandas as pd
import numpy
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
# seed 값 설정
seed = 0
numpy.random.seed(seed)
tf.compat.v1.set_random_seed(seed)
#데이터 입력
df = pd.read_csv('./dataset/sonar.csv')
dataset = df.values
X = dataset[:, 0:60]
Y_obj = dataset[:, 60]
#문자열 변환
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
# 10개의 파일로 쪼갬
n_fold = 10
skf = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=seed)
# 빈 accuracy 배열
accuracy = []
# 모델 설정
for train, test in skf.split(X, Y):
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
#모델 컴파일
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['accuracy'])
# 모델 실행
model.fit(X[train], Y[train], epochs=200, batch_size=5)
k_accuracy = "%.4f" %(model.evaluate(X[train], Y[train])[1])
accuracy.append(k_accuracy)
#결과 출력
print("\n %.f fold accuracy : " %(n_fold), accuracy)
|
cs |
더 읽을거리
'Programming > MachineLearning' 카테고리의 다른 글
딥러닝 손글씨 예측 모델 만들어보기 (feat 데이터정규화) (0) | 2021.12.16 |
---|---|
딥러닝 수치를 예측해보자 (feat 선형 회귀 분석) (0) | 2021.12.16 |
딥러닝 최적의 모델결과 뽑아내기 (feat 와인 데이터) (0) | 2021.12.16 |
딥러닝 과적합 문제 해결하기(feat 광석 판별하기) (0) | 2021.12.16 |
딥러닝 다중 분류 모델 Multi Classfication 설계하기 (feat 아이리스 품종 분류하는 모델 설계하기) (0) | 2021.12.16 |
딥러닝 실제 모델 만드는 방법 딥러닝 코드 구현해보기 이항 분류 keras 모듈 이용하기 (feat 인디언 당뇨병 문제) (0) | 2021.12.15 |
댓글