본문 바로가기
머신러닝 with Python

[머신러닝 with Python] 선형회귀(Linear Regression) / 최소제곱법(Least Square Methods) (1)

by CodeCrafter 2023. 9. 18.
반응형

이번에는 머신러닝의 기본 중 기본인 선형회귀에 대해서 알아보겠습니다. 

 

여기서 "선형"(Linear)은 말 그대로 선의 형태로 결과를 도출함을 의미하며

 

회귀(Regression)은 특정 상태로 돌아가는 것을 의미합니다. 

(이는 연어가 다시 태어난 곳으로 돌아가는 것을 회귀라 말하는 것과 큰 범주에서 같은 의미라 보시면 되겠습니다.)

 

 

 

1. 선형회귀(Linear Regression)란?

- 선형회귀는 머신러닝과 통계학에서 가장 기본적인 회귀분석 방법 중 하나로, 독립 변수와 종속 변수 간의 관계를 직선의 형태로 나타내는 것을 의미합니다. 

 

- 선형 회귀는 독립 변수가 1개인 경우를 단순선형회귀(Simple Linear Regression), 2개 이상인 경우를 다중선형회귀(Multiple)라고 부릅니다.

 

- 이러한 선형 회귀를 사용하는 이유는 대표적으로 2개 정도를 들 수 있는데요

 1) 예측 : 주어진 독립 변수(또는 특성/Feature)를 기반으로 종속 변수(또는 목표 변수/Target)을 예측하는 것을 말합니다. 이를 통해 미래 값을 예측하거나, 관심 있는 현상을 예측할 수 있습니다.

 2) 관계 분석 : 독립 변수와 종속 변수 간의 관계를 이해하고 설명하는 것을 말합니다. 이를 통해 변수 간의 상호작용과 영향을 파악하며, 데이터에 내재된 의미를 파악하는데 도움을 주는 것입니다. 

 

먼저, 시각화를 위해 파이썬을 활용해 단순선형회귀의 예제 데이터를 생성하여 회귀선을 만들어보겠습니다.

 

 

* 데이터 생성을 위해 numpy를, 시각화를 위해 matplotlib의 pyplot을, 선형회귀를 위해 사이킷런의 linear_model에서 Linear Regression을 임포트 합니다. 

* 이휘 랜덤한 데이터를 100개(X,y) 생성하고, 이를 시각화 해보겠습니다.

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

# 랜덤 시드 설정()
np.random.seed(0)

# 데이터 생성
X = 2 * np.random.rand(100, 1)  # 0에서 2 사이의 랜덤 값 100개 생성
y = 4 + 3 * X + np.random.randn(100, 1)  # 선형 관계에 랜덤 노이즈 추가

# 데이터 시각화
plt.scatter(X, y, alpha=0.6)  # 데이터 포인트 표시
plt.xlabel("Feature (X)")
plt.ylabel("Response (y)")
plt.title("An example of Linear Regression")

plt.show()

* 위 데이터를 보면, 선형성을 보이는데요 (직선식에 랜덤 노이즈를 주어 생성된 데이터를 만들었으므로 당연한 결과입니다.ㅎㅎ)

* 이를 가장 잘 설명하는 직선을 선형회귀를 통해 표현해보겠습니다.

 

# 데이터 시각화
plt.scatter(X, y, alpha=0.6)  # 데이터 포인트 표시
plt.xlabel("Feature (X)")
plt.ylabel("Response (y)")
plt.title("An example of Linear Regression")

# 선형 회귀 모델 선택 및 훈련
model = LinearRegression()
model.fit(X, y)

# 선형 회귀 시각화
plt.plot(X, model.predict(X), color='red', linewidth=2)  # 회귀 선 표시

plt.show()

* 다음과 같이 파란색 데이터를 잘 설명하는 빨간색의 직선 회귀선을 만들었습니다. 

 

* 해당 빨간선의 회귀식을 도출하면 아래와 같습니다.

print('Intercept : ',model.intercept_)
print('coefficient :',model.coef_)

