비버놀로지

[회귀분석] Scikit-learn을 이용한 회귀분석 본문

인공지능 머신러닝

[회귀분석] Scikit-learn을 이용한 회귀분석

KUNDUZ 2022. 11. 3. 09:06
728x90

Scikit-learn을 이용한 회귀분석

기계학습 라이브러리 scikit-learn 을 사용하면 Loss Function을 최소값으로 만드는 β0\beta_0, β1\beta_1 을 쉽게 구할 수 있습니다.

주어진 데이터와 다음 선형 모델을 이용하여 최적의 β0\beta_0, β1\beta_1 값을 구해보겠습니다.

실습

  1. loss() 함수를 완성하세요. 앞서 구현한 함수를 그대로 사용할 수 있습니다.
  2. np.array(X).reshape(-1, 1) 명령어를 이용해 길이 10인 1차원 리스트 X  10 x  형태의 np.array로 변경하세요.
  3. 종속변수 Y는 독립변수 X에 대한 값이므로 reshape(-1, 1)을 할 필요가 없습니다. 리스트 Y를 np.array 형식으로 변경하세요.
  4. 모델을 학습합니다.
lrmodel = LinearRegression()
lrmodel.fit(train_X, train_Y)

5. 모델을 이용해 얻은 최적의 beta_0, beta_1 값과 Loss를 확인합니다.

Tips!

sklearn에서는 벡터와 행렬을 나타내는 방법으로 numpy 배열을 표준으로 사용하고 있습니다. 따라서 X와 Y를 각각 np.array로 변환해야 합니다.

하나의 속성(feature)에 여러가지 값(sample)을 가지는 경우, reshape(-1, 1)을 적용하여 열벡터로 만들어야 합니다. X는 하나의 종속변수 Y에 대한 여러 값을 가지므로 reshape(-1, 1)을 적용합니다.

reshape(-1, 1)은 reshape(10, 1)과 같은 기능을 합니다. 마치 ‘a[-1]은 a라는 리스트의 마지막 원소다’와 비슷한 맥락입니다.

import matplotlib as mpl
mpl.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression

import elice_utils
eu = elice_utils.EliceUtils()

def loss(x, y, beta_0, beta_1):
    N = len(x)
    
    '''
    이전 실습에서 구현한 loss function을 여기에 붙여넣습니다.
    '''


    x= np.array(x)
    y=np.array(y)
    total_loss = np.sum((y - (beta_0 * x + beta_1)) ** 2)
    
    return total_loss
    
X = [8.70153760, 3.90825773, 1.89362433, 3.28730045, 7.39333004, 2.98984649, 2.25757240, 9.84450732, 9.94589513, 5.48321616]
Y = [5.64413093, 3.75876583, 3.87233310, 4.40990425, 6.43845020, 4.02827829, 2.26105955, 7.15768995, 6.29097441, 5.19692852]

train_X = np.array(X).reshape(-1,1)
train_Y = np.array(Y)

'''
여기에서 모델을 트레이닝합니다.
'''
lrmodel = LinearRegression()
lrmodel.fit(train_X, train_Y)

'''
loss가 최소가 되는 직선의 기울기와 절편을 계산함
'''
beta_0 = lrmodel.coef_[0]   # lrmodel로 구한 직선의 기울기
beta_1 = lrmodel.intercept_ # lrmodel로 구한 직선의 y절편

print("beta_0: %f" % beta_0)
print("beta_1: %f" % beta_1)
print("Loss: %f" % loss(X, Y, beta_0, beta_1))

plt.scatter(X, Y) # (x, y) 점을 그립니다.
plt.plot([0, 10], [beta_1, 10 * beta_0 + beta_1], c='r') # y = beta_0 * x + beta_1 에 해당하는 선을 그립니다.

plt.xlim(0, 10) # 그래프의 X축을 설정합니다.
plt.ylim(0, 10) # 그래프의 Y축을 설정합니다.
plt.savefig("test.png") # 저장 후 엘리스에 이미지를 표시합니다.
eu.send_image("test.png")

 

 

 

728x90
Comments