simple linear regresiion
label을 보면 linear regresiion 인지 logistic인 지 알 수 있어요!
simple linear regression, 원래 일반식을 한 줄씩 계산을 해야 해요.
하지만 따로따로 계산하지 않고 행렬로 표현해요. 앞에 있는 x를 떼어내어서 행렬곱 연산을 해요. bias는 broadcasting 되기 때문에 scalar로 두어도 돼요! → X * W +b = Y
그렇게 해서 예측값과 정답의 차이를 구하는 거예요! 그 차이를 계산하는 게 loss funcion이에요.
→ linear regresiion의 loss :평균 제곱 오차 → loss 값의 차이를 줄여나가기 위해 W와 b를 바꿔야 해요.
→ gradient descent 알고리즘 → 반복 작업 후 gradient descent를 이용해서 weight와 bias가 줄어들어 좋은 상태로 업데이트가 돼요.
하지만 독립변수가 하나인 경우보다 독립 개수의 개수가 여러 개인 경우가 더 많아요!
multiple linear regression
가중치가 여러 개로 늘어났어요!
y = Wx+b, simple linear regression와 다른 점은 W가 여러 개라는 점이에요. →weight를 하나로 합쳐요.
X의 열의 수와 W의 행의 수가 같게 하여 행렬곱을 연산하면 예측치가 나와요!
예측치와 t와의 차이를 계산해요. 마찬가지로 이 차이를 계산할 때 사용하는 것이 평균 제곱 오차예요.
이번에는 편미분을 여러 번 거친 후 알파 값(learning rate) 곱해서 각각을 다 업데이트해요.
결국 우리가 구하려는 가중치(weight)의 수는 독립변수의 수와 같아요!
logistic regression
기본적으로 이진 분류를 하는 것을 logistic regression이라고 하고,
이진 분류는 여러 개 모아놓은 것을 multinomial logistic regression이라고 해요.
multiple logistic regression
x 값이 여러 개,
t 값은 0 아니면 1
마찬가지로 w를 맞혀 y = Wx + b ( linear regression model)로 시작해요.
소문자 w를 합쳐가지고 대문자 W, 입력에 대한 x는 소문자,
맨 끝에 bias는 하나 있으니까 b를 합쳐 축약해서 써요(linear regression model)
X * W+b = Y로 나온 예측값에 sigmoid 함수를 취해줘요. 이것을 가지고 t와 비교를 해줘요!
예측값과 정답의 차이를 비교할 때 loss 함수를 사용하고 여기서 사용하는 loss 함수는 Cross Entropy(Log loss)예요.
loss는 linear에서 logistic으로 넘어오면 activation function이 추가되어서 sigmoid를 취해준다는 것이 달라요.
후에 gradient descent를 적용시키는 것은 똑같고, 여기서 나온 우리의 모델이 sigmoid(y)예요.
이걸 여러 개 모아놓은 것을 multiple multinomial classification이라고 이야기해요!
multiple multinomial classification
아까와는 다르게 여러 개의 logistic을 한 번에 계산하기 위해 weight를 여러 개로 늘려요.
→ 여러 개의 각각에 대한 logistic 확률을 한 번에 계산해요.( linear regression의 결괏값)
logistic 이 여러 개로 늘었기 때문에 bias도 늘어요.
여기서는 logistic 아닌 multinomial이기 때문에 sigmoid를 안 취해요.
대신 다른 activation function인 softmax를 적용해요. 그럼 열 별로 각각의 확률 값이 나오고,
우리의 t(정답)이랑 비교해요. → 정답(t)을 인코딩(One-Hot Encoding)을 이용해서 우리의 예측과 비교해요!
다음은 gradient descent를 적용시켜 반복한 뒤 W와 b를 업데이트하는 것은 똑같아요!
activation function으로 softmax를 쓴다는 점이 가장 큰 차이예요.
독립변수가 2개인 Logistic Regression
input data를 받아들이는 계층 : input layer → placeholder와 유사
각각의 column(독립변수)을 일열로 따로따로 쭉 1차원 배열로 받아들여요.
동그라미를 node라고 해요 → data를 받아서 다음으로 보내주는 역할
실제로 우리가 계산해야 하는 것은 w와 b를 계산해야 해요! 이 w와 b는 박스 안에 존재해요.
z 에는 linear regression의 결괏값이 들어가요.
linear regression의 activation function(sigmoid)를 거쳐 결과가 떨어지고, 연산을 통한 output layer를 통과하면 최종 예측값(Y)이 나와요.
우리의 예측값과 실제 값을 cross entropy를 이용해 weight와 bias를 업데이트하여 계산한 뒤 최적의 값을 찾아내요!
결국 input layer outputlayer 가 두 개 들어가고 각각의 2차원 column을 1차원으로 만들어 보내주고(각각의 node)
박스 내부에 들어오는 독립변수의 개수를 보고 박스 안에 자동으로 식이 생겨 맵핑이 되어 뒤쪽에 있는 output레이어로 흘러들어 가서 예측값이 나와요.
이것을 계산하기 위해 bias를 더하고 linear regression의 sigmoid를 취해서 최종 결과가 나와서 정답과 비교해요.
그림의 동그란 out layer하나가 하나의 logistic역할을 수행해요.
나중에 배울 keras에서는 전체 박스가 model이에요! → 모델 안에 layer추가
입력변수가 2개인 multinomial classification
여기서 logistic 세게 모아놓은 것이기 때문에 w 행렬이 저렇게 되고 합쳐서 W라 불려요.
out layer하나가 하나의 logistic역할을 수행
코드로 알아보아요!
import tensorflow as tf
print(tf.__version__)
#2.6.0
from tensorflow.keras.models import Sequential # Sequentiall(데이터가 순차적으로 흐름)이 우리의 모델
model = Sequential() # 그림의 큰 box를 만들 수 있어요!
# model을 생성한 후 그다음에 할 일은 layer(input,output)를 추가하는 거예요!
# model.add() add를 이용해 layer추가
# 설정을 잡아야 해요
# model.compile()
# 1. optimizer를 무엇으로 쓸지(SGD, Adam, etc..)
# 2. loss 설정(MSE, Log loss...)
# 3. metrics 설정
# 학습 진행
# model.fit()
# 평가 진행
# model.evaluate
# 예측 진행
# model.predict()
# 모델을 저장
# model.save()
# Keras를 이용해서 간단한 simple linear regression을 구현해 보아요!
# 독립변수 1개 continuous value
# x_data = [1,2,3,4,5]
# t_data = [3,5,7,9,11]
# 학습이 끝난 후 11에 대한 예측값은? 23
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
# Flatten (평평한) input layer의 이름 데이터가 일차원 형태로 만들어서 사용
# Dense output layer의 이름
from tensorflow.keras.optimizers import SGD # Stochastic Gradient Descent
# Gradient Descent 상위 버전, 하지만 learning rate에 민감, 나중에는 adam을 써요.
# training data set
# 사용할 때는 2차원으로 바꿔줘요
x_data = np.array([1,2,3,4,5]).reshape(-1,1)
t_data = np.array([3,5,7,9,11]).reshape(-1,1)
# 1. keras model을 생성 → Box 생성
model = Sequential() # 비어있는 Box
# 2. layer 추가
#input_shape에는 tuple형태로 독립변수의 개수를 줘요.
model.add(Flatten(input_shape=(1,))) #input layer , 그림에서 입력의 동그라미
model.add(Dense(1, activation='linear')) # output layer
# Dense에는 노드의 개수(그림의 output동그라미)를 적어줘요.
# activation에는 활성화 함수를 정해서 넣어줘요.
# 3. model compile(설정을 잡아요!)
model.compile(optimizer=SGD(learning_rate=1e-2),
loss='mse') # Mean squared error, tensor flow2.x부터는 이렇게 써도 돼요.)
# 4. 학습
model.fit(x_data,
t_data,
epochs=1000,
verbose=1) # verbose는 출력 레벨(어떻게 출력을 할 거냐), 파악해야 하는 loss값 찍어줘요.
# 지금까지는 train_test_split을 써서 train data를 validation data와 분리했어요.
# 이걸 나중에, 로 구분할 거예요
# 배치 처리도 tensor flow2.0부터는 배치 크기만 넣어주면 알아서 구현해 줘요.
# 나중에 배워볼게요!
# 5. Evaluation(평가)
model.evaluate(x_data, t_data) #데이터가 현재 없어서 training data를 사용할 거예요.
# 6. Prediction
result = model.predict([[11]])
print(result)
#1/1 [==============================] - 0s 14ms/step - loss: 4.7088e-05
#[[23.03292]]
# 7. 모델 저장
model.save('/content/drive/MyDrive/MyLinearModel.h5') # 모델의 확장자는 h5 예요!
'머신러닝 딥러닝' 카테고리의 다른 글
0914 titanic_keras (0) | 2021.09.14 |
---|---|
0910 k-nearest Neighbor (KNN) 'K - 최근접 이웃' (0) | 2021.09.10 |
0909 Tensor flow 2.x, keras in tensor 2.x (0) | 2021.09.09 |
0909 multinomial classification - MNIST (0) | 2021.09.09 |
0908 multinomial classification(다중분류) (0) | 2021.09.08 |
댓글