본문 바로가기
머신러닝

[실무에 쓰는 머신러닝 기초] 3. 회귀

by 쿙이콩 2025. 7. 2.
728x90
반응형

3-1. 값을 예측하고 싶어? 회귀! 

☑️ 1. 회귀 분석 개요

✔️ 회귀 분석? 종속변수(Y) - 하나 이상의 독립변수(X) 간 관계 추정, 연속형 종속변수를 예측하는 통계/머신러닝 기법

✔️ 지도학습

  • 회귀 결과값 연속형 (숫자 값)
  • 분류 결과값 이산형 (클래스 라벨)

✔️ 사용하는 이유

  1. 미래 값 예측 판매량, 주가, 온도 등 실수값 예측에 사용
  2. 인과 관계 해석(통계 관점)  특정 독립변수가 종속변수에 미치는 영향 해석
  3. 데이터 기반 의사결정 추세(trend) 파악, 자원배분 등

✔️ 희귀모델 대표적 활용 사례

  • 경제 주식 가격 예측, 판매량 예측
  • 건강 혈압, 콜레스테롤 수치 예측
  • 제조업
    불량률, 생산량 예측 (ex. 온도, 습도, 기계 속도 등의 데이터 이용)
    생산 설비에 부착된 센서(온도, 진동, 소음 등)에서 수집된 데이터 바탕으로 장비 고장 시점을 사전에 예측

 

 


☑️ 2. 회귀 모델 평가 방법  ⭐ 중요

MSE 
Mean Squared Error
RMSE
Root Mean Squared Error
MAE
Mean Absolute Error

결정계수
  • 예측값과 실제값의 차이 제곱하여 평균
  • 오차가 클수록 제곱에 의해 더 큰 벌점이 매겨지므로, 큰 오차에 특히 민감
  • 평균 제곱 오차라고도 하며, 회귀 모델 평가에서 매우 자주 사용됨
  • MAE와 달리 제곱을 통해 큰 오차에 가중치를 더 주는 특징
  • 오차가 클수록 패널티가 커지므로, 큰 오차가 중요한 문제에서 자주 사용

  • 예측값과 실제값의 차이 절댓값으로 측정한 후 평균
  • 예측이 평균적으로 실제값에서 얼마나 벗어났는지 직관적으로 표현

  • yˉ: 종속변수의 평균
  • 값의 범위
    0 ~ 1 (음수 가능)
  • 해석
    1
    까깝 = 학습된 모델이 데이터를 잘 설명
    0 = 모델이 종속변수를 전혀 설명하지 못 함

 


☑️ 3. 선형 회귀 ( Linear Regression )

✔️ 개념

가정 독립변수(X)와 종속변수(Y)가 선형적(=일차 방정식 형태)로 관계 맺고 있다

장점 해석 간단, 쉬운 구현

단점 데이터가 선형이 아닐 경우 예측력 down 

 

✔️ 회귀식 ( 일차 방정식 )

β0: 절편(intercept)

βi: 각 독립변수의 회귀계수(coefficient) = 가중치 

 

✔️ 예시

데이터 모델
X=공부 시간(시간), Y=시험 점수
ex) (1시간, 40점), (2시간, 50점), (3시간, 60점), (4시간, 70점)...
Y^ = 30 + 10 * X
1시간 공부 → 40점, 2시간 공부 → 50점, ...

 

⭐ 선형 회귀 모델 학습 과정

1️⃣ 가중치 (회귀계수) 초기화

2️⃣ 손실함수 (Loss Function) 설정 주로 MSE(Mean Sqaured Error) 사용

3️⃣ 최적화 가중치 업데이트

  • 최소자승법 수학적인 방법
  • 경사하강법 Gradient Descent (SGDRegressor)

4️⃣ 학습 완료 후 β0,β1,…를 얻어서 새로운 입력 값에 대한 예측 수행

 

⭐ 선형 회귀 코드 (들어가기 전에)

더보기

데이터 로드

load_diabetes() 당뇨병 예측용 데이터셋 로드

X 특성(독립변수)들 - 대문자

y 타겟(종속변수) - 소문자

 

학습/테스트 데이터 분리

train_test_split   X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 )

test_size = 0.2 80%는 학습용, 20%는 테스트용

random_state=42  고정하면 재현 가능성을 높일 수 있음

 

LinearRegression 모델 학습 및 예측

.fit() 메서드로 학습

