머신 러닝을 통해 해결 할 수 있는 문제는 매우 다양합니다. 지도 학습을 통한 분류 문제의 해결, 회귀 분석 을 통한 값의 예측, 비지도 학습을 통한 군집화 등등 많은 문제가 있습니다.
만약 당신이 집을 팔려고 한다고 가정 하겠습니다. 당신의 집은 화장실 갯수에 따라, 사는 지역에 따라, 역과의 거리에 따라 종속적으로 집의 가격이 바뀔 것 입니다. 이 아이디어에서 착안한 것이 선형 회귀 입니다.
차원의 벡터 독립 변수 가 존재한다고 가정 하면, 그에 따른 종속 변수 가 있다고 가정하여, 선형 상관 관계를 모델링 하는 것이 선형 회귀 입니다. 선형 회귀의 가장 기본 형태인 직선 함수를 식으로 도식화해보면 다음과 같습니다.
선형 회귀에 더 자세히 알고 싶다면...
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()
메소드는 경사 하강법을 이용, 의 값을 최대한 줄이는 방향으로 학습 합니다.
reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [1, 2, 3])
coef_
어트리뷰트로 값을 확인 할 수 있습니다. 입력 값 리스트에 있는 원소들의 차원 수에 따라 가변 적으로 늘어 나는 것을 확인 할 수 있습니다. 또한, intercept_
어트리뷰트로 값을 확인 할 수 있습니다.
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_)
[0.5 0.5] 1.0
[0.5 0.5 0.5] 1.0000000000000002
가지고 있는 데이터가 직선보다 복잡한 형태일 경우, 각 특성의 거듭제곱을 새로운 특성으로 추가하고, 이렇게 새롭게 만들어진 특성에 대해 선형 모델을 훈련시키는 다항 회귀 방법을 사용 할 수 있습니다. sklearn.preprocessing
모듈 내의 PolynomialFeatures
클래스를 이용 하여 거듭제곱의 특성을 새로 추가 할 수 있습니다.
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_)
[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