프로그래밍/인공지능

모델 성능 검증 - 과적합(overfitting)

austag 2023. 7. 3. 19:18

저번 글에서는 아이리스 품종을 예측해보는 모델 실습을 해보았습니다.

모델을 만들어보았으니 그 성능을 검증해보는 과정을 공부해보려 합니다.

여기서는 초음파 광물 예측 실험을 해보려고 합니다.


 

import pandas as pd

!git clone https://github.com/taehojo/data.git
df = pd.read_csv('./data/sonar3.csv', header=None)

먼저 데이터를 불러오고

df.head()

데이터의 첫 5줄만 보면 

이렇게 나옵니다.

마지막 열이 광물의 종류를 나타내고 일반 암석일 때 0, 광석일 때 1로 표현되었습니다.

1~60 열은 음파 주파수의 에너지를 0~1 값으로 나타냅니다.

df[60].value_counts()

값들을 확인해주면

광석(1) 111개, 암석(0) 97개로 총 208개의 샘플있다는것을 알 수 있죠.

 

이제 모델을 만들어보겠습니다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

X = df.iloc[:,0:60] #1~60 번째 열
y = df.iloc[:,60] #광물의 종류

#모델 설정
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='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

#실행
history = model.fit(X, y, epochs=200, batch_size=10)

결과를 보니 마지막에 가서는 정확도가 거의 1로 나오더군요.

음 과적합이 발생했습니다.


과적합(overfitting)은 모델에 학습 데이터셋 안에서는 일정 수준 이상의 예측 정확도를 보이지만, 새로운 데이터에 적용하면 잘 맞지 않는 것입니다.  한 모델의 학습 데이터셋에 너무 맞추어져서 다른 테스트 데이터셋이나 새로운 데이터에서 정확한 답을 내기 어려워집니다. 층이 너무 많거나, 변수가 복잡하거나, 테스트셋과 학습셋이 중복될 경우 등에 과적합이 생깁니다. 딥러닝에서는 많은 변수들을 사용하기 때문에 이 과적합을 잘 방지해야 합니다. 

 

과적합을 방지하기 위한 한 방법인 '학습 데이터셋'과 '테스트 데이터셋'을 완전히 구분하여 학습과 테스트를 동시에 진행한는 것이 있습니다.

예를 들어 100개의 샘플 중 70개는 학습 데이터셋으로 30개는 테스트 데이터셋으로 구분하여 학습을 진행하고 결과를 저장합니다. 이것을 '모델'이라고 하는데 30개의 샘플로 실험해 정확도를 보면 학습이 얼마나 잘되었는지 알 수 있습니다.

 

학습셋으로만 진행했을 때는, 층을 더하거나 epoch값을 크게하여 정확도를 올릴 수 있지만 내부에서는 과적합이 일어나고 있습니다. 따라서 학습을 진행해도 결과가 나아지지 않는 지점에서 멈춰야 합니다.


그럼 학습셋과 테스트셋을 분리한 모델을 만들어보겠습니다.

기존 코드에 추가로 짜주겠습니다.

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 : 테스트셋의 비율

 

테스트셋을 30%, 학습셋을 70%로 하여 저장하는 코드를 추가해주고

score = model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])

score에 loss와 accuracy를 저장하고 accuracy를 출력하도록 합니다.

200번 학습했을 때, 학습 정확도는 0.9952, 테스트셋 정확도는 1이 나왔습니다.


인공지능을 안정적이게 만드려면 데이터를 보강하는 것, 알고리즘을 최적화하는 것이 있습니다.

데이터로 성능을 높이려면 충분한 데이터가 있으면 됩니다. 

데이터 양으로만으로 한계가 있을 때에는 데이터를 보완해주는 방법이 있습니다. 사진을 예로 들어보면 확대, 축소, 회전, 노이즈 등이 될 수 있습니다.

 

알고리즘을 최적화하는 방법은 다른 구조로 모델을 바꾸며 최적의 구조를 찾는 것입니다. 은닉층 개수, 노드 수 등을 바꿔볼 수 있습니다. 


이번에는 과적합에 대해서 공부를 해보았습니다.

다음 글에서 다시 찾아오겠습니다.

 

참고: [모두의 딥러닝]