머신러닝

머신 러닝 - 회귀 분석

핸들이없는8톤트럭 2022. 8. 19. 14:22
반응형

회귀 분석(Regression Analysis)

연속적인 출력 값을 예측하는 통계 분석 방법입니다. 1886년 프랜시스 골턴의 연구에서, 세대가 흘러도 자녀의 키는 전체의 평균으로 회귀하는 것을 관찰한 것에서 단어가 유래되었습니다. 회귀 분석의 입력 형식은 모델에 따라 다양한 형식이 될  수 있습니다. 예를 들면, 특징(feature), 예측 변수(predictor variable), 설명 변수(explanatory variable) 등이 있습니다. 회귀분석의 출력은 연속적인 출력 값이 됩니다.(실수값, 스칼라 값) 또한, 타겟(target), 반응 변수(response varialbe), 결과(outcome) 등도 회구 분석의 출력이 될 수 있습니다. 

 

선형 회귀(Linear Regression)

선형적인 관계에 있는 입력-출력 관계를 분석하는 방법입니다. 단순 선형 회귀(Simple Linear Regression)은 1개의 특징으로 1개의 연속적인 타겟을 예측하는 모델 입니다.

w1은 x라는 변수에 대해서 얼마만큼의 영향력을 가지는 가를 나타내는 수치입니다. w0는 변수랑 상관없이 지속적으로 존재하는 값이므로, 편향 값이라고 할 수 있습니다.

 

단순 선형 회귀의 학습

최적의 직선을 찾는 학습 매개변수를 찾는 것이 중요합니다. 매개변수 공간(parameter space)은 학습 매개변수(가중치와 편향)를 모아 놓은 벡터 공간입니다. 우리는 매개변수 공간의 최적의 수치를 찾아주어야 합니다. 이 때, 사용하는 방법이 바로 최소자승법(least squares method)입니다. 오차(error)의 제곱의 합이 최소가 되게 하는 학습 매개변수를 선택하는 최적화 방법입니다.

 

선형 회귀 모델의 구현

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression

data_x, data_y = make_regression(n_samples=100,
                                 n_features=1,
                                 noise=0.6,
                                 random_state=101)
print(data_x)
print(data_y)

lr = LinearRegression()
lr.fit(data_x,data_y)
print(lr.coef_)
print(lr.intercept_)
x_new= np.linspace(-3,3, 100).reshape(-1,1)
y_hat= lr.predict(x_new) # 새로운 입력값에 대한 예측값
plt.figure()
plt.scatter(data_x,data_y)
plt.plot(x_new,y_hat,'r-')
plt.show()

 

다중 선형 회귀(Multivariate Linear Regression)

M개의 특징으로 연속적인 타겟을 예측하는 모델입니다. 보조 변수를 이용해서 벡터의 내적으로 표현합니다. 단순 선형 회귀와 동일한 최소 자승법으로 학습을 진행하게 됩니다. 단순 선형회귀가 평면상의 직선을 예측하는 모델이라면, 변수가 2개인 다중 선형 회귀는 공간상의 평면을 예측합니다. 그 이상의 변수가 주어질 경우에는 M차원 공간에서의 (M-1)차원 초평면을 예측하게 됩니다.

 

손실함수와 경사하강법

경사하강법(Gradient descent method)

여러 차례 값을 업데이트하여 최적화된 해를 찾는 방법 중 하나입니다. 손실 함수(Loss function)을 학습 매개변수로 미분하여 업데이트 방향과 크기를 결정하게 됩니다.

 

손실함수(loss function)

최적화 문제에서 최소화(또는 최대화)하려는 목표가 되는 함수입니다.

 

선형 회귀 모델의 구현

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

np.random.seed(101)
x=np.random.randn(20)
y=np.random.randn(20)

X,Y = np.meshgrid(x,y)
Z = 1.3* X + 0.1 * Y +np.random.randn(*X.shape)
print(x.shape)
print(y.shape)
print(Z.shape)

model = LinearRegression()
feat = np.stack([np.reshape(X,-1), np.reshape(Y,-1)],axis=1)
label = np.reshape(Z,-1)
model.fit(feat,label)

fig=plt.figure()
ax = plt.axes(projection='3d')
ax.scatter(X,Y,Z)
plt.show()
반응형