25.05.19 코딩 공부 시작

코딩 척척석박사 분들 피드백 환영합니다.

공대생이 코딩에서 살아남기

특강/머신러닝

[머신러닝] 3회차 회귀분석 (06.26)

코딩 아가 2025. 6. 26. 16:28

회귀분석이란?

종속변수(목표)와 독립변수(설명) 간의 관계 모델링 후 예측 및 통찰하는 통계적 기법

최적의 a,b 찾기

선형회귀란?

  • y: 예측하려는 종속변수
  • x1: 독립변수 (종속변수에 영향을 미치는 변수)
  • β0: 절편 (모델의 시작점)
  • β1: 기울기 (독립변수가 종속변수에 미치는 영향의 크기)
  • ϵ: 오차 (모델의 예측값과 실제값 간의 차이)
# 라이브러리 불러오기
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
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)
# 선형 회귀 모델 생성 및 학습
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
# 예측 및 평가
y_pred = model.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))
print("회귀 계수 (W):", model.coef_)
print("절편 (b):", model.intercept_)
# 그래프 그리기
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()

다중 선형회귀란?

  • x1,x2,…,xn: 여러 독립변수 (공부 시간, 수면 시간 등)
  • y: 종속변수 (시험 점수)
#라이브러리 준비하기
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 데이터 생성 독립 변수 (x1, x2)
X = np.array([[1, 2], [2, 3], [3, 5], [4, 6], [5, 8]])
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)
# 모델 생성 및 학습
model = LinearRegression()
model.fit(X_train, y_train)
# 결과 확인
print("회귀 계수 (W):", model.coef_)
print("절편 (b):", model.intercept_)
# 예측 및 평가
y_pred = model.predict(X_test)
print("예측 값:", y_pred)

경사하강법이란?

오차가 가장 작게 나오는 지점을 찾기 위해 가중치를 계속해서 업데이트 하는 방법

최적의 w,b 찾기

  1. 학습률(Learning Rate): 한번에 얼마나 큰 걸음을 내딛을지
  2. 경사(Gradient): 가장 가파른 내리막 계산 > 가중치 조절
  3. Local minima 문제

# 라이브러리 불러오기
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDRegressor
from sklearn.model_selection import train_test_split
# 데이터 생성 
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([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)
# 모델 학습 (SGDRegressor 사용)
# max_iter: 최대 반복횟수
# tol: 수렴 조건
model = SGDRegressor(max_iter=1000, tol=1e-3)  # max_iter: 최대 반복 횟수, tol: 수렴 조건
model.fit(X_train, y_train)
# 결과 확인
print("회귀 계수 (W):", model.coef_)
print("절편 (b):", model.intercept_)

# 예측
y_pred = model.predict(X_test)
print("예측 값:", y_pred)
# 그래프 그리기
plt.scatter(X, y, color='blue', label='실제 값')
plt.plot(X, model.predict(X), color='red', label='회귀 직선')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('SGDRegressor를 통한 선형 회귀')
plt.show()

모델 성능평가

평균 제곱 오차(MSE)

  • 실제 값과 예측 값간의 차이를 제곱하여 평균 구하기
  • 예측이 정확할수록 0에 가까움

from sklearn.metrics import mean_squared_error

# 예시 데이터 (실제 값과 예측 값)
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]

# MSE 계산
mse = mean_squared_error(y_true, y_pred)

# 결과 출력
print("MSE:", mse)

평균 제곱근 오차(RMSE)

MSE의 제곱근

from sklearn.metrics import mean_squared_error
import numpy as np

# 예시 데이터 (실제 값과 예측 값)
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]

# MSE 계산
mse = mean_squared_error(y_true, y_pred)

# RMSE 계산 (MSE의 제곱근)
rmse = np.sqrt(mse)

# 결과 출력
print("RMSE:", rmse)

결정 계수(R2, R-squared)

  • 실제 값의 변동성을 얼마나 잘 설명하는지
  • 모델이 잘 작동하면 1에 가까움

from sklearn.metrics import r2_score

# 예시 데이터 (실제 값과 예측 값)
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]

# R² 스코어 계산
r2 = r2_score(y_true, y_pred)

# 결과 출력
print("R² 스코어:", r2)

릿지 회귀 (Ridge) L2 정규화

가중치(회귀 계수)크기가 너무 커지지 않도록 벌점(penalty)을 추가하는 방법

람다(λ) = 싸이킷런(alpha) ⇒ 벌점의 강도

  • 작은 λ : 모델이 복잡해짐
  • 큰 λ : 모델이 단순해짐

  1. 과적합 방지
  2. 모델 복잡도 감소

>> 모델의 안정성, 특성 간 상관 관계 처리

from sklearn.linear_model import Ridge
# 모델 학습
ridge_reg = Ridge(alpha=1.0) #alpha는 벌점을 얼마나 강하게 적용할지 결정하는 값
ridge_reg.fit(X, y)
# 예측
y_pred = ridge_reg.predict(X)

라쏘회귀 (Lasso) L1 정규화

가중치를 0으로 만들도록 유도

람다(λ) = 코드(alpha) ⇒ 벌점의 강도

  • 작은 λ : 모델이 복잡해짐
  • 큰 λ : 모델이 단순해짐

  1. 과적합 방지
  2. 특성 선택
  3. 모델 간소화
from sklearn.linear_model import Lasso
# 모델 학습
lasso_reg = Lasso(alpha=0.1)
lasso_reg.fit(X, y)
# 예측
y_pred = lasso_reg.predict(X)

엘라스틱 회귀 (Elasticnet)

릿지 회귀(L2 정규화)와 라쏘 회귀( L1 정규화)를 결합한 선형 회귀 기법 이 기법은 두 정규화 기법의 장점을 모두 활용하는 모델

  • α = 0 이면, 릿지
  • α = 1 이면, 라쏘

from sklearn.linear_model import ElasticNet
# 모델 학습
elastic_net_reg = ElasticNet(alpha=0.1, l1_ratio=0.5)  # l1_ratio=0.5: L1과 L2의 균형
#l1_ratio=0.3이라면? L1 정규화와 L2 정규화를 3:7 비율
elastic_net_reg.fit(X, y)
# 예측
y_pred = elastic_net_reg.predict(X)