카테고리 없음

내일배움캠프_[머신러닝]3회차 수업

iron-min 2025. 10. 27. 21:30

1. 오늘 배운것

 

1) 다중공산성

VIF:  독립변수들끼리 서로 상관성이 얼마나 높은지(=다중공선성) 를 확인하는 지표

R제곱 : VIF는 독립변수들끼리 서로 상관성이 얼마나 높은지(=다중공선성) 를 확인하는 지표

 

 

 

코드예시)

import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
import statsmodels.api as sm

# 예시 데이터 (X1, X2, X3는 독립 변수라고 가정)
data = pd.DataFrame({
    'X1': [10, 20, 30, 40, 50],
    'X2': [15, 25, 35, 45, 55],
    'X3': [12, 22, 33, 44, 53]
})

# 1. 독립 변수 행렬 준비
X = data[['X1', 'X2', 'X3']]

# 2. 상수항 추가 (회귀분석을 위해 반드시 필요)
X = sm.add_constant(X)

# 3. VIF 계산
vif = pd.DataFrame()
vif["변수"] = X.columns
vif["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]

print(vif)

 

 

2) 선형회귀

선형 회귀분석은 데이터를 기반으로 함수 형태의 관계를 도출하며, 일반적으로 다음과 같은 수식 형태를 가진다

 

 

  • 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
  • scikit-learn : 회귀 모델을 불러오는 라이브러리
  • train_test_split : 데이터셋을 분리
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)

 

# 예측 및 평가
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()

 

2) 다중선형회귀

두 개 이상의 독립변수를 사용하여 종속변수를 예측합니다.

 

 

 

코드예시)

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)
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)

 

3) 모델 성능 평가

평균 제곱 오차 (MSE, Mean Squared Error)

  • 설명: 실제 값과 예측 값 간의 차이를 제곱하여 계산한 후 평균을 구하는 값입니다. 예측이 정확할수록 MSE 값이 작아집니다.
  • 즉, MSE 값은 0에 가까울수록 모델이 실제 값을 잘 예측하고 있다는 뜻 실제값 3

 

코드예시)

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, Root Mean Squared Error)

설명: 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)

 

 

결정계수(R^2, R-squared)

설명: 모델이 실제 값의 변동성을 얼마나 잘 설명하는지를 나타내는 지표입니다. R² 값이 1에 가까울수록 모델이 잘 작동한다고 평가할 수 있습니다. 0 불량 1 정상 예측값이 0.5 실제값 0.6 ⇒ 0.1 r2 = 1 ⇒ 100% r2 ⇒ 0.9 ⇒ 90%

 

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)

 

4) 릿지 회귀

  • Ridge 회귀 (L2 정규화)
    • Ridge 회귀 (L2 정규화)는 선형 회귀 모델에 L2 정규화를 추가한 형태
    • L2 정규화는 모델의 가중치(회귀 계수) 크기가 너무 커지지 않도록 벌점(penalty)을 추가하는 방식

Ridge 회귀가 중요한 이유

  • 과적합 방지: 모델이 훈련 데이터에 과도하게 맞추는 것을 막아 새로운 데이터에서 더 좋은 예측을 할 수 있도록 돕습니다.
  • 모델 복잡도 감소: 불필요하게 큰 가중치들이 생기지 않도록 하여, 보다 간단한 모델을 유지합니다.

장점

  • 모델의 안정성을 높여 예측의 신뢰도를 증가시킵니다.
  • 여러 특성이 있는 데이터에서 특성 간 상관 관계를 잘 처리할 수 있습니다.

코드예시)

from sklearn.linear_model import Ridge

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

# 예측
y_pred = ridge_reg.predict(X)

 

 

5) 라쏘 회귀

    • Lasso 회귀는 Ridge 회귀와 비슷하게 선형 회귀의 확장된 형태로, 과적합을 방지하고 모델을 더 간단하게 만들어 성능을 향상시키는 기법
    • Lasso 회귀는 그 외에도 가중치에 벌점을 추가하고, 이 벌점이 가중치를 0으로 만들도록 유도함 ⇒ 중요하지 않은 특성들이 0 모델에서 제외 (x1 ⇒ 음주 x2 ⇒ 과속 )
    • Lasso 회귀 (L1 정규화)

Lasso 회귀가 중요한 이유

  • 과적합 방지: 모델이 훈련 데이터에 과도하게 맞추는 것을 방지하고, 새로운 데이터에 대해서도 잘 예측할 수 있도록 도와줍니다.
  • 특성 선택: 중요하지 않은 특성을 자동으로 제거하여 모델을 더 단순하게 만듭니다. 이로 인해 해석이 용이해지고, 불필요한 변수들을 제거할 수 있습니다.
  • 모델 간소화: 많은 특성들 중 중요한 특성만 남기게 되어 모델이 더 간결해집니다.

코드예시)

from sklearn.linear_model import Lasso

# 모델 학습
lasso_reg = Lasso(alpha=0.1)
lasso_reg.fit(X, y)

# 예측
y_pred = lasso_reg.predict(X)

 

 

6) 엘라스틱 회귀

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

 

코드예시)

from sklearn.linear_model import ElasticNet

# 모델 학습
model = ElasticNet(alpha=0.1, l1_ratio=0.5)  # l1_ratio=0.5: L1(절반_과 L2(절반)의 균형
#l1_ratio=0.3이라면? L1 정규화와 L2 정규화를 3:7 비율
model.fit(X, y)

# 예측
y_pred = model.predict(X)