다항 회귀 (Polynomial Regression Model)

2023. 6. 6. 21:28·🥇 certification logbook
728x90
반응형

 

 

Reference
- <파이썬 한권으로 끝내기>, 데싸라면▪빨간색 물고기▪자투리코드, 시대고시기획 시대교육
 

시리얼의 설탕 함유량(X)에 따른 영양등급평가(y) 예측
 

DataSet

https://www.kaggle.com/datasets/crawford/80-cereals

80 Cereals

Nutrition data on 80 cereal products

www.kaggle.com

 

방법

1. scikit-learn의 PolynomialFeatures + LinearRegression
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
 

1. scikit-learn의 PolynomialFeatures + LinearRegression

class sklearn.linear_model.LinearRegression(*, fit_intercept=True, copy_X=True, n_jobs=None, positive=False)

 

더보기
  • fit_intercept: 상수항(intercept)을 모델에 포함할지 여부를 지정하는 매개변수입니다. 기본값은 True로, 상수항을 모델에 포함합니다.
  • copy_X: 입력 데이터를 복사할지 여부를 지정하는 매개변수입니다. 기본값은 True로, 입력 데이터를 복사합니다. 이는 입력 데이터를 수정하지 않고 원본 데이터를 보존할 수 있도록 합니다.
  • n_jobs: 모델의 학습을 병렬화하기 위한 작업 수를 지정하는 매개변수입니다. 기본값은 None으로, 단일 작업을 실행합니다. 만약 정수 값을 지정하면 해당 수만큼의 작업을 병렬로 실행합니다.
  • positive: 모델의 예측값을 양수로 제한할지 여부를 지정하는 매개변수입니다. 기본값은 False로, 제약이 없습니다.

 

class sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True, order='C')

 

더보기
  • degree: 생성할 다항식의 최대 차수를 지정하는 매개변수입니다. 기본값은 2로, 2차 다항식을 생성합니다.
  • interaction_only: True로 설정하면 상호작용(interaction) 항만 생성하고, 다항식 항은 생성하지 않습니다. 기본값은 False입니다.
  • include_bias: True로 설정하면 상수항(bias)을 생성합니다. 기본값은 True입니다.
  • order: 생성된 다항식 항의 순서를 지정하는 매개변수입니다. 'C'로 설정하면 C-style 순서로 항들이 생성됩니다. 기본값은 'C'입니다.

 

import pandas as pd
import matplotlib.pyplot as plt
cereal = pd.read_csv('./cereal.csv')
# name	mfr	type	calories	protein	fat	sodium	fiber	carbo	sugars	potass	vitamins	shelf	weight	cups	rating

cereal = cereal[cereal.columns[3:]]
# calories	protein	fat	sodium	fiber	carbo	sugars	potass	vitamins	shelf	weight	cups	rating

cereal = cereal[cereal.sugars >= 0]

cereal2 = cereal[['sugars', 'rating']].copy()
cereal2.sort_values(by=['sugars'], inplace=True) # sugars 기준으로 정렬, inplace=True : dataframe 정렬 결과 원본 dataframe에 바로 적용
cereal2.reset_index(drop=True, inplace=True) # drop=True : 기존 index 버리고, 새로운 index 할당.
x = cereal2['sugars'].values
y = cereal2['rating'].values
plt.scatter(x, y)
plt.show()

 

 

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 1)
# train : test = 7 : 3 분할
print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

# (53,) (23,)
# (53,) (23,)
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=2)
X_poly = poly_reg.fit_transform(X_train.reshape(-1, 1))
# reshape(-1, 1) : 해당 차원의 크기를 자동으로 계산(-1)하여, 열의 크기가 1인 2차원 배열로 재구성
# 다항식 특성 생성을 위해 2차원 형태로 데이터를 제공해야 하기 때문에 사용

from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_poly, y_train)

 

  • fit_transform(X[, y])

Fit to data, then transform it.
- X : 샘플데이터. 2차원 array 형태
새로운 X 데이터 반환

 

import numpy as np
X_test_poly = poly_reg.transform(X_test.reshape(-1, 1))
pred = reg.predict(X_test_poly)

np.set_printoptions(precision = 2) # 소수점 둘째자리까지 표현
print(np.concatenate((pred.reshape(len(pred), 1), y_test.reshape(len(y_test), 1)), 1))
# pred.reshape(len(pred), 1) -> 예측값
# y_test.reshape(len(y_test), 1) -> 실제값
# 위의 두 배열을 '1' 축 (열 방향)으로 연결
# [[pred1, y_test1],
#  [pred2, y_test2],
#  [pred3, y_test3],
#  ...
#  [pred_n, y_test_n]]

 

'''
[[51.63 46.66]
 [32.1  28.74]
 [55.79 59.64]
 [31.08 37.84]
 [32.1  31.44]
 [44.46 44.33]
 [38.82 40.4 ]
 [41.45 55.33]
 [41.45 49.12]
 [31.38 27.75]
 [36.56 34.38]
 [34.7  29.92]
 [65.25 63.01]
 [33.21 31.07]
 [44.46 52.08]
 [38.82 40.45]
 [51.63 53.13]
 [36.56 33.98]
 [41.45 49.51]
 [31.04 22.74]
 [31.38 39.26]
 [31.5  31.23]
 [32.1  21.87]]
 '''

 

  • transform(X)

