본문 바로가기
카테고리 없음

딥러닝(Deep Learning) #11 - 과적합 피하기

by orangecode 2022. 4. 14.
728x90
과적합
# 과적합 피하기
# 라이브러리 설정
from tkinter import Y, Label
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.preprocessing import LabelEncoder

import pandas as pd
import numpy as np
import tensorflow as tf

# seed 설정
seed=0
np.random.seed(seed)
tf.set_random_seed(seed)


# 데이터 확인 및 분석
data = pd.read_csv("C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/sonar.csv", header=None)

dataset = data.values
X = dataset[:, 0:60]
Y_obj = dataset[:, 60]

# 문자열 변환
# 라벨 인코딩 -> 원-핫 인코딩
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)

# 딥러닝 모델 설정
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 딥러닝 모델 컴파일
model.compile(loss="mean_squared_error", optimizer='adam', metrics=['accuracy'])

# 딥러닝 모델 실행
model.fit(X, Y, epochs=200, batch_size = 5)

print("\n Accuracy: %4f" % (model.evaluate(X,Y)[1]))

과적합 Over Fitting

과적합(over fitting)이란 모델이 학습데이터 셋 안에서는 일정 수준 이상의 예측 정확도를 보이지만, 새로운 데이터를 적용할 경우 잘 맞지 않는 상태

 

과적합 발생 요인

- layer 층이 너무 많을 때

- 변수가 복잡할 경우

- 테스트셋, 학습셋 중복일 때

 

과적합 방지 : 학습셋 테스트셋 

출처 :모두의 딥러닝

train_test_split란 학습하는 train dataset과 테스트하는 test dataset을 구분하여 학습과 테스트를 병행하며 진행하는 방법을 말한다.

 

 

출처 : 모두의 딥러닝

학습 데이터셋 만으로 평가한 예측 성공률이 테스트셋에서도 그대로 나타나진 않는다.

 

학습이 깊어져 학습 데이터셋 내부 성공률이 높더라도, 테스트셋에서 효과가 없다면 과적합(overfitting)이 일어나는 것이다.

 

- 단순히 데이터 샘플 데이터를 이용했을 때(train_test_split 사용 x)

- train set, test set 사용했을 때

학습셋의 예측률은 99.04%, 테스트셋 예측률 94.2%로 과적합이 발생했음을 확인할 수 있다.

# 과적합 피하기
# 라이브러리 설정
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

import pandas as pd
import numpy as np
import tensorflow as tf

# seed 설정
seed=0
np.random.seed(seed)
tf.set_random_seed(seed)


# 데이터 확인 및 분석
data = pd.read_csv("C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/sonar.csv", header=None)

dataset = data.values
X = dataset[:, 0:60]
Y_obj = dataset[:, 60]

# 문자열 변환
# 라벨 인코딩 -> 원-핫 인코딩
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)

# train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=seed) # 왜 seed? 초기화? 일정함?


# 딥러닝 모델 설정
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(8, 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=100, batch_size = 5)

print("\n Accuracy: %4f" % (model.evaluate(X,Y)[1]))

 

 

모델저장과 재사용
# 딥러닝 모델 컴파일
model.compile(loss="mean_squared_error", optimizer='adam', metrics=['accuracy'])

# 딥러닝 실행
model.fit(x_train, y_train, epochs=200, batch_size = 5)

# 모델 저장하기
model.save('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/my_model.h5') #모델저장

# 모델 불러오기
del model # 테스트를 위해 메모리 내의 모델 삭제
model = load_model('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/my_model.h5') # 모델 새로 불러오기

from keras.models import load_model : 모델을 저장할 수 있다.

  • model.save() 또는 tf.keras.models.save_model()
  • tf.keras.models.load_model()

 

- model.save() : 딥러닝 모델 저장

- del model : 테스트를 위한 메모리 내 모델 삭제

- model = load_model() : 모델 불러오기

 

print("\n Accuracy: %4f" % (model.evaluate(x_test, y_test)[1]))

: test set을 이용한 모델 결과값

 

k겹 교차검증

출처 : 모두의 딥러닝

k겹 교차검증(k-fold cross validation)이란 데이터셋을 여러개로 나누어 하나씩 테스트셋으로 사용하고, 나머지를 모두 합하여 학습셋으로 이용하는 방법이다.

 

k겹 교차검증을 이용하면 보유한 데이터를 100%를 테스트셋으로 이용가능하다.

 

70대 30, 80 대 20으로 데이터를 나누지 않고 온전한 데이터를 모두 사용가능하다는 장점을 가지고 있음.

 

# 라이브러리 추가
from sklearn.model_selection import StratifiedKFold

# k겹 교차검증-kfold cross validation
n_fold = 10
skf = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=seed)

k겹 교차검증 라이브러리 사용을 위해 라이브러리를 추가한다.

from sklearn.model_selection import StratifiedKFold

 

k겹 교차검증 설정

n_fole = 10 은

# 빈 accuracy 배열
accuracy = []

# 모델 설정, 컴파일, 실행
for train, test in skf.split(X, Y):
    model = Sequential()
    model.add(Dense(24, input_dim=60, activation='relu'))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss="mean_squared_error", optimizer='adam', metrics=['accuracy'])
    # # 딥러닝 fit, 모델 실행
    # x[train], y[train] = X, Y 값에서 분리하여 TRAIN, TEST SET으로 이용
    model.fit(X[train], Y[train], epochs=200, batch_size = 5) 
    k_accuracy = "%.4f" % (model.evaluate(X[test], Y[test])[1])
    accuracy.append(k_accuracy)

print("\n %.f fold accuracy:" % n_fold, accuracy)

dataset X,Y를 train, test으로 반복해서 돌린다.

 

X[train], Y[train]을 실행하고 10번씩 반복해서 훈려을 돌린다.

 

k_accuracy = X[train], Y[train] 훈련을 바탕으로 X[test], Y[test] 데이터에 적용 시킨다.

 

accuracy.append(k_accuracy) : 정확도에 k겹 교차검증 데이터를 추가하고 각 실행마다 accuracy 값을 출력한다.

반응형

댓글