본문 바로가기
머신러닝딥러닝/딥러닝

딥러닝(deeplearning) #2 - 선형회귀(MSE, RMSE)

by orangecode 2022. 4. 11.
728x90
선형회귀(linear Regression)이란?

X = 성적이 변화하는 '정보' 요소

Y = X값에 의해 변하는 성적

 

X값이 변함에 따라 Y값도 변한다는 정의 안에서

X = 독립변수(독립적으로 변할 수 있는 값)

Y = 종속변수(독립 변수에 따라 종속적으로 변하는 값)

 

선형회귀독립변수 X를 사용해 종속변수 Y의 움직임을 예측하고 설명하는 작업이다.

 

- 단순선형회귀(simple linear regression)

: 하나의 x값으로 y값을 설명가능 할 때 단순선형회귀라 한다.

- 다중선형회귀(multiple linear regression)

: 여러개의 x값으로 y값을 설명가능 할 때 다중선형회귀라 한다.

 

최소제곱법(method of least squares)

회귀 분석에서 사용되는표준 방식.

실험이나 관찰을 통해 얻은 데이터를 분석해, 미지의 상수를 구할 때 사용되는 공식

 

import numpy

# x, y 값 리스트로 만들기
# x = 공부시간(독립변수), y = 성적(종속변수)
x = [2,4,6,8]
y = [78, 81, 90, 93]

# x, y의평균값 구하기
mx = np.mean(x)
my = np.mean(y)

print("x 평균값:", mx)
print("y 평균값:", my)

numpy 라이브러리를 불러오고 x,y값 리스트로 생성하기

mx, my x,y의 평균값 구하기

 

# 분모구하기
divisor = sum([mx-i]**2 for i in x])

# 분자구하기
def top (x, mx, y, my):
	d = 0
    d +=(x[i]-mx)*(y[i]-my)
    return d
dividend = top(x, mx, y, my)

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

분모값 = (x각 원소값 - x평균값)**2 (제곱)

 

분자값 = (x각 원소값 - x평균값)*(y각 원소값 - y평균값)

# 기울기 a 구하기
a = divisor / dividend

# y절편 b 구하기
 b = my -(mx*a)
 
 print("기울기 a =", a)
 print("y절편 b =", b)

기울기 a = 분모/분자

y절편 b = y평균값 - 기울기*x평균값

 

평균제곱오차 MSE(Mean Squard Error)

추측값에 대한 정확성을 측정하는 방법

 

오차의 제곱을 평균으로 나눈 값

MSE가 0에 가까울수록 정확도가 높음

예측값, 실제값 차이는 차이값 면적의 평균

 

평균 제곱근 오차(RMSE, Root Mean Squared Error)

평균제곱오차MSE를 사용할 경우, 오차가 너무 커서 대용량 데이터 이용 시 불편함이 있다.

평균제곱오차에 제곱근을 씌워 평균제곱근오차(RMSE)를 사용한다.

선형회귀에서 RMSE를 가장 작게 만드는 a, b 값을 찾는 작업이라 할 수 있다.

 

ab = [3, 76]

# data list 만들기
# i[0] = list 첫번째 값, i[1] = list 두번째 값
data = [[2, 80], [4, 92], [6, 87], [8, 95]]
x = [i[0] for i in data]
y = [i[1] for i in data]

임의 기울기, y절편 값 ab = [3, 76]으로 설정

 

data x리스트, y리스트 만들기

 

def predict(x):
	return ab[0] * x + ab[1]

내부함수 생성 : predict()함수로 y=ax+b 일차함수 구현

 

# RMSE 공식
def rmse(p, a):
    return np.sqrt(((p-a)**2).mean())

# RMSE 공식에 데이터 대입
def rmse_val(predict_result, y):
    return rmse(np.array(predict_result), np.array(y))

predict_result = predict 결과 값이 들어감

 

predict결과값, y값이 각각 예측/실제 값으로 rmse() 함수 안에 들어감

 

# 최종갑 출력하기
# predict_result 빈 리스트만들기
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])))

predict_result = [] 빈 리스트를 만들어준다

 

for i in range(len(x)): 반복문으로 x값 반복하기

predict_result 빈리스트에 predict x값을추가해준다.

 

최종코드

# 최소제곱법(method of least squares)
import numpy as np

# X = 공부한시간, Y = 성적
# list 형식 정의
x = [2,4,6,8] 
y = [81, 93, 91, 97]

mx = np.mean(x)
my = np.mean(y)

print("x 평균값:", mx)
print("y 평균값:", my)

# 분모 
# (x 각 원소값 - x평균값) 제곱
divisor = sum([(mx-i)**2 for i in x])

# 분자
# (x 각 원소값 - x평균값)*(y 각 원소값 - y 평균값) 더하기
def top(x, mx, y, my):
    d=0
    for i in range(len(x)): # x개수만큼 실행
        d += (x[i] - mx) * (y[i] - my)
    return d
dividend = top(x, mx, y, my)
print("분모", divisor)
print("분자", dividend)

# 기울기 a
a = dividend / divisor

# y절편 b
b = my -(mx*a)

# 출력하기
print("기울기 a =", a)
print("y 절편 b", b)
# 평균제곱근 오차(root mean square error)
import numpy as np

# 기울기 a, y절편 b
ab = [3, 76]

# data list 만들기
# i[0] = list 첫번째 값, i[1] = list 두번째 값
data = [[2, 80], [4, 92], [6, 87], [8, 95]]
x = [i[0] for i in data]
y = [i[1] for i in data]

def predict(x):
    return ab[0]*x + ab[1]

# 평균제곱근 공식 -> python 함수로
# np.squr() = 제곱근, **2 제곱, mean() 평균값 구하기
def rmse(p, a):
    return np.sqrt(((p -a)**2).mean())

# rmse 함수에 데이터 대입해 최종값 구하기
def rmse_val(predict_result, y):
    return rmse(np.array(predict_result), np.array(y))

# 최종값 출력하기
# predict_result 빈 리스트 만들기
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])))
반응형

댓글