0. 평가지표
회귀모델 | MSE, RMSE, MAE | 오차의 양 | |
MAPE | 오차율 | ||
R2 Score | 결정계수 | ||
분류모델 | Confusion Matrix | Accuracy | 정분류율 |
Recall | 재현율 | ||
Precision | 정밀도 | ||
F1-Score | Recall과 Precision 조화평균 |
1. 코드 순서
Machine Learning | Deep Learning | ||
데이터 전처리 | NaN 조치 | Nan 조치 | |
가변수화 | 가변수화 | ||
스케일링(필요시) | 스케일링(필수) | ||
모델링 | 모델 선언(설계) | 모델 구조 | 커파일 |
학습 | 학습 | 학습곡선 | |
예측 및 검증 | 예측 및 검증 |
2. 딥러닝 개념
- 가중치 조정
- 최적의 모델 : 오차가 가장 적은 모델
- 방법
- 조금씩 Weight를 조정하며 오차가 줄어드는지 확인
- 지정한 횟수만큼, 더 이상 오차가 줄지 않을 때까지
- 학습 절차
단계 1 | 가중치에 (초기)값을 할당(랜덤) | |
단계 2 | (예측) 결과를 계산 | |
단계 3 | 오차 계산 | foward propagation |
단계 4 | 오차를 줄이는 방향으로 가중치 조정 | back propagation |
단계 5 | 다시 단계 1로 올라가 반복 |
3. Regression
- 스케일링
- Normalization(정규화) : 모든 값의 범위를 0~1 변환
- Standardization(표준화) : 모든 값을, 평균=0, 표준편차 1로 변환
- input_shape : 분석 단위에 대한 shape
- 1 차원 : (feature 수, )
- 2 차원 : (rows, columns)
- output : 예측 결과가 1개 변수(y가 1개 변수)
- 컴파일 : 선언된 모델에 대해 몇 가지 설정한 후, 컴퓨터가 이해할 수 있는 형태로 변환하는 작업
- loss function(오차함수) : 오차 계산을 무엇으로 할지 결정
- 회귀모델 mse
- optimizer : Adam(lr = 0.01) 옵션값 조정 가능
- epochs : 전체 데이터를 몇 번 학습할 것인지 정해 줌
- validation_split = 0.2 : train데이터 20%를 검증 셋으로 분리
# 메모리 정리
clear_session()
# Sequential 모델 만들기
model = Sequential( Dense( 1 , input_shape = (nfeatures ,))
# 모델요약
model.summary()
# 컴파일
model.compile(optimizer = Adam(learning_rate=0.01), loss = 'mse')
# 학습
history = model.fit(x_train, y_train, epochs = 50, validation_split=0.2).history
3.1 Hidden Layer
- input_shape은 첫 번째 layer에만 필요
- hidden layer은 활성함수를 필요로 함(보통 relu 사용)
3.2 Activation Function
- 현재 layer의 결과값을 다음 레이어로 어떻게 전달할지 결정, 변환해 주는 함수
- Hidden Layer에서는 : 선형함수를 비선형 함수로 변환
- Output Layer에서는 : 결과값을 다른 값으로 변환해 주는 역할
4. 이진분류
Layer | Activation Function | 기능 | |
Hidden Layer | Relu | 좀 더 깊이있는 학습을 시키려고 선형 모델을 비선형 모델로 바꾸려고 |
|
Output Layer | 회귀 | X | X |
이진분류 | sigmoid | 결과를 0, 1로 변환하기 위해 | |
다중분류 | softmax | 각 범주에 대한 결과를 범주별 확률 값으로 변환 |
- Output Layer Activation Function : sigmoid
- Loss Function : binary_crossentropy
5. 다중분류
- Output Layer Activation Function : softmax
5.1 y 전처리
- 정수 인코딩(0부터 시작)
- Loss Function : sparse_categorical_crossentropy
- One-hot Encoding
- Loss Function : categorical_crossentropy
6. 성능관리
- 과적합 : 모델이 복잡해지면, 가짜 패턴(연관성)까지 학습하게 됨
- 가짜 패턴 : 학습데이터에만 존재하는 특이한 성질
- 적절한 복잡도 지점 찾기가 모델링의 목적
- 딥러닝에서 다음을 조절
- Epoch와 learning_rate
- 모델 구조 조정 : hidden layer, node 수
- Early Stopping
- Regularization : L1, L2
- DropOut
6.1 Early Stopping
- 반복 횟수(Epoch)가 많으면 과적합 될 수 있음
- monitor : 기본값 val_loss
- min_delta : 오차의 최소값에서 변화량(줄어드는 양)이 몇 이상 되어야 하는지 지정
- patience : 오차가 줄어들지 않는 상황을 몇 번(Epoch) 기다려줄 건지 지정
from keras.callbacks import EarlyStopping
# EarlyStopping 설정 ------------
min_de = 0.001
pat = 5
es = EarlyStopping(monitor = 'val_loss', min_delta = min_de, patience = pat)
# --------------------------------
# 학습
hist = model.fit(x_train, y_train, epochs = 100, validation_split=0.2,
callbacks = [es]).history
6.2 가중치 규제 Regularizaion
- 오차함수에 페널티 추가 포함
- L1 규제 : Lasso
- 효과 : 가중치 절대값의 합을 최소화 -> 가중치가 작은 값들은 0으로 마드는 경향
- L2 규제 : Ridge
- 효과 : 가중치 제곱의 합을 최소화 -> 규제 강도가 크면, 큰 가중치가 줄어드는 효과, 작은 가중치는 0에 수렴
# 규제를 위해 필요한 함수 불러오기
from keras.regularizers import l1, l2
# 메모리 정리
clear_session()
# Sequential 타입
model = Sequential( [Dense(128, input_shape = (nfeatures,), activation= 'relu',
kernel_regularizer = l1(0.01)),
Dense(64, activation= 'relu',
kernel_regularizer = l1(0.01)),
Dense(32, activation= 'relu',
kernel_regularizer = l1(0.01)),
Dense(1, activation= 'sigmoid')] )
# 컴파일
model.compile(optimizer= Adam(learning_rate = 0.001), loss='binary_crossentropy')
6.3 최종 모델 저장하기
- 모델 저장 : model.save('파일이름.h5')
- 모델 로딩 : load_model('파일이름.h5')
- 중간 체크포인트 저장하기 : ModelCheckpoint()
7. Functional API
Sequential API | Functional API |
- 순차적으로 쌓아가며 모델 생성 - Input -> Output Layer로 순차적 연결 |
- 모델을 더 복잡하게 구성 - 모델을 분리해서 사용 가능 - 다중 입력, 다중 출력 가능 |
|
|
- Sequential 함수 안에 리스트로 레이어 입력 | - Input 함수 - 레이어 : 앞레이어 연결 지정 - Model 함수로 시작과 끝 열결해서 선언 |
clear_session()
il = Input(shape=(nfeatures, ))
hl1 = Dense(18, activation='relu')(il)
hl2 = Dense(4, activation='relu')(hl1)
ol = Dense(1)(hl2)
model = Model(inputs = il, outputs = ol)
model.summary()
7.1 다중입력
- 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)
# 두 히든레이어 결합
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)
model.summary()
model.compile(optimizer=Adam(learning_rate = 0.01), loss = 'mse')
# 학습
hist = model.fit([x_train1, x_train2], y_train, epochs=50, validation_split=.2).history
pred = model.predict([x_val1, x_val2])
8. 시계열 모델링
- 통계적 시계열 모델링
- y의 이전 시점 데이터들로부터 흐름의 패턴을 추출하여 예측
- ML 기반 시계열 모델링
- 특정 시점 데이터들(1차원)과 예측 대상 시점 과의 관계로부터 패턴을 추출하여 예측
- DL 기반 시계열 모델링
- 시간흐름 구간 데이터들(2차원)과 예측대상시점과의 관계로부터 패턴 추출
- 분석단위를 2차원으로 만드는 전처리 필요 -> 데이터셋은 3차원
8. 1 잔차 분석
- 잔차(Residuals) = 실제 데이터 - 예측값
- 잔차 분석
- 시각화 : ACF, PACF
- 검정
- 정상성검정
- 정규성 검정
- 자기상관 검정
- 등분산성 검정
8.2 RNN
- 과거의 정보를 현재에 반영해 학습하도록 설계
- ex) 최근 4일간의 데이터를 기반으로 다음날 xx 예측
- RNN을 위한 전처리
- 데이터 분할 x, y
- 스케일링 : x 필수, y값이 크다면 스케일링
- 3차원 데이터셋 만들기
- 데이터분할 2 : train, val
- SimpleRnn : 노드 수 1개 -> 레이어의 출력 형태 : timesteps * 노드수
- return_sequences : 출력 데이터를 다음 레이어에 전달할 크기 결정
- True : 출력 크기 그대로 전달 -> timesteps * node 수
- 마지막 RNN Layer에 True를 사용하려면 Flatten으로 펼친 후 Dense Layer로 연결
- False : 가장 마지막(최근) hidden state 값만 전달 -> 1*node 수
- True : 출력 크기 그대로 전달 -> timesteps * node 수
- RNN의 활성화 함수
- 하이퍼볼릭 탄젠트 함수( tanh) : gradient 소실 문제 완화, 시그모이드에 비해 gradient를 좀 더 크게 유지
clear_session()
model = Sequential([SimpleRNN(8, input_shape = (timesteps, nfeatures), return_sequences=False),
Dense(1)])
model.summary()
clear_session()
model = Sequential([SimpleRNN(16, input_shape = (timesteps, nfeatures), return_sequences = True),
SimpleRNN(8, return_sequences= True),
Flatten(),
Dense(8, activation='relu')
Dense(1)])
model.summary()
8.3 LSTM
- RNN의 장기 의존성 문제 해결
- 분석/예측 단위 : 2차원
- 열 : Feature, 행 : 시간간격(time steps)
- 어떤 간격이 적절한지 결정하는 것이 중요
- RNN/LSTM(1)
- 노드 1개 : 각 timestep 마다 특징 값 하나씩 도출
- timestep이 4개라면, 4행 1열의 특징이 만들어짐
- return_sequences
- true : 4행 1열 모두 전달
- false : timestep 중 제일 마지막 값만 전달
99. Dropout
- 과적합을 줄이기 위해 사용되는 정규화 기법 중 하나
- 훈련 과정에서 신경만의 일부 뉴련을 임의로 비화성화 시킴으로써 강제로 일반화
'KT에이블스쿨' 카테고리의 다른 글
[KT에이블스쿨] 12주 (0) | 2024.05.12 |
---|---|
[KT에이블스쿨] 7주 (0) | 2024.04.07 |
[KT에이블스쿨] 4주 (0) | 2024.03.31 |