숭어 개발 블로그

[머신러닝] Linear Model 본문

Machine Learning/선형 회귀

[머신러닝] Linear Model

숭어싸만코 2022. 9. 21. 10:43

Linear Model - Regression [ MSE :  Min Squared Error ]

 

입력 특성 (컬럼) 에 대한 선형함수 ( 선=예측값 ) 를 만들어 예측을 수행하는 모델

 

평균제곱오차(Mean Squared Error, MSE) : 이름에서 알 수 있듯이 오차(error)를 제곱한 값의 평균입니다. 오차란 알고리즘이 예측한 값과 실제 정답과의 차이를 의미합니다. 

 

 

 

 

 

 

오차 : 타깃값과 예측값의 기울기 차이 

 

h(x) = Wx + b  ==>  가설함수

 

 

 

 

 

 

(예측값 -실제값) => 오차

오차**2 의 평균값을 구한다.

 

=> cost (비용,loss)

 

 

 

 

 

 

 

 

 

#Linear Model 
- 입력 특성 (컬럼) 에 대한 선형함수 ( 선=예측값 ) 를 만들어 예측을 수행하는 모델

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt

data = pd.DataFrame([[2,20],
                    [4,40],
                    [8,80],
                    [9,90]], index = ['태양','병관','명훈','해도'],
                   columns = ['시간', '성적'])

data

# MSE ( 평균제곱오차 ) 값을 찾는 2가지 방법


## Linear Regression (수학공식을 이용한 해석적 모델)

from sklearn.linear_model import LinearRegression

l_model = LinearRegression()

l_model.fit(data[['시간']],data['성적'])  # 문제 2차원으로 넣어야 하기떄문에 [[]]fh df로 만들어준다 Series안됨

print(l_model.coef_)         # 가중치 (w)
print(l_model.intercept_)    # 절편 (b)

l_model.predict([[7]])


data['시간'].values.reshape(4,1)  # .reshape( 행의수, 열의수 ) ==> 2차원 데이터로 만들기

l_model.predict(data['시간'].values.reshape(4,1))

plt.plot(data['시간'],data['성적'],'*') # plt.plot(X축 리스트 , y축 리스트)

plt.plot(data['시간'],l_model.predict(data['시간'].values.reshape(4,-1)))

## 경사하강법

 

경사하강법

 

기울기가 낮은 방향으로 계속 수정

 

  • Learning rate 큰경우 : 빠르게 이동 , 크게 크게 수정
  • Learning rate  작은경우 : 조금씩 이동, 오래 걸린다. 

 

## 경사하강법

# H(X)
# 예측값

def h(w,x) : 
    return w*x+0   # 절편을 0으로 주고 진행

# cost
#  (시그마)(예측값-실제값)**2 의 평균

def cost(data,target, weight) :
    y_pre = h(weight, data)       # 예측값
    return ((y_pre - target)**2).mean()   # (예측값 - 실제값)**2 의 평균



cost(data['시간'],data['성적'],15)

weight_arr = range(-10,31)

cost_list = []

for i in weight_arr : 
    c = cost(data['시간'],data['성적'],i)
    cost_list.append(c)

cost_list    

plt.plot(weight_arr,cost_list)
plt.show()

 

 

plt.plot(weight_arr,cost_list)
plt.show()

 

 

 

==> 포물선 형태의 함수가 나온다.

 

 

 

 

 

from sklearn.linear_model import SGDRegressor

s_model = SGDRegressor(max_iter = 1000,    #가중치 업데이트 반복횟수 (epoch) 1000번을 다돌지 않고 의미가 없다고 생각되면 멈춘다.
                       eta0 = 0.01,        #학습률 (1 이하의 값)
                       verbose = 1         #학습 과정 확인(1:확인 , 0:확인안함)
                      )

s_model.fit(data[['시간']],data[['성적']])

# Norm : 가중치 , Biase :절편

s_model.predict([[7]])

print(s_model.coef_)  # 기울기
print(s_model.intercept_)  # 절편

 


Linear Model 장점

Linear Model 단점

Comments