본문 바로가기
Programming/MachineLearning

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

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

 

과적합(Overfitting)이란?

과적합은 특정 모델이 학습 데이터셋 안에서는 일정 수준

이상의 예측 정확도를 보이지만, 새로운 데이터를 적용

하면 정확도를 높이지 못하는 현상을 의미한다.

 

과적합이 발생하는 이유?

모델 내에 층이 너무 많이 쌓이게 되거나, 변수가 복잡하면

과적합이 발생한다. 또한 테스트셋과 학습셋이 중복되면,

과적합이 발생한다. 

 

딥러닝 모델에서는 입력층, 은닉층, 출력층에 상당히 많은

노드들이 중첩되기 때문에 과적합 문제에 빠지기가 쉽다.

 

과적합 문제를 해결하는 방법

과적합에 빠지지 않고, 정확한 예측 모델을 만들기 위해서는

학습 데이터와 테스트 데이터를 완전히 분리하는 것이 방법이

된다.

 

예를 들어 100개의 데이터를 샘플로 가지고 있는 데이터셋이라면,

70개는 학습셋으로 사용하고, 나머지 30개는 테스트셋으로 분류해서

모델을 학습시키는 것이다.

 

학습셋과 에포크(epocs) 그리고 은닉층을

무한히 늘린다고 해서 모델의 정확도를 보장

하는 것은 아니다. 우리가 해야 할 일은

학습셋의 예측률을 올리되 테스트셋에서의

예측률을 개선하는 것이다. 

 

실전 코드

 

먼저 모델링에 필요한 라이브러리들을 호출한다.

1
2
3
4
5
6
7
8
9
from keras.models import Sequential
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
 
import pandas as pd
import numpy
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
cs

 

넘파이와 tensorflow에 동일한 랜덤테이블을 

적용하기 위해 seed값을 설정한다.

 

광물 데이터를 호출한다.

데이터셋은 60개의 속성과 한개의 클래스로

구분된다. X값과 Y값을 분류해준다.

 

광물 데이터의 출력값이 문자열이기 때문에,

이를 구분할 수 있는 숫자 형태로 변환해준다.

 

데이터셋의 결과는 광물 vs 돌 두개의 값을

비교한다. LabelEncoder() 함수를 사용해서

1과 0의 값으로 바꿔서 출력값을 얻는다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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)
cs

 

이제 과적합(Overfitting) 문제를 해결하기 위해

학습셋과 테스트셋을 구분한다. 사이킷런 라이브

러리를 사용해서 train_test_split() 함수를 호출

한다. 인자로는 입력값 ,출력값, 사이즈, 랜덤여부를

입력한다.

 

만약 test_size를 0.3으로 지정하면 학습셋을 70%,

테스트셋을 30%로 조정해서 모델을 학습시킨다는

말이다.

 

1
2
# 학습셋과 테스트셋을 구분함
X_train, X_test, Y_train, Y_test = train_test_split(X,Y,test_size=0.3, random_state=seed)
cs

 

모델을 생성한다.

24개의 노드와 60개의 입력값을 가진 입력층+은닉층을

생성한다. 활성화함수는 ReLU를 사용한다. 입력층은

입력층과 은닉층의 두개의 역할을 동시에 겸한다.

 

10개의 노드와 활성화함수 ReLU를 사용하는 은닉층을

설계한다.

 

마지막으로 출력층에서는 1개의 출력값을 가짐과 동시에,

이항 판별 모델이기 때문에, Sigmoid 함수를 활성화 함수로

사용한다.

 

모델 컴파일을 진행한다.

오차함수로는 평균제곱근 함수를 사용한다.

최적화 함수로는 Adam을 사용한다. 가중치와 바이어스를

자동으로 조절해주고 모멘텀, SGD를 합친 강력한 최적화

함수다.

 

모델을 실행한다.

에포크는 200번을 실행하고, 한번에 들어가는 샘플데이터는

5개로 한정한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
# 모델 설정
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)
cs

 

모델링의 결과값을 출력해본다.

모델 결과값 출력은 model.evaluate()함수를 사용한다.

인자로는 위에서 구분한 테스트셋을 추가해준다. 결과값을

확인하면 model.evaluate()함수는 리스트 형식의 데이터를

반환한다.

 

첫번째 요소는 오차를, 두번째 요소는 정확도를 표시한다.

정확도를 보기위해서 두번째 요소를 출력한다.

1
2
# 결과를 출력한다.
print("\n Accuracy : ", model.evaluate(X_test, Y_test)[1])
cs

결과값을 확인해보니, 정확도가 85.71%로

광석과 돌을 구분해는데 성공했음을 확인

할 수 있다.

 

 

더 읽을거리

 

 

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

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

incomeplus.tistory.com

 

 

딥러닝 다중 분류 모델 Multi Classfication 설계하기 (feat 아이리스 품종 분류하는 모델 설계하기)

다중 분류 문제 0과 1 결과값 중 하나를 선택하는 문제가 아닌, 3개 이상의 결과값을 예측하는 모델을 다중 분류(Mulit Classification)이라 한다. 원-핫 코딩(one-hot-coding) 결과값에 문자열이 포함되어

incomeplus.tistory.com

 

 

딥러닝 실제 모델 만드는 방법 딥러닝 코드 구현해보기 이항 분류 keras 모듈 이용하기 (feat 인디

1. 데이터 : 피마 인디언 당뇨병 발생 유무 2. 문제형태 : 이항분류(Binary Classification) 3. 코드 구현 keras 모듈을 호출한다. tf.compat.v1.disable_eager_execution()는 tensorflow 버전 호환 문제를 해결..

incomeplus.tistory.com

 

 

딥러닝 오차 역전파 10분만에 이해하기

딥러닝 오차 역전파 딥러닝은 학습데이터를 가지고 예측결과를 추론하는 알고리즘이다. 입력값은 기울기 a와 절편 b값이다. 딥러닝은 실제데이터와 차이는 부분을 오차로 규정하고, 가중치와

incomeplus.tistory.com

 

 

딥러닝 핵심 개념 신경망 10분만에 이해하기

인간의 신경망 작동 인간의 뇌는 약 1000억개의 뉴런으로 구성된다. 뉴런 사이에는 시냅스라는 연결부위가 존재한다. 신경 말단에서 자극을 받으면 시냅스에서 화학물질이 분비되고, 전위 변화

incomeplus.tistory.com

 

반응형

댓글