.predict() 테스트 세트에 대한 예측 수행

mean_squared_error / r2_score로 예측 성능을 평가

 

SGDRegressor 모델 학습 및 예측

확률적 경사하강법 기반의 SGDRegressor 모델

max_iter=1000, tol=1e-3 등의 파라미터는 데이터와 상황에 따라 조정 가능

mean_squared_error / r2_score로 예측 성능을 평가

⭐ 선형 회귀 코드 (선형회귀 모델)

import numpy as np
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.liner_model import LinearRegression, SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squarred_error, r2_score

--------------------
★ 1. 데이터 로드
--------------------
diabetes = load_diabetes()
X = diabetes.data   ★ X 대문자
y = diabetes.target ★ y 소문자

print(X.shape) 출력 (442, 10)
print(y.shape) 출력 (442,)

--------------------
★ 2. 학습/테스트 데이터 분리
--------------------
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)

print(X_train.shape) 출력 (353, 10)
print(X_test.shape)  출력 (353,)
print(y_train.shape) 출력 (89, 10)
print(y_test.shape)  출력 (89,)

--------------------
★ 3. 선형회귀 LinearRegression 모델
--------------------
lin_reg = LinearRegression() 객체생성
lin_reg.fit(X_train, y_train)
출력 LinearRegression 파랑색네모칸

--------------------
★ 4. 예측
--------------------
y_pred_lin = lin_reg.predict(X_test) 객체에 predict함수

--------------------
★ 5. 성능 측정 MSE, r2_score
--------------------
mse_lin = mean_squared_error(y_test, y_pred_lin)
r2_lin = r2_score(y_test, y_pred_lin)

--------------------
★ 6. 평균 비율 오차
--------------------
def MPE(y_true, y_pred):
    return np.mean((y_true - y_pred) / y_true) * 100

--------------------
★ 7. 결과 확인 및 해석 : 아래 사진 및 본문
--------------------
print("[LinearRegression 결과]")
print("가중치(coefficient):", lin_reg.coef_)  가중치 .coef_    언더바
print("절편(intercept):", lin_reg.intercept_) 절편 .intercept_ 언더바
print("MSE:", mse_lin)                        MSE
print("R2 점수:", r2_lin)                     r2_lin
print("평균 비율 오차 : ", MPE(y_test, y_pred_lin)) MPE (함수 직접 정의)

 

💡 선형 회귀 코드 (선형회귀 모델) - 해석 

✔️ 가중치 : 각 숫자는 입력 변수(특성) 별로 예측값에 미치는 영향력을 나타냄

- - - 양수 : 해당 변수 증가 = 예측값 증가 / 음수 : 반대

- - - 예) s5 (736.20), s3 (-931.49) 등은 절대값이 크므로 당뇨병 진행 예측에 중요한 역할을 함

✔️ 절편 151.35

- - - 모든 입력 변수가 0일 때 모델이 예측하는 기본값

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

- - - 예측값과 실제값 차이(오차)의 제곱 평균

- - - 값 작을수록 모델 예측이 실제값에 가까움 = 여러 모델의 MSE를 비교해 더 작은 값이 더 좋은 성능을 의미

✔️ R² 점수 (설명력) 0.45

- - - 의미 :  모델이 전체 데이터 변동성의 약 45%를 설명

- - - 1에 가까울수록 설명력 높음, 0이면 예측력 없음

✔️ MPE (평균 비율 오차) -12.89

- - - 의미 : 예측값이 실제값보다 평균적으로 약 12.9% 낮게 나옴

- - - 음수 : 다소 낮게 예측하는 경향 있음

⭐ 선형 회귀 코드 (SGDRegressor 모델)

import numpy as np
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.liner_model import LinearRegression, SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squarred_error, r2_score

--------------------
★ 1. 데이터 로드
--------------------
diabetes = load_diabetes()
X = diabetes.data   ★ X 대문자
y = diabetes.target ★ y 소문자

print(X.shape) 출력 (442, 10)
print(y.shape) 출력 (442,)

--------------------
★ 2. 학습/테스트 데이터 분리
--------------------
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)

print(X_train.shape) 출력 (353, 10)
print(X_test.shape)  출력 (353,)
print(y_train.shape) 출력 (89, 10)
print(y_test.shape)  출력 (89,)

