선형 회귀분석은 데이터를 기반으로 함수 형태의 관계를 도출하며, 일반적으로 다음과 같은 수식 형태를 가진다
y: 예측하려는 종속변수
x1: 독립변수 (종속변수에 영향을 미치는 변수)
β0: 절편 (모델의 시작점)
β1: 기울기 (독립변수가 종속변수에 미치는 영향의 크기)
ϵ: 오차 (모델의 예측값과 실제값 간의 차이)
📌 함께 선형 회귀 모델을 만들어 봅시다!
```python
# 라이브러리 불러오기
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
```
- scikit-learn : 회귀 모델을 불러오는 라이브러리
- train_test_split : 데이터셋을 분리
📌 X와 Y 데이터가 있다고 가정하고, 모델을 훈련 시킬 데이터와 확인을 위한 테스트 데이터를 분리합니다.
```python
from sklearn.model_selection import train_test_split
# 데이터 준비
X = [[1], [2], [3], [4], [5]]
y = [2, 4, 6, 8, 10]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
📌 선형 회귀 모델을 생성하고, 학습 데이터를 이용해 모델을 학습시킨다.
```python
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
```
📌 모델을 이용해 예측을 수행하고, 성능을 평가하는 단계입니다.
```python
# 예측 및 평가
y_pred = model.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))
print("회귀 계수 (W):", model.coef_)
print("절편 (b):", model.intercept_)
```
📌 plot 그려보기
```python
# 그래프 그리기
plt.scatter(X, y, color='blue', label='Actual data') # 실제 데이터
plt.plot(X, model.predict(X), color='red', label='Regression line') # 회귀선
plt.scatter(X_test, y_test, color='orange', label='Test data') # 테스트 데이터
plt.title("Linear Regression Visualization")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.show()
```
### **다중 선형회귀 (Multiple Linear Regression)**
- **정의**:
두 개 이상의 독립변수(x)를 사용하여 종속변수(y)를 예측합니다.
- 예:
- 독립변수: 하루 공부 시간, 수면 시간
- 종속변수: 시험 점수
- **수식**:
$$
y = \beta_0 + \beta_1x_1 + \beta_2x_2 + ⋯ + \beta_nx_n + \epsilon
$$
- x1,x2,…,xn: 여러 독립변수 (공부 시간, 수면 시간 등)
- y: 종속변수 (시험 점수)
- **특징**:
- 각 독립변수(x)는 종속변수(y)에 개별적으로 영향을 미칩니다. (단점 : 정답이 너무 많이나온다)
- 모델은 모든 독립변수의 영향을 동시에 고려합니다.
📌 함께 선형 회귀 모델을 만들어 봅시다!
```python
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
```
📌 X와 Y 데이터가 있다고 가정하고, 모델을 훈련 시킬 데이터와 확인을 위한 테스트 데이터를 분리합니다.
```python
# 데이터 생성 독립 변수 (x1, x2)
X = np.array([[1, 2], [2, 3], [3, 5], [4, 6], [5, 8]])
# 종속 변수 (y)
y = np.array([3, 5, 7, 9, 11])
# 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
📌 선형 회귀 모델을 생성하고, 학습 데이터를 이용해 모델을 학습시킨다.
```python
# 모델 학습
model = LinearRegression()
model.fit(X_train, y_train)
```
📌 모델을 이용해 예측을 수행하고, 성능을 평가하는 단계입니다.
```python
# 결과 확인
print("회귀 계수 (W):", model.coef_)
print("절편 (b):", model.intercept_)
# 예측
y_pred = model.predict(X_test)
print("예측 값:", y_pred)
```
### 과적합이 발생하는 이유
- **모델이 너무 복잡**할 때: 너무 많은 파라미터가 있거나, 너무 깊은 신경망을 사용할 때 과적합이 발생할 수 있습니다. 이 모델은 훈련 데이터를 지나치게 잘 맞추려 하여, 실제로는 예측력이 떨어집니다.
- **훈련 데이터가 부족**할 때: 훈련 데이터가 적으면 모델이 그 데이터를 과도하게 학습하여, 새로운 데이터에 대한 일반화 능력이 떨어집니다.
- **노이즈가 많은 데이터**: 데이터에 잡음이나 이상치가 있을 때, 모델이 이 잡음까지 학습하게 되면 과적합이 일어납니다.
### 과적합을 방지하는 방법
1. **모델의 복잡도 줄이기**: 너무 많은 파라미터를 가진 모델 대신, 간단한 모델을 사용합니다.
2. **더 많은 훈련 데이터 확보**: 데이터가 많을수록 모델이 훈련 데이터에 과도하게 맞추는 것을 방지할 수 있습니다.
3. **정규화(Regularization)**: L1, L2 정규화 같은 기법(릿지 라쏘)을 사용해 모델의 복잡도를 제어할 수 있습니다.
4. **교차 검증**: 모델을 여러 번 테스트하여 과적합 여부를 확인하고, 모델을 개선합니다.