Simple Linear Regression(단순 선형 회귀)
‘하나의 요인이 얼마나 영향을 주는지’를 설명하고 싶을 때 이용한다.
Simple Linear Regression(단순 선형 회귀)은 하나의 독립 변수(X)를 이용해 하나의 종속 변수(Y)를 예측하는 가장 기본적인 회귀 분석 기법이다. 이 모델은 데이터가 직선(linear)의 형태로 관계를 가진다고 가정하며, 아래와 같은 수식으로 표현된다.

언제 사용할까?
- 변수 간 관계가 선형이라고 가정할 수 있을 때
- 하나의 변수로 목표 값을 예측하고자 할 때
- 모델 해석이 중요한 경우 (ex. 가격 변화에 영향을 주는 요인 분석)
Numpy를 통한 단순 선형 회귀 모델 구현하기
class SimpleLinearRegression:
# 클래스 선언 및 초기화
def __init__(self, learning_rate=0.01, epochs=100):
self.w = np.random.randn() # 가중치(weight), np.random.randn()로 정규분포에서 임의값 초기화
self.b = np.random.randn() # 편향(bias), 위와 동일하게 초기화
self.history = [] # 학습 하는 동안, 손실값(MSE)을 저장할 리스트 = 손실값 저장용
self.learning_rate = learning_rate # 학습률, 파라미터를 얼마나 빠르게 업데이트할지 결정
self.epochs = epochs # 반복 학습 횟수
# 모델 학습
def fit(self, X, y):
n = len(X) # n : 데이터 포인트 개수
for epoch in range(self.epochs): # 반복 학습 시작
y_pred = self.w * X + self.b # 예측값 계산
error = y_pred - y # 오차 계산
mse = np.mean(error ** 2) # MSE(평균 제곱 오차) 계산
self.history.append(mse)
# Gradient(기울기/경사) 계산
# 오차에 대해 w와 b를 얼마나 수정해야하는지 계산
dw = (2/n) * np.sum(error*X) # 가중치의 기울기(얼마나 변화하는지 알려준다.)
db = (2/n) * np.sum(error) # 편향의 기울기(얼마나 변화하는지 알려준다.)
# 파라미터 업데이트
# 경사하강법을 이용해 w와 b 조정
self.w = self.w - self.learning_rate * dw
self.b = self.b - self.learning_rate * db
# 예측 함수
def predict(self, X):
return self.w * X + self.b
# 모델 생성 및 학습
Simple_lr = SimpleLinearRegression()
Simple_lr.fit(X[:50], y[:50])
# 예측
y_pred = Simple_lr.predict(X[:50])
# 시각화
plt.figure(figsize = (12, 4))
plt.subplot(1,2,1)
plt.plot(Simple_lr.history)
plt.xlabel("epochs")
plt.ylabel("MSE")
plt.title("MSE")
plt.subplot(1,2,2)
plt.scatter(X, y, label="Data")
plt.plot(X[:50], y_pred, color="red", label="fitted line")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.title("lr regression")
plt.show()

사이킷런을 통한 단순 선형 회귀 모델 구현하기
from sklearn.linear_model import LinearRegression
np.random.seed(42)
X = np.random.rand(100, 1)
y = 3 * X.squeeze() + 2 + np.random.randn(100) * 0.1
lr = LinearRegression()
lr.fit(X, y)
print(f"기울기: {lr.coef_[0]}, 절편: {lr.intercept_}")
기울기: 2.9540226772876967, 절편: 2.021509615754674
# 시각화
plt.scatter(X, y)
plt.plot(X, model.predict(X), color='red')
plt.title("Simple Linear Regression")
plt.show()

넘파이로 구현한 단순 선형 회귀가 예측이 잘 안된 이유?
처음엔 단순 선형 회귀를 직접 구현해도 sklearn과 같은 결과가 나올 거라 생각했습니다.
그런데 똑같은 데이터를 넣었는데도, 제가 만든 모델은 이상하게 평평한 선만 그려지는 거예요.
왜 그런 걸까 고민하다가 학습 방식의 차이가 있다는 것을 깨달았습니다..
제가 만든 모델은 경사하강법으로 w와 b를 업데이트하는데, 초기값이 안 좋거나 학습률이 너무 작으면 제대로 수렴하지 않아서 엉뚱한 예측선을 그렸던 것이었습니다.
반면 sklearn의 LinearRegression은 수학적으로 한 번에 최적값을 계산하니, 항상 데이터에 딱 맞는 선을 그릴 수 있었던 거죠.
결국, 모델이 안 맞는 게 아니라, 학습이 덜 된 것이었습니다. 이걸 확인하고 나니, 손실 그래프와 파라미터 변화까지 다르게 보이더라고요. 직접 구현할수록, 모델을 “이해하고 조정하는 법”을 배운다는 걸 다시 느꼈습니다.
'📙 Fundamentals > ML&DL' 카테고리의 다른 글
| 딥러닝의 성능 향상을 위한 하이퍼파라미터 종류 (1) | 2025.04.14 |
|---|---|
| 회귀 모델 | 로지스틱 회귀_Logistic Regression (0) | 2025.04.12 |
| 퍼셉트론(Perceptron) (0) | 2025.04.10 |
| 차원 축소 기법 : 주성분 분석(PCA) VS 요인 분석 (0) | 2025.04.07 |
| 앙상블(Ensemble) (0) | 2025.04.06 |