--------------------
★ 3. SGDRegressor 모델
--------------------
sgd_reg = SGDRegressor(max_iter = 6000, tol = 1e-3, random_state = 42)
sgd_reg.fit(X_train, y_train)
결과 SGDRegressor 파랑색 창

--------------------
★ 4. 예측
--------------------
y_pred_sgd = sgd_reg.predict(X_test)

--------------------
★ 5. 성능 측정 MSE, r2_score
--------------------
mse_sgd = mean_squared_error(y_test, y_pred_sgd)
r2_sgd = r2_score(y_test, y_pred_sgd)

--------------------
★ 6. 평균 비율 오차
--------------------
def MPE(y_true, y_pred):
    return np.mean((y_true - y_pred) / y_true) * 100
    
--------------------
★ 7. 결과 출력 및 해석
--------------------
print("[SGDRegressor 결과]")
print("가중치(coefficient):", sgd_reg.coef_)   가중치.coef_
print("절편(intercept):", sgd_reg.intercept_)  절편 .intercept_
print("MSE:", mse_sgd)                         MSE
print("R2 점수:", r2_sgd)                      r2_score
print("평균 비율 오차 : ", MPE(y_test, y_pred_sgd)) MPE (함수 직접 정의)

 

💡 선형 회귀 코드 (SGDRegressor 모델) - 해석 

✔️ 가중치 : 각 숫자는 입력 변수(특성) 별로 예측값에 미치는 영향력을 나타냄

- - - 양수 : 해당 변수 증가 = 예측값(당뇨병 진행도) 증가 / 음수 : 반대

- - - 예) 'bmi', 'bp', 's5', 's6' 등은 양의 계수로 예측값을 높이고, 'sex', 's2', 's3' 등은 음의 계수로 예측값을 낮춥

✔️ 절편 151.51

- - - 모든 입력 변수가 0일 때 모델이 예측하는 기본값

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

- - - 예측값과 실제값 차이(오차)의 제곱 평균

- - - 값 작을수록 모델 예측이 실제값에 가까움 = 여러 모델의 MSE를 비교해 더 작은 값이 더 좋은 성능을 의미

✔️ R² 점수 (설명력) 0.45

- - - 의미 :  모델이 전체 데이터 변동성의 약 45%를 설명

- - - 1에 가까울수록 설명력 높음, 0이면 예측력 없음

✔️ MPE (평균 비율 오차) -14.91

- - - 의미 : 예측값이 실제값보다 평균적으로 약 14.9% 낮게 나옴

- - - 음수 : 다소 낮게 예측하는 경향 있음

 

728x90

☑️ 4. 다항 회귀 ( Polynomial Regression )

✔️ 개념

비선형적인 관계를 다항식(polynomial) 형태로 모델링

 

✔️ 회귀식 ( 고차항 )

β0: 절편(intercept)

βi: 각 독립변수의 회귀계수(coefficient) = 가중치

단순 선형항(X)뿐만 아니라 X^2, X^3,... 같은 고차항을 추가해 비선형 패턴 학습 가능

 

✔️ 예시

제조 공정 온도와 반응률 관계가 곡선 형태인 경우

건강 데이터에서 나이와 특정 지표(근육량 등)이 단순 선형보다 곡선 형태로 나타나는 경우

 

✔️ 주의

과적합 (overfitting) 고차항을 무작정 늘리면 훈련 데이터 과도하게 맞춰짐 = 일반화가 잘 되지 않는 상황 발생 - feat) '앙상블' 참고

따라서 모델 복잡도와 일반화 성능 간 균형 중요

 

⭐ 다항 회귀 코드 (들어가기 전에)

더보기

데이터 생성 (make_friedman1)

n_samples=1000 1000개 샘플 /  n_features=5 5개 특성 생성 / noise=1.0 타겟 값에 약간의 랜덤 잡음 추가

 

학습/테스트 데이터 분리

train_test_split 70% 데이터로 학습, 30% 데이터로 테스트

random_state=42  매번 코드를 실행해도 같은 결과가 재현되도록 함

 

단순 선형회귀 모델 학습 및 예측

비선형성을 고려하지 않고 LinearRegression만 적용했을 때의 성능을 MSE, R^2, MPE로 측장

 

다항회귀 (Polynomial Regression)

PolynomialFeatures(degree=2) 2차 항까지 고려, 다시 선형회귀를 적용하는 파이프라인을 구성

비선형 패턴을 어느 정도 학습할 수 있으므로, 단순 선형회귀보다 더 좋은 성능이 기대(물론 과적합 위험도 존재)

 