* Intercept는 y의 절편을 의미하며, Coefficient는 X의 계수를 의미합니다. 

* 단순 선형 회귀 모델의 회귀식은 아래와 같습니다.

* 여기서 y_hat 은 종속 변수(예측값) / X는 독립 변수(입력 값) / b0는 절편 / b1은 기울기(coefficient or slope)를 의미합니다. 

* 즉, 위 선형 회귀에서 도출한 식은  y_hat = 4.221 + 2.968*X  입니다.

 

그렇다면, 이러한 식은 어떻게 도출하는 것일까요??

 

 

- 이는 "최소제곱법(Least Square Methods)"을 활용하는 것입니다. 

 

2. 최소제곱법(Least Square Methods)

 * 최소제곱법은 관측된 데이터와 회귀 모델의 예측값 사이 잔차(오차)를 최소화하도록 모델 파라미터(선형 모델의 경우, 절편과 기울기)를 조정하는 방식을 의미합니다. 

 

 * 즉, 아래 식에서

  1) 실제 데이터와 회귀선의 절편 사이의 거리를 최소화하는 절편인 bo

  2) 실제 데이터와 회귀선의 수직거리를 최소화하는 기울기 b1

 을 찾는 것을 말합니다. 

 

 * 이를 수식으로 표현하면 아래와 같습니다.

 

* 즉, 위 식을 최소화하는 b0와 b1을 찾는 것이며, 이는 주어진 식을 각 b0와 b1을 통해 편미분을 하여 편미분식이 0이 되는 값을 찾으면 됩니다. 세부 과정은 아래 포스팅을 참조하시기 바랍니다.

 

https://goodsarah.tistory.com/entry/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%B4%88-1-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80Linear-regression-%EA%B0%9C%EB%85%90

 

딥러닝 기초 - (1) 선형 회귀(Linear regression) 개념

지난 시간에 알아봤듯, 딥러닝은 머신러닝의 일부이며, 머신러닝의 가장 기초는 선형회귀에서부터 출발한다고 보면 된다. 대학에서 통계학 수업을 듣지않았다면 다소 생소할 개념일 수 있으나

goodsarah.tistory.com

 

 

 이를 통해 도출된 b0와 b1을 구하는 식은 아래와 같습니다.

 

 

* 위 내용을 파이썬 코드로 시각화해보면 아래와 같습니다.

 

 

import numpy as np
import matplotlib.pyplot as plt

# 예제 데이터 생성
X = np.array([1, 2, 3, 4, 5])  # 독립 변수
y = np.array([2, 3, 4, 3, 5])  # 종속 변수

# 회귀선 생성
X_mean = np.mean(X)
y_mean = np.mean(y)
b1 = np.sum((X - X_mean) * (y - y_mean)) / np.sum((X - X_mean) ** 2)
b0 = y_mean - b1 * X_mean

# 예측값 계산
y_pred = b0 + b1 * X

# 잔차 계산
residuals = y - y_pred

# 데이터와 회귀선 시각화
plt.scatter(X, y, label='Real Data')  # 데이터 포인트 표시
plt.plot(X, y_pred, color='red', label='Regression Line')  # 회귀선 표시
plt.xlabel("Feature (X)")
plt.ylabel("Response (y)")
plt.title("Visualizaiton of Simple Linear Regression & Residual")
plt.legend()

# 잔차를 수평선으로 표시
for i in range(len(X)):
    plt.plot([X[i], X[i]], [y[i], y_pred[i]], color='gray', linestyle='--')

plt.show()

* 먼저 데이터 생성을 위한 numpy와 시각화를 위한 pyplot을 임포트합니다.

* 이후 numpy를 활용해 데이터를 생성하고, 회귀선 또한 생성합니다. 

* 이를 통해 도출된, 기울기와 절편을 활용해 예측값을 만들고, 잔차(= 실제값 - 예측값)을 계산하여 이를 시각화 해봅니다.

 

 

다음 포스팅에서는 이렇게 알아본 선형회귀를 활용해 다중선형회귀를 예시를 구현해보겠습니다!

반응형

댓글