LittleDeveloper

모두의 딥러닝 3장 선형회귀법 본문

AI

모두의 딥러닝 3장 선형회귀법

lemonjelly 2022. 1. 8. 14:41

 필자는 전필로 선형대수를 들으면서 '선형회귀'라는 것을 처음 배웠다. 그리고 그 다음 학기에 확률통계를 배우면서 선형회귀 수식과 그래프를 엑셀과 매트랩으로 간단하게 나타나는 것을 배웠다.

처음에는 고등학교 수학 수준에서 금방 이해가 되니까 딱히 어려울 것도 없어서 '왜 배워야 하지..'라는 의문조차 안 들었었는데, 작년 여름 방학에 머신러닝 입문 강의(모두의 딥러닝x)를 듣다가 '오..이래서 배우는구나..'라는 마음가짐으로 전환되었다.

 

머신러닝의 지도학습 기법에는 크게 2가지가 있다. 

 1. 회귀

 2. 분류

 

그럼 머신러닝은 뭐고.. 지도학습이란 무엇인가.. (이거는 따로 정리해서 포스트할 예정! 조금만..기다려...~)

(일단 머신러닝의 기법은 지도학습, 비지도학습, 강화학습 이렇게 3가지로 나뉜다. 정도만 알면 좋음)

 


 

이번 시간에는 1. 회귀 를 알아보자.

 

만약 우리가 아이스크림 가게를 운영하는 주인이라고 해보자. (필자는 레샤를 좋아함)

아이스크림을 주문하려고 하는데, 예상되는 실제 판매량만큼 주문하고 싶다. 

이때 만약 평균 기온을 활용하여 미래 판매량을 예측할 수 있다면 어떨까?

 

1) 문제 정의 

 - 데이터: 과거 평균 기온(X)과 그에 따른 아이스크림 판매량(Y)

  (여기서 2개의 데이터(=평균 기온, 판매량은 선형적인 관계를 가지고 있다고 가정하자.)

 

 X : 평균 기온( 'C )  Y: 아이스크림 판매량 (만개)
10 40
13 52.3
20 60.5
25 80

2) 해결 방안

=> "오 데이터 간에 이런 관계가 있으니 '회귀 분석 알고리즘'을 사용하면 좋겠군" 이라는 결론을 내릴 수가 있다.

 

 

<잠깐! 용어 정리> 

*선형적(linear):  직선처럼 똑바른 도형, 또는 그와 비슷한 성질

 -수학에서 선형성에 대한 정의는 아래와 같다

 

출처: 위키피디아

 

(+선형성은 공업수학에서 매우매우 중요한 개념이다. 세상에는 비선형적인 관계의 데이터나 시스템이 훨씬 많지만, 이를 선형적인 형태로 바꿔야 인간이 이를 가공/변형하는데 유리해진다. 공수 외에 선대.. 확통.. 신시.. 등등 수학에서 자주 언급되는 개념이니 꼭 기억해둘 것.)

  

*회귀(regression): 하나의 종속 변수와   이상의 독립 변수 사이에 나타나는 관계를 최소 제곱법으로 추정하는 방법

 

 

 

다시 돌아와서, 그러면 '회귀 분석'이 뭐하는 건데? 라는 궁금증이 생긴다.

'회귀 분석'은 데이터를 가장 잘 설명하는 모델(fit)을 찾아 입력값에 따른 미래 결과값을 예측하는 알고리즘이다.

아래의 엑셀 데이터(X, Y)와 그래프를 보자. (X: 평균 기온, Y: 판매량) 이 그래프를 통해서 우리는

엑셀로 그린 선형회귀 그래프

 

 Y ≒ aX+b

 

라는 데이터 간의 관계를 찾을 수 있고, 여기서 적절한 a, b 값을 찾아야 데이터를 가장 잘 설명하는 모델을 찾을 수 있다. (기준이 되는 점선: Y=aX+b)

 

-> 예측은 완벽할 수 없기 때문에, 최대한 잘 '근사'해야 한다. ( =이 아니라 ≒ 를 쓰는 이유. )

따라서 각 데이터의 실제값과 모델이 예측하는 값의 차이를 최소한으로 하는 선을 찾아야 한다.

 

여기서 X값(입력값)이 하나면 '단순 선형 회귀' , 여러 개면 '다중 선형 회귀' 라고 한다.

 

 

이번 시간에는 우선 단순 선형 회귀만 알아보기로 하자.

 

위의 예제(X:평균 기온-Y:판매량)를 Colab에서 코드를 통해 a,b 값을 확인해보자.

우선 python 라이브러리 중 하나인 numpy를 불러오자.

그리고 x에는 평균 기온의 배열을, y에는 판매량의 배열을 할당하자.

import numpy as np

x=[2,3, 4.5, 6, 7.8, 9.6, 12, 12.4, 13, 15, 15.2, 16.8, 19.4, 20, 21, 23.2, 24] #평균 기온
y=[8, 18,24,20,30,40,46,50,55,59,64,56,69,59,70,67,78] #판매량

 

x값들의 평균을 mx, y값들의 평균을 my라고 하자.

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

최소제곱법 공식을 활용하여 일차 함수의 기울기 a와 y절편 b를 구해보자.

최소제곱법 공식

divisor=sum([(i-mx)**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) #분자
a = dividend/divisor
b=my-(mx*a)

a,b값을 출력해보면,

print("기울기 a =",a)
print("y 절편 b =",b)

기울기 a = 2.8855306460718015

y 절편 b = 9.649656335203048

 

위와 같이 나온다! Excel에서 구한 a, b 값과 똑같음을 알 수 있다.

 

 

우리는 이렇게 최소제곱법으로 가장 적합한(adequate) 직선을 얻을 수 있었는데, 만약 입력값 x가 매우 많다면 이 공식만으로는 예측이 정확하지 않을 수 있다. 따라서 이 직선의 정확도를 평가하기 위한 방법으로 '평균 제곱 오차(MSE)' 방식이 사용된다. 

평균제곱오차(MSE) 공식

실제값과 예측값의 차이를 '오차'라고 한다면, 이 오차들의 합을 도수 n으로 나눈 것을 바로 MSE라고 한다.

 

이제 코드를 통해 mse를 표현해보자. 예를 들어 a=3.2, b=10이라는 예상치가 있다고 치자. (y=3.2x+10)

그리고 y=ax+b에 a와 b 값을 대입하면 출력하는 함수인 predict를 정의하자.

MSE 함수는 공식 그대로 작성하면 되고, 이 MSE 함수에 각 y값(판매량)을 대입하여 최종 값을 구하는 함수인 mse_val를 정의하자.

 

마지막으로 예측 값이 들어갈 빈 리스트를 만들고, 모든 x값을 y=3.2x+10에 넣어서 나오는 y값을 이 리스트에 저장한다.

 

이것을 엑셀에서도 똑같이 확인할 수 있다!! MSE가 거의 똑같게 도출된다.

 

다음 시간에는 오차를 줄이는 방법인 '경사 하강법'에 대해 알아보자!