결과 비교

MSE, R^2 등을 비교하여 단순 선형회귀 대비 다항회귀가 Friedman1 데이터셋에서 어떤 차이를 보이는지 확인

만약 더 높은 차수(예: 3차, 4차)를 적용하거나, 다른 비선형 모델(예: 랜덤 포레스트, SVM 회귀 등)을 사용하면 성능이 달라질 수 있음

⭐ 다항 회귀 코드 

import numpy as np
import pandas as pd
from sklearn.datasets import make_friedman1
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.liner_model import LinearRegression
from sklearn.metrics import mean_squarred_error, r2_score
from sklearn.pipeline import Pipeline

--------------------
★ 1. 비선형 데이터 생성 (make_friedman1)
n_samples 샘플 개수
n_features 특성 개수
noise 잡음 크기
--------------------
X, y = make_friedman1(n_samples = 1000, n_features = 5, noise = 1.0, random_state = 42)

print(X.shape) 출력 (1000, 5)
print(y.shape) 출력 (1000)

--------------------
★ 2. 학습/테스트 데이터 분리
--------------------
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)

print(X_train.shape)  출력 (700, 5)
print(y_train.shape)  출력 (700,)
print(X_test.shape)   출력 (300, 5)
print(y_test.shape)   출력 (300,)

--------------------
★ 3. 단순 선형회귀 모델 (비교용)
--------------------
lin_reg = LinearRegression()
lin_reg = fit(X_train, y_train)
y_pred_lin = lin_reg.predict(X_test)

mse_lin = mean_squared_error(y_test, y_pred_lin)
r2_lin = r2_score(y_test, y_pred_lin)

def MPE(y_true, y_pred):
    return np.mean((y_true - y_pred) / y_true) * 100

print("[단순 선형회귀 결과]")  
print("MSE:", mse_lin)      결과 MSE: 5.730...
print("R2:", r2_lin)        결과 R2 : 0.770...
print("평균 비율 오차 : ", MPE(y_test, y_pred_lin)) 결과 평균 비율 오차 : -1.672...

--------------------
★ 4. Polynomial Regression (찐)
--------------------
☆ 모델
poly_model = Pipeline([
   ("poly", PolynomialFeatures(degree = 2, niclude_bias = False)),
   ("lin_reg", LinearRegression())
])

☆ 훈련 및 예측
poly_model.fit(X_train, y_train)
y_pred_poly = poly_model.predict(X_test)

☆ 성능 측정
mse_poly = mean_squared_error(y_test, y_pred_poly)
r2_poly = r2_score(y_test, y_pred_poly)

☆ 평균 비율 오차
def MPE(y_true, y_pred):
    return np.mean((y_true - y_pred) / y_true) * 100

☆ 결과 확인
print("[다항회귀(2차) 결과]")
print("MSE:", mse_poly)      결과 MSE: 2.553...
print("R2:", r2_poly)        결과 R2 : 0.897...
print("평균 비율 오차 : ", MPE(y_test, y_pred_poly)) 평균 비율 오차 : -1.688...

💡 다항 회귀 코드 - 해석 

단순 선형회귀 다항회귀
MSE: 5.730
평균 제곱 오차(Mean Squared Error)
예측값과 실제값의 차이의 제곱 평균
값이 낮을수록 예측이 실제값에 가깝다는 뜻


R2: 0.770
결정계수(R²)
모델이 데이터의 변동성 중 약 77%를 설명
1에 가까울수록 설명력 좋음

평균 비율 오차: -1.672
예측값이 실제값보다 평균적으로 약 1.67% 낮게 나왔다는 뜻
음수, 예측이 실제보다 다소 낮게 나오는 경향이 있음을 의미
MSE: 2.554
단순 선형회귀보다 MSE가 크게 감소
모델이 데이터의 비선형적 특성을 더 잘 포착, 예측 정확도 높아짐

R2: 0.898
결정계수가 0.898로, 약 89.8%의 변동성을 설명
단순 선형회귀보다 설명력이 크게 향상
1에 가까울수록 설명력 좋음

평균 비율 오차: -1.689
예측값이 실제값보다 평균적으로 약 1.69% 낮게 나옴
단순 선형회귀와 비슷한 수준의 편향을 보이지만, 오차 자체는 더 작아짐!
다항회귀(2차)는 단순 선형회귀보다 비선형적 데이터 구조를 더 잘 반영
예측 오차(MSE)가 크게 감소
설명력(R²)이 크게 증가
평균 비율 오차
는 두 모델 모두 음수로, 예측값이 실제값보다 약간 낮게 나오는 경향

 


