⌚ 활동 시간 : 2023년 2월 4일 오후 8시 ~ 오후 11시
✨ 목표 : 모두의 딥러닝 13장 내용을 공부하고 정리하였다.
광석, 암석 구분 모델 예시를 설명한다.
과적합은 모델이 Train 데이터셋 안에서 일정 수준 이상의 예측 정확도를 보이지만, Test 데이터에 적용하면 정확도가 높지 않은 상황을 말한다.
모델의 은닉층이 너무 많거나, 변수가 복잡하거나, Test set과 Train set이 중복 될 때 발생한다.
https://itwiki.kr/images/0/09/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5_%EA%B3%BC%EC%A0%81%ED%95%A9.png
과적합을 방지하기 위한 방법 중 하나는 전체 데이터 셋을 Train 데이터 셋과 Test 데이터 셋으로 나누는 것이다. Train 데이터셋으로 모델을 학습시키고 Test 데이터 셋으로 해당 모델의 성능을 검증한다.
https://miro.medium.com/max/1202/1*eFydLxeFcmg8Grn1eKOVXQ.png
Train 데이터 셋만 활용할 경우 은닉층을 많이 추가하거나, epoch을 높이면 정확도가 높아지지만 Test 데이터 셋의 경우 층이 많아지거나 epoch이 높아질 수록 과적합에 의해 정확도가 떨어질 가능성이 있다. 따라서 Test set에 적절한 값을 찾는 것이 중요하다.
https://i.stack.imgur.com/Z2BOz.png
Train과 Test를 나누는 함수는 train_test_split()이다. test_size값을 지정하여 train, test 비율을 설정할 수 있다.
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True)
만들어진 모델을 테스트셋에 적용하려면 model.evaluate()를 사용하면 된다.
score = model.evaludate(X_test, y_test)
모델의 성능을 향상시키기 위한 방법은 데이터를 보강하는 방법과 최적화된 알고리즘을 사용하는 방법이 있다.
먼저 데이터를 보강하는 방법은, 적절한 데이터를 많이 사용할 경우 성능이 좋아질 수 있다. 그러나 많은 데이터를 사용하여 성능을 높이는 것에는 한계가 있다. 따라서 데이터를 보완하는 방법을 사용하는 것이 적절하다. 사진 크기를 확대하거나 축소하는 방법, 데이터의 이상치를 조절하기, 시그모이드 함수를 사용하여 전체 데이터를 0에서 1사이의 값으로 변환하기 등이다.
알고리즘을 최적화 시키는 것은 모델의 구조를 바꾸는 것이다. 은닉층의 개수, 노드의 개수를 바꾸거나 때에 따라서는 랜덤 포레스트, XGBooost, SVM 등의 딥러닝이 아닌 알고리즘을 적용하는 방법도 있다.
model.save()를 사용해서 학습이 끝난 모델을 저장할 수 있다. 파일의 확장자는 hdf5이다. 저장된 모델을 다시 사용하려면 load_model()을 사용한다.
from tensorflow.keras.models import Sqequntial, load_model
model.save('model.hdf5')
model = load_model('model.hdf5')
데이터 셋을 여러개로 나누어 그 중 하나를 Test set으로 사용하고 남은 모든 부분을 Train set으로 사용하는 방법이다. 이 방법을 사용하면 가지고 있는 데이터 셋의 모두를 Train set, Test set으로 사용할 수 있다.
https://www.researchgate.net/publication/278826818/figure/fig10/AS:614336141750297@1523480558954/The-technique-of-KFold-cross-validation-illustrated-here-for-the-case-K-4-involves.png
sklearn 라이브러리의 KFold() 함수를 사용하면 데이터를 나눌 수 있다.
from sklearn.model_selection import KFold
kfold = KFold(n_splits = 5, shuffle = True)