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)