안녕하세요
저번 포스팅에서 단순선형회귀 그리고 다중선형회귀에 대해 다루었습니다.
https://ruminz.tistory.com/276 (다중선형회귀란 무엇인가)
https://ruminz.tistory.com/271(선형회귀란 무엇인가)
최소제곱법, 평균제곱오차 그리고 경사하강법 등등직접 구현해 보았습니다.
하지만 실제로는 직접구현하지않죠 코딩에는 라이브러리가 있습니다. 딥러닝도 마찬가지로 라이브러리가 있는데 그중 많이 쓰이는 텐서플로우(tensorflow)가 있습니다.
텐서플로우(Tensorflow)
텐서플로우(tensorflow)란 구글에서 만든 오픈소스 딥러닝 전용 라이브러리 입니다. 프로그래밍 언어로는 Python과 C++을 쓰지만 아마 99%이상 대부분이 Python을 쓰지않을까 싶네요 텐서플로우는 안드로이드나 IOS 또는 라즈베리파이 같은 IOT기기에서 작동할수있는 Tensorflow lite 버전도 있습니다.
텐서플로우에서 쓰이는 용어
앞서 선형회귀에서 가설을 세운다고 했습니다. 즉 주어진 데이터에서 제일 적합하게 나타난 선을 구하는게 선형회귀입니다. 이때 첫번째로는 예측선을 세웁니다. 그리고 이 예측선이랑 주어진 데이터의 오차를 제곱해서 평균을 낸게 평균제곱오차이지요 이 평균제곱오차값이 제일 적게 나타나야 제일 적합한 선입니다. 이 오차를 수정하는 방법중 하나가 바로 경사하강법이죠
텐서플로우에서는 이 과정에서 쓰이는 용어가 각각 다릅니다. 먼저 예측선 y = ax + b 는 딥러닝에서는 가설함수라하고 다음과 같이 표기 합니다. $$ H(x) $$
또한 기울기 a는 변수 x에 어느정도 가중치를 곱하는지 결정하므로 가중치 라고 합니다. 표기는 $$ w $$ 로 합니다. 절편 b는 편향이라고하며 b로 표시합니다. 즉
y = ax + b ---> H(x) = wx + b
로 표기합니다.
또한 평균제곱오차처럼 실제 값과 예측값 사이의 오차에 대한 식을 손실함수라고 합니다.
또한 최적의 기울기와 절편을 구하기 위해 경사하강법을 이용했는데 이 경사하강법을 옵티마이저라고 합니다.
케라스(Keras)
케라스(Keras)란 거의 모든 종류의 딥러닝 모델을 간편하게 만들고 훈련시킬 수 있는 파이썬을 위한 딥러닝 프레임워크 입니다. 딥러닝을 좀더 쉽게 코드를 구현할수있게합니다. 앞으로 살펴볼 fit, compile, add 등등 여러가지 도움될만한 기능들이 있습니다.
텐서플로에서 단순선형회귀 구현하기
먼저 관련 API를 불러옵니다.
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
그다음 배열을 구현해줍니다.
x = np.array([2,4,6,8])
y = np.array([81,93,91,97])
그다음 keras 라이브러리에 있는 Sequential()을 model에 추가해줍시다. 해당 기능은 모델에 순차적으로 레이어를 쌓을수있게 해주는 기능입니다.
model = Sequential()
여기서 model이란 머신러닝 및 인공 신경망을 사용하여 주어진 작업을 수행하기 위한 계산그래프 혹은 네트워크를 의미합니다. 또한 입력데이터를 가져와 원하는 출력을 생성하기 위한 연산의 집합으로 정의됩니다.
이 모델로 데이터셋을 활용해 학습(훈련)을 하게 되는거고 이걸로 인식을 해서 몇% 확률로 사과다 바나나다 이렇게 인식을 하게 되는겁니다. 참고로 데이터셋은 kaggle이나 ai hub등에서 구할수있습니다.
이제 앞서 포스팅으로 살펴본 개념들을 모델에 다 적용시켜봅시다.
model.add(Dense(1, input_dim=1, activation='linear'))
model.compile(optimizer='sgd', loss='mse')
model.fit(x,y,epochs=2000)
가설함수는 단순선형회귀에서는 $$ H(x) = wx + b $$ 입니다. 이때 출력되는값이 성적 하나이므로 Dense 첫번째 인수에는 1을 입력합니다. 이때 Dense는 하나의 레이어를 의미합니다. 이 레이어들은 이전레이어와 현재 레이어에 있는 모든 뉴런들을 연결하죠
위 사진에서 제가 네모로 표시한 사각형 하나하나가 Dense라고 보면 됩니다.
그리고 입력될 변수도 1개이므로(공부한 시간) input_dim도 1이라고 입력합니다. 그다음 활성화 함수를 입력합니다. 선형회귀 이므로 linear를 입력합니다. 활성화 함수에 대해서는 추후에 포스팅을 하겠습니다.
그다음 optimizer에 경사하강법을 의미하는 sgd를 추가해주고 손실함수를 의미하는 loss에는 평균제곱오차를 의미하는 mse를 입력해줍니다. 그다음 epochs를 2000으로 설정합니다. 그다음 그래프를 출력해줍시다.
plt.scatter(x,y)
plt.plot(x,model.predict(x),'r')
plt.show()
그다음 임의의 시간을 집어넣어 몇시간 공부했을때 얼마정도 나오는지는 예측합니다.
여기선 7시간으로 잡겠습니다.
hour = 7
prediction = model.predict([hour])
print("%.f시간을 공부할 경우 예상 점수는 %.02f점입니다." % (hour,prediction))
텐서플로에서 다중선형회귀 구현하기
다중선형회귀도 크게 다를빠가 없습니다. 다만 입력변수가 1개에서 2개로 변했다는것입니다. 즉 공부한 시간에다가 과외한 받은 횟수를 더해야 됩니다. 따라서 입력변수 배열을 바꾸어야되고 input_dim을 1에서 2로 변경해줘야 됩니다. 그리고 테스트를 할때
hour 변수랑 private_class 변수를 넣어줘야된다는점 입니다.
코드로 상으로 변한점은
import numpy as np
import matplotlib.pyplot as plt
import tensorflow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
x = np.array([[2,0],[4,4],[6,2],[8,3]])
y = np.array([81,93,91,97])
model = Sequential()
model.add(Dense(1,input_dim=2,activation='linear'))
model.compile(optimizer='sgd',loss='mse')
model.fit(x,y,epochs=2000)
hour = 7
private_class=4
prediction = model.predict([[hour,private_class]])
print("%.f시간을 공부하고 %.f시간의 과외를 받은경우 ,예상점수 %.02f" %(hour,private_class,prediction))
보시다시피 입력변수 x 배열을 추가해주고 input_dim = 2로 변경 그다음 private_class를 추가해서 출력을 해주고 있습니다.
'Coding > AI' 카테고리의 다른 글
인공지능의 시작 퍼셉트론 아달리안 (0) | 2023.10.10 |
---|---|
로지스틱 회귀란 무엇인가 (0) | 2023.10.10 |
다중선형회귀란 무엇인가 (0) | 2023.10.07 |
경사하강법이란 무엇인가 (0) | 2023.10.04 |
파이썬으로 구현하는 평균 제곱 오차 (0) | 2023.09.27 |