과적합(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
X = dataset[:, 0:60]
Y_obj = dataset[:, 60]
#문자열 변환
e = LabelEncoder()
e.fit(Y_obj)
Y = 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%로
광석과 돌을 구분해는데 성공했음을 확인
할 수 있다.
더 읽을거리
'Programming > MachineLearning' 카테고리의 다른 글
딥러닝 수치를 예측해보자 (feat 선형 회귀 분석) (0) | 2021.12.16 |
---|---|
딥러닝 최적의 모델결과 뽑아내기 (feat 와인 데이터) (0) | 2021.12.16 |
딥러닝 데이터가 부족할 때 해결하는 방법 K겹 교차 검증이란? (feat 광석 돌 구분 예제 사용) (0) | 2021.12.16 |
딥러닝 다중 분류 모델 Multi Classfication 설계하기 (feat 아이리스 품종 분류하는 모델 설계하기) (0) | 2021.12.16 |
딥러닝 실제 모델 만드는 방법 딥러닝 코드 구현해보기 이항 분류 keras 모듈 이용하기 (feat 인디언 당뇨병 문제) (0) | 2021.12.15 |
딥러닝 오차 역전파 10분만에 이해하기 (0) | 2021.12.15 |
댓글