Python으로 알아보는 선형 회귀
scikit-learn으로 알아보는 Linear Regression 2020-06-13
주의! Caution!
해당 게시글은 Archive된 게시글 입니다.
Archive된 사유는 다음 중 하나에 해당 됩니다.
  • 작성 된지 너무 오랜 시간이 경과 하여, API가 변경 되었을 가능성이 높은 경우
  • 주인장의 Data Engineering으로의 변경으로 질문의 답변이 어려워진 경우
  • 글의 퀄리티가 좋지 않아 글을 다시 작성 할 필요가 있을 경우
이 점 유의하여 게시글을 참고 하시길 바랍니다.

머신 러닝을 통해 해결 할 수 있는 문제는 매우 다양합니다. 지도 학습을 통한 분류 문제의 해결, 회귀 분석 을 통한 값의 예측, 비지도 학습을 통한 군집화 등등 많은 문제가 있습니다.

만약 당신이 집을 팔려고 한다고 가정 하겠습니다. 당신의 집은 화장실 갯수에 따라, 사는 지역에 따라, 역과의 거리에 따라 종속적으로 집의 가격이 바뀔 것 입니다. 이 아이디어에서 착안한 것이 선형 회귀 입니다.

DD차원의 벡터 독립 변수 XX가 존재한다고 가정 하면, 그에 따른 종속 변수 yy 가 있다고 가정하여, 선형 상관 관계를 모델링 하는 것이 선형 회귀 입니다. 선형 회귀의 가장 기본 형태인 직선 함수를 식으로 도식화해보면 다음과 같습니다.

y=w0+w1x1+...+wDxDy = w_0 + w_1x_1 + ... + w_Dx_D

선형 회귀에 더 자세히 알고 싶다면...
https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%ED%9A%8C%EA%B7%80

코드로 구현하기

일단 이를 구현하는 방법은 매우 간단합니다! 우선 scikit-learn을 우선 설치 합니다.

$ pip install -U scikit-learn

그 다음 sklearn 모듈 안에 있는 linear_model을 import 합니다.

from sklearn import linear_model

그 다음 linear_model에 있는 LinearRegression 객체를 호출 후, fit() 메소드를 이용하여 데이터를 학습합니다. 첫 번째 인자로는 입력 값 list 객체를, 두 번째 인자로는 출력 값 list 객체를 넣습니다. 단, 입력 값 리스트에 있는 원소들의 차원은 전부 다 일치 하여야 합니다.

여기서 fit() 메소드는 경사 하강법을 이용, wxy\sum \left|wx-y\right|의 값을 최대한 줄이는 방향으로 학습 합니다.

reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [1, 2, 3])

coef_ 어트리뷰트로 w1,w2w_1, w_2 값을 확인 할 수 있습니다. 입력 값 리스트에 있는 원소들의 차원 수에 따라 가변 적으로 늘어 나는 것을 확인 할 수 있습니다. 또한, intercept_ 어트리뷰트로 w0w_0 값을 확인 할 수 있습니다.

  • In
reg_2d = linear_model.LinearRegression()
reg_2d.fit([[0, 0], [1, 1], [2, 2]], [1, 2, 3])
print(reg_2d.coef_, reg_2d.intercept_)

reg_3d = linear_model.LinearRegression()
reg_3d.fit([[0, 0, 0], [1, 1, 1], [2, 2, 2]], [1., 2.5, 4])
print(reg_3d.coef_, reg_3d.intercept_)

  • Out
[0.5 0.5] 1.0
[0.5 0.5 0.5] 1.0000000000000002

다항 회귀

가지고 있는 데이터가 직선보다 복잡한 형태일 경우, 각 특성의 거듭제곱을 새로운 특성으로 추가하고, 이렇게 새롭게 만들어진 특성에 대해 선형 모델을 훈련시키는 다항 회귀 방법을 사용 할 수 있습니다. sklearn.preprocessing 모듈 내의 PolynomialFeatures 클래스를 이용 하여 거듭제곱의 특성을 새로 추가 할 수 있습니다.

  • In
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import numpy as np

X = np.random.random((100, 2))
y = np.array([X[i][0] ** 2 + X[i][1] + 1 for i in range(100)])  # y = x_1^2 + x_2 + 1

poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)
print(X[0])  # [x_1, x_2]
print(X_poly[0])  # [x_1, x_2, x_1^2, x_1*x_2, x_2^2]

lin = LinearRegression()
lin.fit(X_poly, y)
print(lin.intercept_, lin.coef_)

  • Out
[0.0800759  0.82814432]
[0.0800759  0.82814432 0.00641215 0.0663144  0.68582302]
0.9999999999999999 [ 7.06703197e-16  1.00000000e+00  1.00000000e+00  6.66133815e-16
 -5.68989300e-16]

마치며

선형 회귀를 할 때, 훈련 하는 모델은 다양한 형태가 존재 하기 때문에, 더 알고 싶은 사람은 다음 링크를 참조 해 주세요.
https://scikit-learn.org/stable/modules/linear_model.html

Recent Posts in Machine-Learning Category