- 머신러닝과 딥러닝의 차이점
- 진행 차이
모델링 시에 모델구조 잡기, 컴파일이 포함된다.
학습 시에 학습 곡선을 확인이 포함된다.
- 은닉층
은닉층에서 만들어진 원래 변수를 통해 세부적으로 새롭게 표현된 변수를 만든다. (feature Enginnering)
변수들을 추상화한 변수를 생성해서 다시 노드를 만드는 것을 반복적으로 진행한다고 볼 수 있다.
(화장실 수, 방 수, 면적 / 지하철역과 거리, 공원 수) > (외부요소, 내부요소) > 집(타겟)
- 머신러닝 : 사람이 새로운 변수를 만들어 낸다.
- 딥러닝 : 은닉층에서 새로운 변수를 나타낸다
- 스케일링
머신러닝은 선택이다 : KNN, SVM, K-Means는 거리를 기반으로 하기에 스케일링이 필요하다.
딥러닝은 필수이다. : 뒤에 스케일링이 모두 필수이다.
- Normalization(정규화) : 모든 값의 범위를 0 ~ 1로 변환
- Standardization(표준화) : 평균 0, 표준편차 1로 변환
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)
'KT AIVLE School > 딥러닝' 카테고리의 다른 글
시계열 모델링 (0) | 2024.10.15 |
---|---|
Functional API 및 다중 입력 (0) | 2024.10.15 |
모델 저장하기 (0) | 2024.10.14 |
적절한 복잡도 찾기 (2) | 2024.10.14 |
분류모델링 (1) | 2024.10.11 |