KT AIVLE School/딥러닝

회귀모델링

Rabet 2024. 10. 11. 09:17

- 머신러닝과 딥러닝의 차이점

  • 진행 차이

모델링 시에 모델구조 잡기, 컴파일이 포함된다.

학습 시에 학습 곡선을 확인이 포함된다.

 

  • 은닉층

은닉층에서 만들어진 원래 변수를 통해 세부적으로 새롭게 표현된 변수를 만든다. (feature Enginnering) 

변수들을 추상화한 변수를 생성해서 다시 노드를 만드는 것을 반복적으로 진행한다고 볼 수 있다.  

(화장실 수, 방 수, 면적 / 지하철역과 거리, 공원 수) > (외부요소, 내부요소) > 집(타겟)

  • 머신러닝 : 사람이 새로운 변수를 만들어 낸다.
  • 딥러닝 : 은닉층에서 새로운 변수를 나타낸다

 

  • 스케일링

머신러닝은 선택이다 :  KNN, SVM, K-Means는 거리를 기반으로 하기에 스케일링이 필요하다.

딥러닝은 필수이다. : 뒤에 스케일링이 모두 필수이다.

  • Normalization(정규화) : 모든 값의 범위를 0 ~ 1로 변환
  • Standardization(표준화) : 평균 0, 표준편차 1로 변환

 

 

google Colaboratory로 진행

1. 전처리

scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_val = scaler.transform(x_val)

 

 

2. 모델구조 및 컴파일

from keras.models import Sequential
from keras.layers import Dense, Input
from keras.backend import clear_session

 

 

3. 모델선언

nfeatures = x_train.shape[1] #num of columns

# 메모리 정리
clear_session()

# Sequential 타입 모델 선언
model = Sequential( [Input(shape =(nfeatures,)), Dense(1)]  )

# 모델요약
model.summary()

Input : 예측단위 shape를 받는다.  👉 (feature 수,) or (rows, columns) or (이미지 3차원)

Output : Dense는 노드의 개수

Param : 가중치 개수

 

- 은닉층 생성

Input(변수, x, feature)을 layer에 연결(가중치 곱하고 다른 변수와 더해서 연결)한다. 

layer은 노드로 구성되며 중간에 은닉층이 생기고, 마지막 layer가 Output으로 나온다.

 

model3 = Sequential([Input(shape = (nfeatures,)),
                     Dense(2, activation = 'relu'),
                     Dense(1)   ])

ativation Function: 활성화 함수로 현재 레이어의 각 결과값을 다음 레이어로 어떻게 전달할지 결정

  • Sigmoid : 0과 1로
  • tanh : -1과 1로
  • ReLU : 0과 0이상으로 바꾸어주고 보통 relu를 사용한다.

 

- 컴파일

# 컴파일
model.compile(optimizer=Adam(learning_rate=0.1), loss='mse')

compile : 선언된 모델에 대해 몇 가지 설정 한 후 컴퓨터가 이해할 수 있는 형태로 변환하는 작업

loss function(오차 함수) : 오차 계산을 무엇으로 할지 결정 (mse, crossentropy)

optimizer : 오차를 최소화하도록 가중치를 업데이트하는 역할

 

 

4. 학습

history = model.fit(x_train, y_train, epochs = 20, validation_split=0.2).history

 

fit하면 이루어지는 과정

- Forward propagation (feed-forward, 순전파) : 가중치(파라미터)를 조정하여 오차를 줄이는 것

- Back propagation (역전파) : 오차를 기반으로 back으로 가중치를 업데이트 하는 것 

 

① 가중치의 초기값을 할당한다. (랜럼으로 초기 모델을 만든다.)

 

② 예측 결과를 뽑는다.

 

오차를 계산한다.(loss function : mse)

 

④ 오차를 줄이는 방향으로 가중치(파라미터)를 조정 (optimizer : GD, Adam)

조정은 미분값, 학습율을 기준

- leanring rate : 얼마 만큼 적절히 조절할 지 정하는 하이퍼파라미터 (학습률, 보폭)

하이퍼파라미터 : 내가 찾아야 하는 값

 

⑤ 다시 처음으로 올라가 반복한다!! (max iteration에 도달하면 끝 = 오차의 변동이 없으면 끝)

- epoch : 전체 데이터를 몇 번 반복할 지 결정

- batch_size(validation_split) : 데이터를 얼만큼 적절히 나눠서 반복할 지 결정

 

.history : 학습 중에 가중치가 업데이트되면서 계산된 오차 기록 > 학습곡선 생성

학습곡선 : 모델 학습이 잘 되었는지 파악하기 위한 그래프로, 학습 경향을 파악한다.

 

# 함수로 만들어서 사용합시다.
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()
dl_history_plot(history)

학습곡선

학습 곡선으로 학습 경향을 파악(정답x)

 

5. 예측

pred = model.predict(x_val)

 

 

6. 평가(검증)

print(f'RMSE  : {root_mean_squared_error(y_val, pred)}')
print(f'MAE   : {mean_absolute_error(y_val, pred)}')
print(f'MAPE  : {mean_absolute_percentage_error(y_val, pred)}')

 

 

회귀 모델 예측값 vs 실제값 그래프 그려보기

def visualization_result(y_val,pred):
    plt.figure(figsize = (5,5))
    y = x = np.linspace(y_val.min(), y_val.max(), 10)

    y_range = y_val.max() - y_val.min()
    mi, ma = y_val.min() - y_range*0.1 , y_val.max()+ y_range*0.1

    sns.scatterplot(x= pred.reshape(-1), y = y_val.values)
    sns.lineplot(x = x, y = y, color = 'r')
    plt.xlim(mi, ma)
    plt.ylim(mi, ma)
    plt.grid()

    plt.show()

visualization_result(y_val,pred2)

빨간 선이 실제값