☑️ 5. 고급 회귀 기법 - Lasso & Ridge Regression

선형 회귀에 규제(Regularization) 항을 추가 = 과적합 방지

Lasso 라쏘 회귀  Ridge 릿지 회귀 
패널티 = 가중치 절댓값합(L1 Norm)을 페널티로 추가
효과: 가중치를 0으로 만들어 변수 선택 효과
(Feature Selection) 효과
패널티 = 가중치 제곱합(L2 Norm)을 페널티로 추가
효과: 가중치가 너무 커지지 않도록 방지
(가중치 값을 부드럽게 줄임)

⭐ 릿지회귀 & 라쏘회귀 코드 (들어가기 전에)

더보기

데이터 로드

fetch_california_housing() 캘리포니아 주택 가격 예측용 데이터

X는 특성 행렬(8개 특성), y는 주택 가격(타겟)

 

학습/테스트 데이터 분리

train_test_split 전체 데이터의 80% 학습용, 20% 테스트용으로 분리

random_state=42로 고정하여 재현 가능성 높임

 

Ridge 회귀 L2 규제항을 포함하는 Ridge 모델

alpha가 클수록 규제 강도가 세어져, 모델 가중치(계수)들의 크기를 더욱 제약

학습 후, 예측 결과에 대해 MSER^2 점수를 계산

 

Lasso 회귀 L1 규제항을 사용하는 Lasso 모델입니다.

alpha가 클수록 일부 가중치가 정확히 0으로 수렴(특성 선택 효과)

마찬가지로 MSE, R^2를 통해 성능 평가

⭐ 릿지회귀 & 라쏘회귀 코드

import numpy as np
import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.liner_model import Ridge, Lasso
from sklearn.metrics import mean_squarred_error, r2_score

--------------------
★ 1. 데이터 로드
--------------------
housing = fetch_california_housing()
X = housing.data
y = housing.target

print(X.shape) 출력 (20640, 8)
print(y.shape) 출력 (20640,)

--------------------
★ 2. 학습/테스트 데이터 분리
--------------------
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)

print(X_train.shape) 출력 (16512, 8)
print(y_train.shape) 출력 (16512,)
print(X_test.shape)  출력 (4128, 8)
print(y_test.shape)  출력 (4128,)

--------------------
★ 3. Ridge 회귀
alpha = 1.0 (규제 세기) 조절 가능
--------------------
ridge_reg = Ridge(alpha = 1.0, random_state = 42)
ridge_reg.fit(X_train, y_train)

☆ 예측
y_pred_ridge = ridge_reg.predict(X_test)

☆ 성능 평가
mse_ridge = mean_squared_error(y_test, y_pred_ridge)
r2_ridge = r2_score(y_test, y_pred_ridge)

☆ 평균 비율 오차
def MPE(y_true, y_pred):
    return np.mean((y_true - y_pred) / y_true) * 100

☆ 결과 출력 및 확인
print("[Ridge 회귀 결과]")
print("  가중치(coefficient):", ridge_reg.coef_)
print("  절편(intercept):", ridge_reg.intercept_)
print("  MSE:", mse_ridge)
print("  R^2 점수:", r2_ridge)
print("평균 비율 오차 : ", MPE(y_test, y_pred_ridge))
print()

--------------------
★ 4. Lasso 회귀
alpha = 0.1 정도로 조금 낮춰 볼 수 있음(기본값 = 1.0)
alpha가 너무 크면 가중치가 0이 되어 과소적합 위험
--------------------
lasso_reg = Lasso(alpha = 0.1, random_state = 42, max_iter = 10000)
lasso_reg.fit(X_train, y_train)

☆ 예측
y_pred_lasso = lasso_reg.predict(X_test)

☆ 성능 평가
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
r2_lasso = r2_score(y_test, y_pred_lasso)

☆ 평균 비율 오차
def MPE(y_true, y_pred):
    return np.mean((y_true - y_pred) / y_true) * 100

☆ 결과 출력 및 확인
print("[Lasso 회귀 결과]")
print("  가중치(coefficient):", lasso_reg.coef_)
print("  절편(intercept):", lasso_reg.intercept_)
print("  MSE:", mse_lasso)
print("  R^2 점수:", r2_lasso)
print("평균 비율 오차 : ", MPE(y_test, y_pred_lasso))

