데이터 사이언스/하계 AI 중급과정

Ch 5. Multiple Regression (다중 회귀)

수학과인데 공대생 2023. 7. 12. 16:30
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