모델 성능 검증 (딥러닝)

TaeHyun Lee·2023년 4월 24일
0

AI 공부

목록 보기
14/17

Train Set과 Test Set

Train set은 모델을 학습시키는 데 사용되는 데이터 세트이고, Test set은 학습된 모델을 평가하기 위해 사용되는 데이터 세트입니다. 일반적으로 전체 데이터를 학습에 사용하지 않고 일부를 테스트에 사용하는 이유는 모델이 학습 데이터에 과적합(overfitting)되는 것을 방지하기 위해서입니다.

과적합이란

과적합은 모델이 학습 데이터에 과도하게 적합해져서 새로운 데이터에 대한 일반화 능력을 잃는 현상입니다. 따라서 모델이 학습 데이터에는 높은 예측률을 보이지만, 새로운 데이터에 대해서는 예측률이 낮아지는 문제가 발생할 수 있습니다.

코드

from sklearn.model_selection import train_test_split

# 학습셋과 테스트셋을 구분합니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True)

test_size는 테스트셋의 비율을 나타냅니다. 0.3은 전체 데이터의 30%를 테스트셋으로 사용하라는 것으로, 나머지 70%를 학습셋으로 사용하게 됩니다. 이렇게 나누어진 학습셋과 테스트셋은 각각 X_train, X_test, y_train, y_test로 저장됩니다.

Train 예측률과 Test 예측률

Train 예측률과 Test 예측률 모두 중요합니다. Train 예측률은 모델이 학습 데이터에서 얼마나 잘 작동하는지를 나타내며, Test 예측률은 모델이 새로운 데이터에서 얼마나 잘 작동하는지를 나타냅니다. 두 예측률은 서로 일치하지 않을 수 있으며, 모델의 일반화 능력을 평가하는 데 사용됩니다.

은닉층의 수가 증가하면 모델의 복잡성이 증가하므로, Train 예측률이 증가할 가능성이 있습니다. 그러나 모델이 학습 데이터에 과적합되는 것을 방지하려면 Test 예측률도 높아져야 합니다. 따라서 적절한 은닉층 수를 선택하여 모델의 일반화 능력을 최대화해야 합니다.

은닉층을 조절해서 코딩하기

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split

import pandas as pd

# 깃허브에 준비된 데이터를 가져옵니다.
!git clone https://github.com/taehojo/data.git

# 광물 데이터를 불러옵니다.
df = pd.read_csv('./data/sonar3.csv', header=None)

# 음파 관련 속성을 X로, 광물의 종류를 y로 저장합니다.
X = df.iloc[:,0:60]
y = df.iloc[:,60]

# 학습셋과 테스트셋을 구분합니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True)

# 모델을 설정합니다.
model = Sequential()
model.add(Dense(26, input_dim=60, activation='relu'))
model.add(Dense(18, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 모델을 컴파일합니다.
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 모델을 실행합니다.
history = model.fit(X_train, y_train, epochs=200, batch_size=10)

# 모델을 테스트셋에 적용해 정확도를 구합니다.
score = model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])

Epoch 199/200
15/15 [==============================] - 0s 3ms/step - loss: 0.0134 - accuracy: 1.0000
Epoch 200/200
15/15 [==============================] - 0s 2ms/step - loss: 0.0134 - accuracy: 1.0000
2/2 [==============================] - 0s 11ms/step - loss: 0.6523 - accuracy: 0.8571
Test accuracy: 0.8571428656578064

다음과 같은 결과가 나왔습니다.

profile
서커스형 개발자

0개의 댓글