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 과적합 위험 함께 증가
'🥇 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 |