Transform data to polynomial features.
- X : 샘플데이터. 2차원 array
새로운 X 데이터 반환
 
 
- fit_transform()은 주어진 데이터를 기반으로 모델을 학습하고 데이터를 변환하는 메서드
  학습 단계에서 모델은 주어진 학습 데이터에 맞추어 내부 매개변수나 설정을 조정하게 된다.
- transform()은 주어진 데이터를 기반으로만 데이터를 변환하며, 모델을 학습하지는 않는다.
- 학습 데이터 : fit_transform()을 사용하여 모델을 학습하고 변환
- 테스트 데이터 : transform()을 사용하여 이미 학습된 모델을 활용하여 데이터를 변환
 

from sklearn.metrics import mean_squared_error, mean_absolute_error
mse = mean_squared_error(y_test, pred)
mae = mean_absolute_error(y_test, pred)
rmse = np.sqrt(mse)
acc = reg.score(poly_reg.transform(X_test.reshape(-1, 1)), y_test)

print('MSE\t{}'.format(round(mse, 3)))
print('MAE\t{}'.format(round(mae, 3)))
print('RMSE\t{}'.format(round(rmse, 3)))
print('ACC\t{}%'.format(round(acc * 100, 3)))

# MSE	33.565
# MAE	4.606
# RMSE	5.794
# ACC	74.376%
X_new = np.linspace(0, 15, 100).reshape(100, 1)
X_new_poly = poly_reg.transform(X_new)
y_new = reg.predict(X_new_poly)

plt.plot(x, y, 'o', label = 'Actual')
plt.plot(X_new, y_new, 'r-', label = "Prediction")
plt.legend(loc = 'upper right')
plt.xlabel("$Sugars_1$")
plt.ylabel("$Rating$")
plt.show()

2. 고차 다항 회귀 분석

X = cereal.iloc[:, :-1].values
# calories	protein	fat	sodium	fiber	carbo	sugars	potass	vitamins	shelf	weight	cups
y = cereal.iloc[:, -1].values
# rating

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 1)
print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

# (53, 12) (23, 12)
# (53,) (23,)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = 2)

from sklearn.linear_model import LinearRegression
X_poly = poly_reg.fit_transform(X_train)
reg = LinearRegression()
reg.fit(X_poly, y_train)
import numpy as np
X_test_poly = poly_reg.transform(X_test)
pred = reg.predict(X_test_poly)

from sklearn.metrics import mean_squared_error, mean_absolute_error
mse = mean_squared_error(y_test, pred)
mae = mean_absolute_error(y_test, pred)
rmse = np.sqrt(mse)
acc = reg.score(poly_reg.transform(X_test), y_test)

print('MSE\t{}'.format(round(mse, 3)))
print('MAE\t{}'.format(round(mae, 3)))
print('RMSE\t{}'.format(round(rmse, 3)))
print('ACC\t{}%'.format(round(acc * 100, 3)))

# MSE	10.108
# MAE	2.215
# RMSE	3.179
# ACC	92.248%

 
sugars만 설명변수로 선택하는 경우 (74.376%) 보다, 설명변수를 12개의 데이터로 선택한 경우 (91.93%)의 모델이 예측 성능이 더 좋음
-> 모델의 복잡성 증가로 인하여, but 과적합 위험 함께 증가

728x90
반응형

'🥇 certification logbook' 카테고리의 다른 글

[python 데이터 핸들링] 판다스 연습 튜토리얼 - 01 Getting & Knowing Data  (0) 2023.06.08
[ADsP] 비지도학습 - 자기조직화지도(SOM) & 다차원척도법(MDS)  (0) 2023.06.08
앙상블 (Ensemble) - 랜덤 포레스트 분류 (Random Forest Classifier)  (0) 2023.06.07
다중 회귀 (Multiple Regression Model)  (0) 2023.06.07
단순 선형 회귀 (Simple Linear Regression Model)  (1) 2023.06.06
분석환경 설정 (Visual Studio Code + 주피터노트북)  (0) 2023.06.05
[ADsP] 비지도학습 - 주성분 분석(PCA)  (1) 2023.06.05
[ADsP] 비지도학습 - 연관 분석  (0) 2023.06.05
'🥇 certification logbook' 카테고리의 다른 글
  • 앙상블 (Ensemble) - 랜덤 포레스트 분류 (Random Forest Classifier)
  • 다중 회귀 (Multiple Regression Model)
  • 단순 선형 회귀 (Simple Linear Regression Model)
  • 분석환경 설정 (Visual Studio Code + 주피터노트북)
이소야
이소야
✔ 공부 기록 ٩(๑•̀o•́๑)و
  • 이소야
    I study SO
    이소야
    ✔ 공부 기록 ٩(๑•̀o•́๑)و
  • 전체
    오늘
    어제
    • 분류 전체보기 (217)
      • 🤖 ai logbook (39)
      • 💻 developers logbook (1)
      • 🥇 certification logbook (67)
      • ⚖️ legal logbook (108)
      • ⚡ electronics logbook (1)
      • 🌍 english logbook (0)
      • 🎁 etc (1)
  • 최근 글

  • 인기 글

  • 태그

    머신러닝
    IBM
    인공지능 입문
    방통대
    데이터사이언스 입문
    자격증
    Coursera
    datascience
    빅데이터분석기사
    기본권의기초이론
    ADsP
    deeplearning
    법학과
    데이터분석준전문가
    민법
    certificate
    형법
    온라인 강의 추천
    근로기준법
    Python
  • hELLO· Designed By정상우.v4.10.3
이소야
다항 회귀 (Polynomial Regression Model)
상단으로

티스토리툴바