본문 바로가기
딥러닝

[딥러닝] 딥러닝 모델링 (#1. Regression) _ 20241031

by 황오독 2024. 10. 31.

* 들어가기전

- 모델의 성능 복습

회귀 모델 MSE, RMSE, MAE 오차의 양
MAPE 오차율
R2 Score 결정계수
분류모델 Confusion
matrix
Accuracy 정분류율
Recall 재현율
Precision 정밀도
F1-Score Recall과 Precision 조화평균

 

더보기

- 딥러닝 학습 절차

 ① 가중치 초기값을 할당한다.

 ② (초기) 모델로 예측한다.

 ③ 오차를 계산한다 (loss function)

 ④ 가중치 조절 : 오차를 줄이는 방향아로 가중치를 적절히 조절한다. (optimizer)

    - 적절히 조절 => 얼마만큼 조절할 지 결정하는 하이퍼파라미터 : learning rate(lr)

 ⑤ 다시 처음으로 가서 반복한다.

    - 전체 데이터를 적절히 나눠서 (mini batch) 반복 : batch_size

    - 데이터를 몇 번 반복학습할 지 결정 : epochs

1. Regression

(1) Input : Input(shape=(,))

  - 분석단위에 대한 shape

   - 1차원 : (feature, 수)

   - 2차원 : (rows, columns)

 

(2) Output : Dense()

  - 예측 결과가 1개 변수(y가 1개 변수)

# 메모리 정리
clear_session()

# Sequential 타입
model = Sequential([Input(shape=(nfeatures,)), # nfeatures => x_train.shape[1]의 값
					Dense(1)])
                    
# 모델요약
model.summary()

- nfeatures => input, Dense(1) => output

 

(3) 컴파일(Compile)

 - 선언된 모델에 몇 가지 설정을 한 후, 컴퓨터가 이해할 수 있는 형태로 변환하는 과정

model.compile(optimizer=Adam(learning_rate=0.1),
		      loss='mse')
# optimizer : 오차를 줄이는 방향으로 가중치를 조정 (Adam 사용_최근 딥러닝에서 가장 성능이 좋음)
            # learning_rate => 조정 비율 (걸음걸이의 '보폭'을 조정한다고 표현)
 # loss : loss function(오차함수) 오차계산을 무엇으로 할지 설정 (회귀:mse, 분류:cross entropy)

* learning rate : 가중치가 너무 작으면 아주 조금 조정되어 최소값에 도달하지 못할 수 있고

                          가중치가 너무 크면 loss가 들쑥날쑥해짐

* 보통 learning rate가 적어지면 epochs를 높임! (epochs : 뒤에 설명)

 

(4) 학습하기

history = model.fit(x_train, y_train, epochs=20, validation_split=.2).history
# epochs : 주어진 train set을 몇 번 학습할 지 결정
# 최적의 값은 케이스마다 다름 (하이퍼파라미터)
# validation_split : train 데이터에서 20%를 검증셋으로 분리 (중간점검용)
# history : 학습을 수행하는 과정 중 가중치가 업데이트 되면서 계산된 오차 기록

 

(5) 학습곡선 그리기 (학습 경향을 파악)

# 함수로 정의
def dl_history_plot(history):
    plt.figure(figsize=(10,6))
    plt.plot(history['loss'], label='train_err', marker = '.')
    plt.plot(history['val_loss'], label='val_err', marker = '.')

    plt.ylabel('Loss')
    plt.xlabel('Epoch')
    plt.legend()
    plt.grid()
    plt.show()

더보기

* 바람직한 학습곡선

 ① 초기 epoch에서는 오차가 크게 줄고

 ② 오차 하락이 꺾이면서

 ③ 점차 완만해짐

  => 그러나 학습곡선의 모양새는 다양함

* 바람직하지 못한 학습곡선

학습이 덜 됨
- epochs를 늘리거나
- learnig_rate를 크게 한다
train error 들쑥 날쑥
- 조금씩 update
  (learning_rate를 작게)
과적합
- epochs 줄이기

 

 

2. Hidden Layer

# Sequential 타입 모델 선언 (입력은 리스트로!)
model = Sequential([Input(shape=(n,)),
				    Dense(2, activation='relu') # hidden layer
                    Dense(1)])
# 활성함수는 주로 'relu'를 사용 (거의 고정!!)

 

 

(1) 활성화 함수

 - 현재 레이어(각 노드) 결과값을 다음 레이어(연결된 각 노드)로 어떻게 전달할지 결정/변환해주는 함수

 - 선형 -> 비선형으로 만들어야 하는데

 - 활성화함수가 없으면 히든 레이어를 아무리 추가해도 그냥 선형회귀(선형모델)이 된다.

  ① Hidden Layer에서는 선형함수를 비선형 함수로 변환

  ② Output Layer에서는 결과값을 다른 값으로 변환 (주로 분류모델에서 사용)

 

(2) hidden layer의 노드수

- 보통 점차 줄여나가지만, 늘렸다가 줄일 수도 있음