본문 바로가기
데이터 사이언스/하계 AI 중급과정

Ch 5. Multiple Regression (다중 회귀)

by 수학과인데 공대생 2023. 7. 12.
728x90

선형 회귀와 다항 회귀를 공부하며 독립변수가 하나인 데이터들에 대해 살펴봤습니다.

이번 포스팅에서는 독립변수가 2개 이상인 다중 회귀에 대해 알아보겠습니다.

 

fish_full.csv
0.00MB

우선 fish_full.csv 첨부를 다운 받고 google drive에 복사해 보겠습니다.

복사 후 pandas를 활용해 dataframe을 만들어 봅시다.

이후 model 학습을 위해 numpy.array로 형태를 바꿔주겠습니다.

import pandas as pd

df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/fish_full.csv')
fish_full = df.to_numpy()
fish_full[:5]

 

보시는 바와 같이 3개의 독립변수가 입력되어 있습니다.

각 column이 무엇을 뜻하는지 excel에서 csv파일을 열어 확인해보겠습니다.

좌측부터 물고기의 길이, 높이, 넓이가 나와있는 데이터임을 알 수 있습니다.

 

이제 target_set이 될 물고기 무게를 정의해보겠습니다.

fish_weight = np.array(
    [5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0,
     110.0, 115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0,
     130.0, 150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0,
     197.0, 218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0,
     514.0, 556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0,
     820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0,
     1000.0, 1000.0]
     )

 

Train_set과 Test_set을 분리해보겠습니다.

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(fish_full, fish_weight, test_size = 0.2, random_state = 42)

 

이제 degree = 5인 poly data를 생성해보겠습니다.

from sklearn.preprocessing import PolynomialFeatures

poly_features = PolynomialFeatures(degree = 5, include_bias = False)
poly_features.fit(train_input)
train_poly = poly_features.transform(train_input)
test_poly = poly_features.transform(test_input)

 

train_poly가 제대로 생성되었는지 확인해보겠습니다.

우선 get_feature_name_out()을 통해 다항 특성들을 파악해보겠습니다.

poly_features.get_feature_names_out()

 

 

train_poly[0]

 

poly data들이 잘 만들어졌습니다. 그런데 숫자가 너무 큰 것으로 보아 과대적합의 냄새가 나는 것 같습니다.

이후 표준화를 통해 다듬어 보겠습니다.

 

우선 표준화 이전에 model을 학습시켜보고 score를 먼저 확인해보겠습니다.

필요하다면 표준화 과정을 거쳐주면 됩니다.

from sklearn.linear_model import LinearRegression

lr = LinearRegression()
lr.fit(train_poly, train_target)

 

학습을 완료시켰습니다.

score를 확인해보겠습니다.

lr.score(train_poly, train_target)
-> 0.9999999999219743

Train_set에 대한 점수는 매우 놉게 나온 것을 확인할 수 있습니다.

이제 Test_set에 대한 점수가 높게 나온다면 학습된 model은 잘 만들어진 model이라고 판단할 수 있습니다.

 

lr.score(test_poly, test_target)
-> -167.27004880370916

Test_set의 score가 -167... 음수가 나왔습니다.

modelling을 잘못했다는 것을 알 수 있습니다.

degree = 5 로 설정했기 때문에 과대적합에 해당한다고 유추할 수 있습니다.

 

 

train_poly들의 값이 너무 크기 때문에 표준화 (평균 : 0, 표준편차 : 1)를 통해 data를 변경해보겠습니다.

즉 train_poly와 test_poly의 scale을 조정하는 것입니다.

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()

ss.fit(train_poly)
train_scaled = ss.transform(train_poly)
test_scaled = ss.transform(test_poly)

 

릿지 회귀와 라쏘 회귀를 각각 적용해보겠습니다.

 

1. 릿지 회귀(제곱의 합)

# 릿지 회귀 적용
from sklearn.linear_model import Ridge

ridge = Ridge()
ridge.fit(train_scaled, train_target)

릿지 회귀에 대한 model 점수화를 해보겠습니다.

ridge.score(train_scaled, train_target)
-> 0.9896004835191297

ridge.score(test_scaled, test_target)
-> 0.9789200583251785

 

2. 라쏘 회귀(절대값의 합)

# 라쏘 회귀 적용
from sklearn.linear_model import Lasso

lasso = Lasso()
lasso.fit(train_scaled, train_target)

라쏘 회귀에 대한 model 점수화를 해보겠습니다.

lasso.score(train_scaled, train_target)
-> 0.9897812228260618

lasso.score(test_scaled, test_target)
-> 0.9800354016844837
728x90