본문 바로가기
Minding's Programming/Knowledge

[ML/DL] 선형회귀 (Linear Regression)

by Minding 2022. 1. 18.
728x90
반응형

인프런에서 무료강의 이벤트를 한다고 하여 여러 가지 강의를 들을 수 있게 되었다.

그 중 '머신러닝 처음 시작하기' 라는 강의를 들으면서 예전에 배웠던 내용들을 다시 한 번 복습하고자 한다.

강의내용만을 공부하기 보다는 스스로 찾아보고 학습하며 개념을 확실히 깨우치는 것이 목표이다.

 

[딥 러닝을 이용한 자연어 처리 입문]을 주로 참고했다.

https://wikidocs.net/21670

 

03) 선형 회귀(Linear Regression)

딥 러닝을 이해하기 위해서는 선형 회귀(Linear Regression)와 로지스틱 회귀(Logsitic Regression)를 이해할 필요가 있습니다. 이번 챕터에서는 머 ...

wikidocs.net

 


선형 회귀

출처 : 위키백과 [선형 회귀]

  • 선형회귀는 주어진 데이터로부터 x(독립변수)와 y(종속변수)의 관계를 가장 잘 나타내는 직선을 그리는 것
    • 독립변수 : 다른 변수의 값을 변하게 하는 변수
    • 종속변수 : 다른 변수에 의해서 값이 종속적으로 변하는 변수

 

단순 선형 회귀 (Simple Linear Regression Anlaysis)

단순선형회귀수식

 

  • 독립변수 x가 하나일 때 사용하는 회귀분석
  • w는 가중치(weight), b는 편향(bias)
    • (직선의 방정식에서) 가중치는 직선의 기울기, 편향은 절편을 의미함

 

다중 선형 회귀 (Multiple Linear Regression Anlaysis)

다중선형회귀 수식

 

  • 독립변수 x, 즉 Input이 여러개일 때 사용하는 회귀분석
  • 다중선형회귀에서 변수를 선택하는 방식
    • 전진선택법 : 상수모형으로부터 시작하여 중요순위를 정해 차례대로 모델에 변수를 추가
    • 후진제거법 : 가장 덜 영향을 준다고 생각하는 변수를 전체에서 1개씩 제거

 

 

선형 회귀의 가설(Hypothesis)

일반적인 선형회귀 수식

  • H(Hypothesis) : x와 y의 관계를 유추하기 위한 가설을 세운 것이므로 H로 표기
  • 선형회귀의 목적은 x와 y의 관계를 가장 잘 나타내는 직선을 그리는 일
    • 즉, 적절한 w(기울기)와 b(절편)을 찾아내는 일

 

 

비용함수(Cost function) - 평균제곱오차 (Mean Sqaured Error, MSE)

  • 비용함수 : w b를 찾기 위해서 실제값과 가설로부터 얻은 예측값의 오차를 계산하는 식
  • 비용함수 식의 값을 최소화하는 최적의 w b를 찾아내는 것이 머신러닝의 목표
  • 회귀 문제의 경우에는 주로 평균제곱오차(MSE)를 사용함
    • 오차는 각 x에서 실제값 y와 직선 상의 H(x)값의 차이를 말함
    • 오차를 단순히 더하면 양수/음수값이 섞여 오차의 절대적인 크기를 알 수 없음
    • 그렇기 때문에, 오차를 제곱하여 더하는 방법을 사용
    • 이를 데이터의 개수인 n으로 나누면 오차의 제곱합에 대한 평균을 구할 수 있음

평균제곱오차를 w와 b에 대한 비용함수로 재정의

  • 모든 점들과 오차가 클수록 MSE는 커지고, 오차가 작을수록 MSE는 작아짐
    • 즉, 비용함수를 최소화시키는 w와 b를 찾으면 데이터 관계를 가장 잘나타내는 직선 표현가능

 

 

옵티마이저(Optimizer) - 경사하강법 (Gradient Descent)

  • 옵티마이저 : 비용함수를 최소화시키는 w와 b를 찾는 알고리즘
  • 옵티마이저를 통해 적절한 w와 b를 찾는 과정을 학습(또는 훈련)이라고 함
  • 경사하강법은 가장 기본적인 옵티마이저

w와 cost(비용함수)의 관계를 그래프로 표현한 그림

  • 머신러닝의 목표는 맨 아래 부분의 w(와 b)값을 찾는 것
  • 경사하강법은 한 점에서의 순간변화율 (접선에서의 기울기) 개념을 사용하여 값을 수정
    • 접선의 기울기가 낮은 방향으로 w의 값을 변경하고, 다시 미분하기를 반복하며 학습
    • 접선의 기울기가 0이 되는 지점이 cost가 최소화 되는 지점

 

경사하강법 수식

  • 현재 w에서의 접선의 기울기와 alpha(학습률)를 곱한 값을 현재 w에서 빼서 새로운 w로 대체한다는 뜻

접선의 기울기가 음수일 때 / 0일 때 / 양수일 때

  • 기울기가 음수일 때, w값은 증가하게 됨 --> 접선의 기울기가 0인 방향으로 w값이 조정
    • 기울기가 음수라면, w-(-기울기) = w + 기울기 이므로
  • 기울기가 양수일 때, w값은 감소하게 됨 --> 접선의 기울기가 0인 방향으로 w값이 조정
  • 경사하강법 수식은 기울기가 양수/음수일 때 모두 접선의 기울기가 0인 방향으로 w를 조정함
  • b(bias)를 구하는 방식도 w를 구하는 방식과 같음 (b에 대해 편미분하여 경사하강법 적용)

 

학습률 (learning rate)

  • 학습률(lr)은 w의 값을 변경할 때 얼마나 크게 변경할지 결정 (0~1 사잇값을 가짐)
  • 학습률이 지나치게 높으면 w의 값이 발산되어 최소값을 찾을 수 없음

학습률을 지나치게 높게 설정했을 때

  • 학습률이 지나치게 낮으면 학습속도가 느려지는 현상이 나타남
  • 적절한 학습률 설정하는 것 또한 중요

 

 

선형회귀 모델 구현 실습

import numpy as np

# input이 하나인 선형회귀
height = np.array([183,150, 180, 190, 167, 177])
height = height.reshape(-1,1) # 2차원 값이 들어가야 하므로 2차원으로 reshape
math = np.array([85, 45, 80, 99, 45, 75])

# scikit learn에 있는 선형회귀모델 사용
from sklearn.linear_model import LinearRegression
line_filter = LinearRegression()

# x, y값 넣어줌
line_filter.fit(height, math)

# height값을 가지고 math를 예측한다는 뜻
score_predict = line_filter.predict(height)

# matplotlib을 이용하여 선형회귀식 나타냄
import matplotlib.pyplot as plt
plt.plot(height, math, 'x')
plt.plot(height, score_predict)
plt.show()

# 기울기와 절편 출력
print(line_filter.coef_)
print(line_filter.intercept_)

>>>
[1.43659871]
-179.18647439085035
# 성능 평가 (MSE 이용)
from sklearn.metrics import mean_squared_error

print("Mean Squared Error : ", mean_squared_error(score_predict, math))


>>>
Mean Squared Error :  58.722194596386494
# RMSE 이용 (Root MSE)
print("RMSE : ", mean_squared_error(score_predict, math)**0.5)

>>>
RMSE :  7.663040819177887
# 스코어 출력 (종속변수와 독립변수의 상관도가 높을수록 높은 점수)
print('score : ', line_filter.score(height, math))

>>>
score :  0.8548576034692816
728x90
반응형

댓글