✔️ alpha는 위 릿지/라소 회귀식의 람다 역할 (규제하는 덩어리 앞 가중치임)

✔️ Lasso 에 0값들 나옴 = 해당 변수들은 예측에 도움이 전혀 안 된다는 것

 


☑️ 6. 실습 문제

아래의 당뇨병 X, y 데이터를 가지고 릿지와 라쏘 회귀를 진행하고 라쏘 회귀를 진행할 때 가중치가 0이 나오는 변수가 있다면 그 변수는 어떤 변수인지 이름을 쓰시오

  • 이미 데이터 전처리가 다 이루어진 sklearn 데이터셋이기 때문에 별도의 전처리는 필요 없음
  • 다만, train데이터와 test 데이터를 나누는 과정은 필요
  • 어떤 변수인지 이름을 찾는 것은 아래 데이터 프레임에서 확인
  • random_state를 설정해야 하는 경우가 있으면 42로 설정
import numpy as np
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.linear_model import Ridge, Lasso
from sklearn.model_selection import train_test_split
from sklearn.matrics import mean_squared_error, r2_score

--------------------
1. 데이터 로드
--------------------
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target

print(X.shape) (442, 10)
print(Y.shape) (442,)

--------------------
1+. 데이터 시각화
--------------------
☆ 특성 이름(컬럼명) 가져오기
feature_names = diabetes.features_names 결과 Feature names: ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']

☆ DataFrame 생성
df = pd.DataFrame(X, columns = feature_names)
df['target'] = y
df

--------------------
2. 학습/테스트 데이터 분리
--------------------
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)

print(X_train.shape)  (353, 10)
print(y_train.shape)  (353,)
print(X_test.shape)   (89, 10)
print(y_test.shape)   (89,)

--------------------
3. Ridge 회귀
--------------------
ridge_reg = Ridge(alpha = 1.0, random_state = 42)

ridge_reg.fit(X_train, y_train)
y_pred_ridge = ridge_reg.predict(X_test)

mse_ridge = mean_squred_error(y_test, y_pred_ridge)
r2_ridge = r2_score(y_test, y_pred_ridge)

def MPE(y_true, y_pred):
    return np.mean((y_true - y_pred) / y_true) * 100
    
print("[Ridge 회귀 결과]")
print("  가중치(coefficient):", ridge_reg.coef_) 가중치(coefficient): [ -11.46 -239.75  519.14  324.39 -743.37  432.58  153.97  51.15  589.46  83.12]
print("  절편(intercept):", ridge_reg.intercept_) 절편(intercept): 152.82
print("  MSE:", mse_ridge)                        MSE: 2935.04
print("  R^2 점수:", r2_ridge)                    R^2 점수: 0.453
print("평균 비율 오차 : ", MPE(y_test, y_pred_ridge)) 평균 비율 오차 :  -17.82

--------------------
4. Lasso 회귀
--------------------
lasso_reg = Lasso(alpha = 0.1, random_state = 42, max_iter = 10000)

lasso_reg.fit(X_train, y_train)
y_pred_lasso = lasso_reg.predict(X_test)

mse_lasso = mean_squared_error(y_test, y_pred_lasso)
r2_lasso = r2_score(y_test, y_pred_lasso)

print("[Lasso 회귀 결과]")  
print("  가중치(coefficient):", lasso_reg.coef_)      가중치(coefficient): [   0.   -0.  515.  295.   -0.    0.    0.   66.  464.   71.]
print("  절편(intercept):", lasso_reg.intercept_)     절편(intercept): 152.44
print("  MSE:", mse_lasso)                            MSE: 2973.40
print("  R^2 점수:", r2_lasso)                        R^2 점수: 0.447
print("평균 비율 오차 : ", MPE(y_test, y_pred_lasso))  평균 비율 오차 :  -18.06
print()

--------------------
5. Lasso에서 가중치 = 0 변수 찾기
--------------------
zero_coef_idx = np.where(lasso_reg.coef == 0)[0]
zero_coef_features = [feature_names[i] for i in zero_coef_idx]
print("Lasso에서 가중치가 0이 된 변수:", zero_coef_features)
Lasso에서 가중치가 0이 된 변수: ['age', 'sex', 's1', 's2', 's3']
728x90
반응형