AI/모두의 딥러닝

딥러닝 입문 - 최소제곱법, 평균제곱오차, 딥러닝의 기본 연산(method of least squares, Mean squared error)

LiDARian 2021. 5. 8. 13:38
반응형

참고도서 : 모두의 딥러닝, 제2판(조태호, 2020)

개발환경 : google colab

 

 

 

데이터를 입력하고 분석하는 과정을 training이라고한다. 텅빈 좌표평면에 data를 하나씩 놓고 이를 분류하는 과정이다.

 

이 data들을 분류하는 과정을 training하여 분류 경계선을 찾는 것이 machine learning의 목표다.

 

# 파일 선택을 통해 예제 데이터를 내 컴퓨터에서 불러옵니다.
from google.colab import files
uploaded = files.upload()
my_data = 'ThoraricSurgery.csv'

# keras function
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# library
import numpy as np
import tensorflow as tf
# 라이브러리는 가져올 때 import를 사용

# 실행마다 같은 결과 출력하기 위해 설정한다.
np.random.seed(3)
tf.random.set_seed(3)

# patient data upload
Data_set = np.loadtxt(my_data, delimiter = ",")
# delimiter가 data구분해주는 문자

# X,Y dataset distributing
X = Data_set[:,0:17]
Y = Data_set[:,17]

# deeplearning structure setting and run
model = Sequential()
model.add(Dense(30, input_dim = 17, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))

# deeplearning running
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(X, Y, epochs = 100, batch_size = 10)

google colab의 경우 만드시 colab 내부 라이브러리를 이용해 data file을 호출해야한다. 안그럼 에러뜬다...

 

from google.colab import files
uploaded = files.upload()
my_data = 'ThoraricSurgery.csv'

 


 


 

딥러닝에서 가장 기본적인 연산 두가지 : 선형회귀, 로지스틱회귀 (linear regression, logistic regression)

예측선을 긋는다는 것이 결국엔 선형회귀이다.

 

하나의 종속변수와 이에 영향을 주는 독립변수가 있다고 할 때

독립변수가 하나면 simple linear regression

여러개면 multiple linear regression

 


예측선은 y = ax + b로 표현될 것이다. 여기서 a, b의 값을 알아야한다.

a, b 값을 구하는 방법 중 자주 쓰이는 방법은 아니지만... 최소제곱법 공식을 소개한다. (Least_Square_Method, LSM)

 

a = net(x편차*y편차)/net(x편차^2)

b = y의평균 - (x의평균*a)

 

원리는 이 링크 : https://youngji.medium.com/%EC%B5%9C%EC%86%8C%EC%A0%9C%EA%B3%B1%EB%B2%95-least-squared-method-f7357990329f

 

 

import numpy as np

# x 값과 y값
x=[2, 4, 6, 8]
y=[81, 93, 91, 97]

# x와 y의 평균값
mx = np.mean(x)
my = np.mean(y)
print("x의 평균값:", mx)
print("y의 평균값:", my)

# 기울기 공식의 분모
# 아래 링크 참고할 것
# https://stackoverflow.com/questions/47464211/what-does-the-x-for-x-in-syntax-mean
# https://web.archive.org/web/20180309053826/http://www.secnetix.de/olli/Python/list_comprehensions.hawk
divisor = sum([(mx - i)**2 for i in x])

# 기울기 공식의 분자
def top(x, mx, y, my):
    d = 0
    for i in range(len(x)):
        d += (x[i] - mx) * (y[i] - my)
    return d
dividend = top(x, mx, y, my)

print("분모:", divisor)
print("분자:", dividend)

# 기울기와 y 절편 구하기
a = dividend / divisor
b = my - (mx*a)

# 출력으로 확인
print("기울기 a =", a)
print("y 절편 b =", b)


# x의 평균값: 5.0
# y의 평균값: 90.5
# 분모: 20.0
# 분자: 46.0
# 기울기 a = 2.3
# y 절편 b = 79.0
divisor = sum([(mx - i)**2 for i in x])

이 부분에 관해선 아래 링크를 참고하는 것이 좋을 것이다.

stackoverflow.com/questions/47464211/what-does-the-x-for-x-in-syntax-mean

web.archive.org/web/20180309053826/www.secnetix.de/olli/Python/list_comprehensions.hawk


최소제곱법은 입력이 여러개일 때에는 사용하기 어렵다. 그래서 다중 입력이 발생할 경우 선을 긋고 그 선의 오차값을 iterational한 방법으로 줄여나간다. 이를 평균 제곱 오차(Mean Square Error, MSE)라고 한다.

 

평균 제곱 오차를 사용하는 과정은 일단 선긋고 점점 오차를 맞춰가는 과정을 따른다.

오차를 보정한 선이 앞선 선보다 더 좋은지 판단하는 과정이 필요하다 = 오차가 작은 쪽으로 바꾸는 알고리즘이 필요하다 = 편차 제곱의 합이 작아지게 한다

 

오차의 합 = NET((y - y_avg)^2)

이 식을 또 평균으로 나눠주면 평균 제곱 오차(MSE)라고 한다..

 

선형회귀는 이 MSE를 찾아 경사하강법(gradient descent)를 통해 작게 만들어주는 작업.

 

import numpy as np

#가상의 기울기 a와 y 절편 b
fake_a_b=[3,76]

# x 값과 y값
data = [[2, 81], [4, 93], [6, 91], [8, 97]]
x = [i[0] for i in data]
y = [i[1] for i in data]

# y=ax + b에 a,b 값 대입하여 결과를 출력하는 함수
def predict(x):
   return fake_a_b[0]*x + fake_a_b[1]

# MSE 함수
# y, y_hat은 array가 입력될 수도 있다.
def mse(y, y_hat):
   return ((y - y_hat) ** 2).mean()

# MSE 함수를 각 y값에 대입하여 최종 값을 구하는 함수
def mse_val(predict_result,y):
   return mse(np.array(predict_result), np.array(y))

# 예측값이 들어갈 빈 리스트
predict_result = []

# 모든 x값을 한 번씩 대입하여 predict_result 리스트완성.
for i in range(len(x)):
   predict_result.append(predict(x[i]))
   print("공부시간=%.f, 실제점수=%.f, 예측점수=%.f" % (x[i], y[i], predict(x[i])))

# 최종 MSE 출력
print("MSE 최종값: " + str(mse_val(predict_result,y)))

# 출력
# 공부시간=2, 실제점수=81, 예측점수=82
# 공부시간=4, 실제점수=93, 예측점수=88
# 공부시간=6, 실제점수=91, 예측점수=94
# 공부시간=8, 실제점수=97, 예측점수=100
# MSE 최종값: 11.0

 

 

반응형