알고리즘이 학습 데이터에 과하게 적합한 상태이거나 정확하게 일치할 때 발생하며 그 결과 모델이 학습 데이터가 아닌 다른 데이터에서 정확한 예측을 생성하거나 결론을 도출할 수 없게 됨
새로운 데이터를 효과적으로 일반화할 수 없게됨 ➡️ 의도한 분류,예측 수행 불가
💡왜 문제가 될까?
- 모델이 샘플 데이터를 너무 오래 학습하거나 복잡하면 '노이즈' 또는 관련 없는 정보를 학습할 수 있는데 이때 모델이 노이즈를 기억하고 학습세트에 과하게 적합한 상태면
과적합이 됨
- 모델이 복잡해지면
가짜패턴까지 학습하게 됨
가짜패턴: 학습데이터에만존재하는 패턴, 다른셋에서 성능저하

Underfitting : 너무 일찍 종료하거나 중요한 특징을 너무 많이 제외했을때 발생
조절할 대상 : Epoch, learning_rate
모델 구조 : hidden layer수, node 수
Early Stopping
Dropout
가중치 규제(Regularization)


Early Stopping 옵션
monitor: 기본값 val_loss
min_delta: 오차의 최소값에서 변화량이 몇 이상 돼야하는지 지정
patience: 오차가 줄어들지 않는 상황을 몇 번 기다려줄 건지 지정
# EarlyStopping 설정 ------------------
from keras.callbacks import EarlyStopping
es = EarlyStopping(monitor = 'val_loss', min_delta = 0.001, patience = 5)
# fit안에 지정
hist = model.fit(x_train, y_train, epochs = 100, validation_split=0.2, callbacks = [es]).history


hidden layer 다음에 dropout layer 추가
0.4: hidden layer노드 중 40% 임의로 제외 시킴 (보통 0.2 ~ 0.5 사이)
feature가 적을 경우 rate를 낮추고, 많을 경우 rate를 높이는 시도
from keras.layers import Dropout
model3 = Sequential([Input(shape = (nfeatures,)),
Dense(64, activation = 'relu'),
Dropout(0.3),
Dense(16, activation = 'relu'),
Dropout(0.3),
Dense(10, activation = 'softmax')])


concatenate: 옆으로 붙이기, 하나의 레이어처럼 묶기
# 모델 구성
input_1 = Input(shape=(nfeatures1,), name='input_1')
input_2 = Input(shape=(nfeatures2,), name='input_2')
# 입력을 위한 레이어
hl1_1 = Dense(10, activation='relu')(input_1)
hl1_2 = Dense(20, activation='relu')(input_2)
# 두 히든레이어 옆으로 합치기(= pd.concat)
cbl = concatenate([hl1_1, hl1_2])
# 추가레이어
hl2 = Dense(8, activation='relu')(cbl)
output = Dense(1)(hl2)
# 모델 선언
model = Model(inputs = [input_1, input_2], outputs = output)
#모델 예측 - 리스트로 묶어서 사용
pred = model.predict([input_1, input_2])