관리 메뉴

DeseoDeSeo

[Machine Learning] 회귀, 선형 회귀 모델 본문

Python

[Machine Learning] 회귀, 선형 회귀 모델

deseodeseo 2023. 9. 7. 18:28

⛤ 회귀 계수( Regression coefficients ) 

      : 독립변수의 값에 영향

독립 변수 개수  회귀 계수의 결합
1개 : 단일 회귀 선형 : 선형 회귀
여러개 : 다중 회귀 비선형 : 비선형 회귀

회귀분석 : 시간에 따라 변화하는 데이터, 영향, 가설적 실험, 인과 관계 모델링 등에서 많이 사용.

                  종속 변수(목표)와 하나 이상의 독립변수(예측변수) 간 미래 사건을 예측하는 방법

                    연속형 변수들에 대해 두 변수 사이의 모형을 구한 뒤 적합도를 측정해 내는 분석법

                  ➜ 수치적 가치를 추정

 

  • 연속 숫자를 포함하는 머신러닝 문제 해결에 필수적, 딥 러닝 이론의 기초
  • 선형 모델 (Linear Model) : 입력 특성에 대한 선형함수를 만들어 예측을 수행
  • 다양한 선형 모델이 존재 (= 선을 그을 수 있는 방법이 다양하다.)
  • 분류와 회귀에 모두 사용가능
  • 기본식) 문제가 1개일때: y= wx +b
  • 문제가 p개일때 : y = w1x1 + w2x2 + ...+ wpxp + b
  • w : 가중치( 각 문제마다 다른 가중치가 적용됨 ) , b: 편향
단순 회귀 분석 Y = wx + b 하나의 종속변수, 하나의 독립변수
다중 회귀 분석  y = w1x1 + w2x2 + ...+ wpxp + b 하나의 종속변수, 여러 독립변수

 

☑ 선형회귀 

     :  종속변수가 연속인 경우.

     : 성적 데이터를 기반으로 선형회귀를 이해해보자.

 

성적 데이터 생성을 위한 라이브러리 꺼내오기
import pandas as pd
import matplotlib.pyplot as plt
성적 데이터 생성
data = pd.DataFrame([[2,20],[4,40],[8,80],[9,90]],
            index=['준화','철수','유리','민수'],
             columns=['시간','성적'])
data

MSE가 최소가 되는 최적의 w,b를 찾는 방법

  • MSE : 평균제곱오차(Mean Squared Error)  ➜ 비용함수(cost) 
  •           : 추측값에 대한 정확성을 추측하는 법( 평균과 제곱을 이용하여 오차 계산)
  •              0에 가까울수록 추측값이 원본에 가까워지기 때문에 숫자가 작을 수록 좋음.
    1. 수학 공식을 이용한 해석적 모델
    2. 경사하강법(XGBoost에서 오차 계산하는 방법)

 

 

 

        (1)  수학 공식을 이용한 해석적 모델

  • LinearRegression
  • 공식을 이용해서 적은 계산으로 한번에 최적의 선형함수를 찾는 방법
  • 공식이 완벽하지 않을 경우, 값을 못 찾을 수도 있고
  • 공식이 잘못되었을 경우 고칠 수 없다는 문제가 있음. ➜ 추후 규제를 접목 개선
from sklearn.linear_model import LinearRegression

# 모델 생성 및 하이퍼파라미터 설정
linear_model = LinearRegression() 

# 학습
linear_model.fit(data[['시간']],data['성적']) # 문제는 2차원, 정답은 1차원

 

y = wx + b ( 1개의 문제 )
# 기울기, 가중치 출력
print('기울기, 가중치: ', linear_model.coef_)

# 절편, 편향 출력
print('절편, 편향: ', linear_model.intercept_)

 ○ coef_ : 가중치(w)값 조회 가능

 ○ intercept_ : 편향(B) 조회 가능

예측
영지씨가 7시간 공부했을 때. 몇 점?
linear_model.predict([[7]])

☑ 가설함수

      : H(x)

함수 정의
def h(w,x):
    return w*x + 0

 

☑ 비용함수(Cost Function)

    :비용 =오차

      : 입력과 출력 간의 관계를 찾는 데 모델이 얼마나 잘못되어있는지 측정

비용 함수 정의
  •  data: 문제 값
  • target : 정답(실제값)
  • weight : 가중치
def cost(data, target, weight):
    #예측
    y_pre= h(weight,data)
    
    # 평균 제곱 오차 
    # : ((예측값 - 실제값)^2).mean()
    error = ((y_pre- target)**2).mean()
    return error

 

가중치에 따른 오차값 확인
cost(data['시간'],data['성적'],8)
cost(data['시간'],data['성적'],10)

가중치 변화에 따른 비용함수의 변화를 그래프로 확인
cost_list =[]

for w in range(5,16): # 5 ~ 15까지 가중치 변화
    err=cost(data['시간'],data['성적'],w)
    cost_list.append(err)
cost_list

비용함수(MSE) 그리기
plt.plot(range(5,16), cost_list) 
plt.show()

  • 경사 하강법
  • SGDRegressor
  • 점진적으로 오차가 작은 선형 함수를 찾아가는 방법
  • 오차를 수정하는 방향으로 그래프를 다시 그려줌.
  • 선형함수를 잘못 찾았을 경우 수정이 가능
  • 점진적으로 찾아가므로 계산량이 많아서 시간이 오래 걸림.
  • 학습율(learning rate)
    • 너무 크게 설정하면 오차가 커짐(발산)
    • 너무 작게 설정하면 국소 지역점에 빠져서 최적의 해를 찾지 못함.
from sklearn.linear_model import SGDRegressor

#모델 생성 및 하이퍼 파라미터 설정
    
sgd_model = SGDRegressor(max_iter=5000, # 가중치 업데이트
                          eta0=0.001,  # 학습률(learning rate)
                          verbose =1) 
 
#학습
sgd_model.fit(data[['시간']],data['성적'])
예측
sgd_model.predict([[7]])