본문 바로가기
Programming/MachineLearning

딥러닝 데이터가 부족할 때 해결하는 방법 K겹 교차 검증이란? (feat 광석 돌 구분 예제 사용)

by 하하호호 2021. 12. 16.
반응형

 

문제의 발단

 

딥러닝 모델을 학습시키기 위해서는 방대한

양의 데이터셋이 필요하다. 하지만 현실에서

데이터셋을 다량으로 구축하기는 쉽지 않은

일이다. 

 

그럼에도 불구하고 예측정확도가 높은 모델을

만들어야 하는 프로그래머들이 연구한 결과

해결책을 찾았다. 바로 K겹 교차검증이다.

 

K겹 교차검증이란(k-fold cross validation)?

데이터셋을 먼저 여러개로 나눈다. 예들들어

데이터셋을 5개로 구분한다고 하면 80%는

학습 데이터로 사용하고, 나머지 20%는 

테스트셋으로 사용하는 것이다.

 

한번의 학습이 완료되면 다시 데이터셋을

5개로 구분하고 이번에도 다시 학습셋과

테스트셋을 구분한다. 구성만 다르게 해서,

다시 학습을 진행한다. 

 

이 과정이 반복되면, 적은 데이터셋을 가지고도

많은 학습을 진행할 수 있고, 정확도를 올리는데

기여할 수 있게 되는 것이다.

k겹 교차검증

 

실제 예제로 k겹 교차검증을 구현하는 방법을

알아본다.

 

기본 코드는 이전글의 코드와 동일하다. 

이전글을 참고하면 코드에 대한 이해도를 올릴 

수 있다.

 

참고글

 

딥러닝 과적합 문제 해결하기(feat 광석 판별하기)

과적합(Overfitting)이란? 과적합은 특정 모델이 학습 데이터셋 안에서는 일정 수준 이상의 예측 정확도를 보이지만, 새로운 데이터를 적용 하면 정확도를 높이지 못하는 현상을 의미한다. 과적합

incomeplus.tistory.com

 

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
= dataset[:, 0:60]
Y_obj = dataset[:, 60]
 
#문자열 변환
= LabelEncoder()
e.fit(Y_obj)
= 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

 

더 읽을거리

 

 

딥러닝 머신러닝 차이, 머신러닝 딥러닝

머신러닝 딥러닝 차이 알파고가 대한민국을 초토화 시킨지 5년이 지났다. 실생활에도 인공지능이 많이 들어 왔고, 무수히 쌓여가는 데이터들을 기반으로 한 새로운 사업들이 계속 등장하고 있

incomeplus.tistory.com

 

 

딥러닝의 층 구조 딥러닝을 배워보자

더보기 딥러닝 기본 구조 신경망 딥러닝의 구조는 크게 3부분으로 나뉘어져 있다. 1. 입력 부분 2. 분석 부분 3. 출력 부분 마지막으로 모델을 만들고 난 후, 컴파일을 하는 부분으로 구성된다. 층

incomeplus.tistory.com

 

 

딥러닝 기본 구조 이해하기 선형회귀 , 평균 제곱근 오차 10분만에 이해하기

딥러닝 기본구조 딥러닝의 근간을 이루는 것은 인공 신경망이라고 불리는 작은 연산장치들의 집합이다. 신경망의 뼈대는 알고리즘에 많은 의존도를 보인다. 그 중 가장 대표적인 것이 선형 회

incomeplus.tistory.com

 

 

 

딥러닝 로지스틱 회귀 알고리즘 10분만에 이해하기

선형회귀분석과 다르게, 참과 거짓만을 분별해야 하는 모델이 필요하다. 우리는 이때 로지스틱 회귀 분석 알고리즘을 이용하게 된다. 로지스틱 회귀 분석 참, 거짓을 구분하는 알고리즘이 로지

incomeplus.tistory.com

 

딥러닝 과적합 문제 해결하기(feat 광석 판별하기)

과적합(Overfitting)이란? 과적합은 특정 모델이 학습 데이터셋 안에서는 일정 수준 이상의 예측 정확도를 보이지만, 새로운 데이터를 적용 하면 정확도를 높이지 못하는 현상을 의미한다. 과적합

incomeplus.tistory.com

 

반응형

댓글