딥러닝 이해 시작(9) - 과적합 방지
과적합에 대해 알아보고 과적합을 방지 하기 위한 방법에 대해 알아보자.
ex) train_test_split() 함수, StratifiedKFold( ) 함수
과적합
모델이 학습 데이터셋에서는 어느 정도 예측 정확도를 보이지만, 새로운 데이터에 적용하면 잘 맞지 않는 것
- 과적합은 층이 너무 많을 때, 변수가 복잡할 때, 테스트 셋과 학습 셋이 중복될 때 생기기도 함
과적합 방지
1) train 데이터로 학습, test 데이터로 평가 - train_test_split() 함수
학습 데이터 셋과 테스트 데이터 셋을 구분한 다음 학습 후 테스트를 진행
# 학습 셋과 테스트 셋의 구분
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=32)
# train 데이터로 모델 학습
model.fit(X_train, Y_train, epochs=130, batch_size=5)
- 신경망을 만들어 60개의 train 셋으로 학습을 진행하면서 1 epoch마다 20개의 valid 셋으로 학습의 과적합을 판단
- 최종적으로 20개의 test 셋으로 실험해서 정확도를 살펴보면 학습이 잘 되었는지 파악 가능
- 학습을 진행해도 검증셋 결과가 더 이상 좋아지지 않는 점에서 학습을 멈추기(이때의 학습 정도가 가장 적절함)

2) k겹 교차 검증(k-fold cross validation) - StratifiedKFold( ) 함수
학습 데이터를 여러 개로 나누어 하나씩 검증 셋으로 사용하고 나머지를 모두 합해서 학습 셋으로 사용하는 방법
- 가지고 있는 데이터의 100%를 검증셋으로 사용할 수 있음
- StratifiedKFold( ) 함수 : 데이터를 원하는 숫자만큼 쪼개 각각 학습 셋과 검증 셋으로 사용하는 함수
# 10개의 파일로 쪼갬
n_fold = 10
skf = StratifiedKFold(n_splits=n_fold, shuffle=True, random_state=seed)
# 빈 accuracy 배열
accuracy = []
# 모델의 설정, 컴파일, 실행
for train, test in skf.split(X, Y): #모델을 만들고 실행하는 부분을 for 구문으로 묶어 n_fold만큼 반복되게 함
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=100, batch_size=5)
k_accuracy = "%.4f" % (model.evaluate(X[test], Y[test])[1])
accuracy.append(float(k_accuracy)) #정확도(Accuracy)를 매번 저장하여 한 번에 보여줄 수 있게 accuracy 배열을 만듦
# 결과 출력
print("\n %.f fold accuracy:" % n_fold, accuracy)
print(" 평균 10 fold accuracy: ", round(np.mean(accuracy), 4))
- 코드 실행 결과

'딥러닝' 카테고리의 다른 글
| 딥러닝 이해 시작(8) - 다중분류_인코딩 (0) | 2022.06.15 |
|---|---|
| 딥러닝 이해 시작(7) - 오차 함수 (0) | 2022.06.13 |
| 딥러닝 이해 시작(6) - 신경망과 오차역전파 (0) | 2022.06.13 |
| 딥러닝 이해 시작(5) - 활성화 함수 종류 (0) | 2022.06.12 |
| 딥러닝 이해 시작(4) - 로지스틱 회귀 (0) | 2022.06.12 |