1. 데이터의 확인과 실행
import pandas as pd
# 데이터 입력
df = pd.read_csv('C:/users/kang mingu/dataset/sonar.csv', header=None)
# 데이터 개괄 보기
print(df.info())
- 총 샘플의 수는 208개
- 컬럼 수가 61개
- 60개의 속성
- 1개의 클래스
from keras.models import Sequential
from keras.layers.core import Dense
from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy
import tensorflow as tf
# seed 값 설정
numpy.random.seed(3)
tf.random.set_seed(3)
# 데이터 입력
df = pd.read_csv('C:/users/kang mingu/dataset/sonar.csv', header=None)
dataset = df.values
X = dataset[:,0:60].astype(float)
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(10, 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]))
모델의 정확도가 100%가 나온다.
2. 과적합
- 과적합(overfitting)
- 모델이 학습 데이터셋 안에서는 일정 수준 이상의 예측 정확도를 보이지만, 새로운 데이터에 적용하면 잘 맞지 않는 것
- 발생하는 경우
- 층이 너무 많을 때
- 변수가 복잡할 때
- 테스트셋과 학습셋이 중복될 때
위 그림의 경우 테스트 케이스의 경우에만 최적화 → 정확히 두 그룹으로 나누지 못하게 됨
3. 학습셋과 테스트셋
- 100개의 샘플이 있다면 70개는 학습을 진행시켜 모델을 얻음
- 얻은 모델에 30개의 테스트셋으로 실험하여 정확도를 확인
- 학습 데이터셋만으로 평가한 예측 성공률이 테스트셋에서 그대로 나타나지 않음
- 학습이 깊어져 학습셋 내부에서의 성공률은 높아져도 테스트셋에서는 효과가 없다면 과적합이 일어나고 있는 것
은닉층 개수의 변화 | 학습셋의 예측률 | 테스트셋의 예측률 |
0 | 79.3 | 73.1 |
2 | 96.2 | 85.7 |
3 | 98.1 | 87.6 |
6 | 99.4 | 89.3 |
12 | 99.8 | 90.4 |
24 | 100 | 89.2 |
- 식이 복잡해지고 학습량이 늘어날수록 학습 데이터를 통한 예측율은 계속해서 올라가지만,
적절하게 조절하지 않을 경우 테스트셋을 이용한 예측률은 오히려 떨어짐
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
# seed 값 설정
seed = 0
numpy.random.seed(seed)
tf.random.set_seed(3)
df = pd.read_csv('C:/Users/kang mingu/dataset/sonar.csv', header=None)
dataset = df.values
X = dataset[:,0:60].astype(float)
Y_obj = dataset[:,60]
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
# 학습 셋과 테스트 셋의 구분
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)
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=130, batch_size=5)
# 테스트셋에 모델 적용
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))
- 학습셋을 70%, 테스트셋을 30%로 설정하였을 때 예측 성공률을 80.95%이다.
*
실전에서는 처음 보는 데이터에서도 잘 동작하는 모델을 만들기 위해 훈련을 마친 후 완전히 새로운 데이터로 한 번 더 테스트를 진행.
이를 위해 별도의 데이터셋을 준비.
훈련에 사용되는 데이터셋을 검증셋(Validation set)
마지막에 테스트하기 위해 준비된 데이터셋을 테스트셋(Test set)
'ML > 모두의 딥러닝' 카테고리의 다른 글
14장) 베스트 모델 만들기 (0) | 2023.07.13 |
---|---|
13-2장) 모델 저장과 재사용 (0) | 2023.07.12 |
12장) 다중 분류 문제 해결하기 (0) | 2023.07.11 |
11장) 데이터 다루기 (0) | 2023.07.11 |
10장) 모델 설계하기 (0) | 2023.07.10 |