MACHINE LEARNING/Machine Learning Project

ML(머신러닝) 실습 문제 : Linear regression 예측 모델 실습 (sklearn.linear, LinearRegression model)

신강희 2024. 4. 15. 17:55
728x90

auto-mpg.csv 데이터를 통해,

mpg (mile per gallern, 자동차 연비) 를 예측하는 모델을 만드세요.

 

# 필요한 import를 한번에 정리

 

# numpy와 pnadas 데이터 시각화에 필요

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sb

 

# 데이터 인코딩에 필요

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer

 

# 스케일링에 필요
from sklearn.preprocessing import StandardScaler, MinMaxScaler

 

# 데이터 트레이닝 테스트용 분리에 필요
from sklearn.model_selection import train_test_split

 

# 데이터 한글인식에 필요
import platform

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    path = "c:/Windows/Fonts/malgun.ttf"
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~')

 

# 데이터를 불러와 실습 진행

 

df = pd.read_csv('../data/auto-mpg.csv')

 

# 컬럼 정보 :

MPG (miles per gallon - 연비),

cylinders (실린더 갯수)

engine displacement (inches 배기량),

horsepower (마력),

vehicle weight (lbs. 무게),

time to accelerate from O to 60 mph (sec. 60mph까지 걸리는 시간),

model year ,

origin of car (1. American, 2. European, 3. Japanese).

Also provided are the car labels (types)

 

< 데이터 프리프로세싱 순서에 따라 데이터를 가공하고 예측해보자 >

# mpg (mile per gallern, 자동차 연비) 예측 모델

 

# 1. NaN 데이터 확인

df.isna().sum()

mpg       0
cyl       0
displ     0
hp        0
weight    0
accel     0
yr        0
origin    0
name      0
dtype: int64

 

# 2. 없으므로 X,y 분리

# X 는 name만 빼고 지정 y 는 mpg로

 

y = df['mpg']

0      18.0
1      15.0
2      18.0
3      16.0
4      17.0
       ... 
387    27.0
388    44.0
389    32.0
390    28.0
391    31.0
Name: mpg, Length: 392, dtype: float64

 

X = df.loc[  :  ,  'cyl' : 'origin' ]

 

# 문자열이 없어 보이지만 origin은 레이블 인코딩이 되어있는 데이터임
# 오류가 생길수 있으므로 원-핫 인코딩으로 바꾸어주는게 좋음

# 3. 인코딩

 

from sklearn.preprocessing import OneHotEncoder

from sklearn.compose import ColumnTransformer

 

ct = ColumnTransformer( [('encoder', OneHotEncoder(), [6])] ,  remainder='passthrough' )

 

ct.fit_transform(X)

array([[1.000e+00, 0.000e+00, 0.000e+00, ..., 3.504e+03, 1.200e+01,
        7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 3.693e+03, 1.150e+01,
        7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 3.436e+03, 1.100e+01,
        7.000e+01],
       ...,
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 2.295e+03, 1.160e+01,
        8.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 2.625e+03, 1.860e+01,
        8.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 2.720e+03, 1.940e+01,
        8.200e+01]])

 

# 변수로 재지정하여 메모리에 업로드

X = ct.fit_transform(X)

 

# 4. 린이어는 피쳐 스케일링이 필요없음

# 5. 트레이닝 테스트용 나누기

 

train_test_split( X , y, test_size=0.2, random_state=1)

[array([[1.000e+00, 0.000e+00, 0.000e+00, ..., 2.490e+03, 1.570e+01,
         8.100e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, ..., 3.620e+03, 1.870e+01,
         7.800e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, ..., 2.219e+03, 1.650e+01,
         7.400e+01],
        ...,
        [1.000e+00, 0.000e+00, 0.000e+00, ..., 4.098e+03, 1.400e+01,
         7.200e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, ..., 2.051e+03, 1.700e+01,
         7.700e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, ..., 4.209e+03, 1.200e+01,
         7.100e+01]]),
 array([[0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 1.200e+02, 9.700e+01,
         2.506e+03, 1.450e+01, 7.200e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.700e+01, 7.500e+01,
         2.171e+03, 1.600e+01, 7.500e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 1.080e+02, 7.500e+01,
         2.350e+03, 1.680e+01, 8.100e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.210e+02, 1.120e+02,
         2.868e+03, 1.550e+01, 7.300e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.100e+01, 6.700e+01,
         1.995e+03, 1.620e+01, 8.200e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 9.800e+01, 8.300e+01,
         2.075e+03, 1.590e+01, 7.700e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 9.600e+01, 6.900e+01,
         2.189e+03, 1.800e+01, 7.200e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.180e+02, 1.500e+02,
         4.237e+03, 1.450e+01, 7.300e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.700e+01, 9.200e+01,
         2.288e+03, 1.700e+01, 7.200e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 1.070e+02, 7.200e+01,
         2.290e+03, 1.700e+01, 8.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.310e+02, 1.150e+02,
         3.245e+03, 1.540e+01, 7.900e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 9.800e+01, 7.600e+01,
         2.144e+03, 1.470e+01, 8.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.050e+02, 1.300e+02,
         3.840e+03, 1.540e+01, 7.900e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 8.500e+01, 7.000e+01,
         1.945e+03, 1.680e+01, 7.700e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.350e+02, 8.400e+01,
         2.525e+03, 1.600e+01, 8.200e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.020e+02, 1.400e+02,
         3.449e+03, 1.050e+01, 7.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.350e+02, 8.400e+01,
         2.370e+03, 1.300e+01, 8.200e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 9.000e+01, 4.800e+01,
         2.335e+03, 2.370e+01, 8.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.540e+02, 2.200e+02,
         4.354e+03, 9.000e+00, 7.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 1.000e+02,
         2.914e+03, 1.600e+01, 7.500e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.160e+02, 7.500e+01,
         2.246e+03, 1.400e+01, 7.400e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.580e+02, 1.100e+02,
         3.632e+03, 1.800e+01, 7.400e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.180e+02, 1.500e+02,
         3.399e+03, 1.100e+01, 7.300e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.500e+02, 1.700e+02,
         4.165e+03, 1.140e+01, 7.700e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.290e+02, 1.980e+02,
         4.341e+03, 1.000e+01, 7.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.600e+02, 1.500e+02,
         3.940e+03, 1.300e+01, 7.900e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.800e+01, 6.800e+01,
         2.045e+03, 1.850e+01, 7.700e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.250e+02, 1.000e+02,
         3.651e+03, 1.770e+01, 7.600e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.310e+02, 1.100e+02,
         3.039e+03, 1.500e+01, 7.500e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.350e+02, 8.400e+01,
         2.385e+03, 1.290e+01, 8.100e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.050e+02, 1.450e+02,
         3.425e+03, 1.320e+01, 7.800e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.510e+02, 8.800e+01,
         2.740e+03, 1.600e+01, 7.700e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.500e+02, 1.550e+02,
         4.502e+03, 1.350e+01, 7.200e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 1.120e+02,
         2.835e+03, 1.470e+01, 8.200e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.310e+02, 1.050e+02,
         3.425e+03, 1.690e+01, 7.700e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.050e+02, 1.400e+02,
         4.215e+03, 1.300e+01, 7.600e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.250e+02, 9.500e+01,
         3.785e+03, 1.900e+01, 7.500e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.310e+02, 1.050e+02,
         3.535e+03, 1.920e+01, 7.800e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.100e+01, 6.700e+01,
         1.965e+03, 1.500e+01, 8.200e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.700e+01, 8.800e+01,
         2.130e+03, 1.450e+01, 7.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.000e+02, 1.900e+02,
         4.325e+03, 1.220e+01, 7.700e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.000e+02, 1.750e+02,
         4.385e+03, 1.200e+01, 7.200e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 6.000e+00, 1.560e+02, 1.220e+02,
         2.807e+03, 1.350e+01, 7.300e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 1.000e+02,
         2.901e+03, 1.600e+01, 7.400e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 1.000e+02,
         2.789e+03, 1.500e+01, 7.300e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.580e+02, 1.100e+02,
         3.730e+03, 1.900e+01, 7.500e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.000e+02, 1.500e+02,
         4.997e+03, 1.400e+01, 7.300e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.100e+01, 6.800e+01,
         1.970e+03, 1.760e+01, 8.200e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.250e+02, 1.000e+02,
         3.233e+03, 1.540e+01, 7.600e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.400e+02, 2.150e+02,
         4.735e+03, 1.100e+01, 7.300e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.040e+02, 1.500e+02,
         3.672e+03, 1.150e+01, 7.200e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.000e+02, 9.500e+01,
         3.155e+03, 1.820e+01, 7.800e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.510e+02, 9.000e+01,
         2.678e+03, 1.650e+01, 8.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.350e+02, 8.400e+01,
         2.295e+03, 1.160e+01, 8.200e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 8.900e+01, 6.200e+01,
         1.845e+03, 1.530e+01, 8.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 1.710e+02, 9.700e+01,
         2.984e+03, 1.450e+01, 7.500e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 1.730e+02, 1.150e+02,
         2.595e+03, 1.130e+01, 7.900e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.000e+02, 8.500e+01,
         2.587e+03, 1.600e+01, 7.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.510e+02, 9.000e+01,
         2.556e+03, 1.320e+01, 7.900e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.100e+01, 6.000e+01,
         1.800e+03, 1.640e+01, 7.800e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.620e+02, 8.500e+01,
         3.015e+03, 1.700e+01, 8.200e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.070e+02, 8.600e+01,
         2.464e+03, 1.550e+01, 7.600e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 8.500e+01, 6.500e+01,
         1.975e+03, 1.940e+01, 8.100e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 2.600e+02, 1.100e+02,
         3.365e+03, 1.550e+01, 7.800e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 9.000e+01,
         3.085e+03, 1.760e+01, 7.600e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 9.000e+01,
         3.211e+03, 1.700e+01, 7.500e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.200e+02, 8.800e+01,
         3.270e+03, 2.190e+01, 7.600e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.400e+02, 1.600e+02,
         3.609e+03, 8.000e+00, 7.000e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 8.900e+01, 7.100e+01,
         1.925e+03, 1.400e+01, 7.900e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.830e+02, 1.800e+02,
         4.955e+03, 1.150e+01, 7.100e+01],
        [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 1.190e+02, 9.200e+01,
         2.434e+03, 1.500e+01, 8.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 2.670e+02, 1.250e+02,
         3.605e+03, 1.500e+01, 7.900e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.180e+02, 1.500e+02,
         3.755e+03, 1.400e+01, 7.600e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 9.700e+01, 7.800e+01,
         2.188e+03, 1.580e+01, 8.000e+01],
        [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.210e+02, 1.130e+02,
         2.234e+03, 1.250e+01, 7.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 9.800e+01, 8.000e+01,
         1.915e+03, 1.440e+01, 7.900e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.550e+02, 2.250e+02,
         3.086e+03, 1.000e+01, 7.000e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.000e+02, 1.500e+02,
         4.464e+03, 1.200e+01, 7.300e+01],
        [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.500e+02, 1.650e+02,
         4.274e+03, 1.200e+01, 7.200e+01]]),
 334    27.2
 258    18.6
 139    29.0
 310    37.2
 349    33.0
        ... 
 203    28.0
 255    19.4
 72     13.0
 235    30.5
 37     14.0
 Name: mpg, Length: 313, dtype: float64,
 81     23.0
 165    29.0
 351    32.4
 119    19.0
 379    38.0
        ... 
 23     26.0
 293    35.7
 13     14.0
 90     13.0
 61     13.0
 Name: mpg, Length: 79, dtype: float64]

 

# 트레이닝용과 테스트용으로 따로 변수 저장하여 메모리 업로드

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

 

X_train

array([[1.000e+00, 0.000e+00, 0.000e+00, ..., 2.490e+03, 1.570e+01,
        8.100e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 3.620e+03, 1.870e+01,
        7.800e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, ..., 2.219e+03, 1.650e+01,
        7.400e+01],
       ...,
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 4.098e+03, 1.400e+01,
        7.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 2.051e+03, 1.700e+01,
        7.700e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, ..., 4.209e+03, 1.200e+01,
        7.100e+01]])

 

X_test

array([[0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 1.200e+02, 9.700e+01,
        2.506e+03, 1.450e+01, 7.200e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.700e+01, 7.500e+01,
        2.171e+03, 1.600e+01, 7.500e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 1.080e+02, 7.500e+01,
        2.350e+03, 1.680e+01, 8.100e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.210e+02, 1.120e+02,
        2.868e+03, 1.550e+01, 7.300e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.100e+01, 6.700e+01,
        1.995e+03, 1.620e+01, 8.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 9.800e+01, 8.300e+01,
        2.075e+03, 1.590e+01, 7.700e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 9.600e+01, 6.900e+01,
        2.189e+03, 1.800e+01, 7.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.180e+02, 1.500e+02,
        4.237e+03, 1.450e+01, 7.300e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.700e+01, 9.200e+01,
        2.288e+03, 1.700e+01, 7.200e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 1.070e+02, 7.200e+01,
        2.290e+03, 1.700e+01, 8.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.310e+02, 1.150e+02,
        3.245e+03, 1.540e+01, 7.900e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 9.800e+01, 7.600e+01,
        2.144e+03, 1.470e+01, 8.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.050e+02, 1.300e+02,
        3.840e+03, 1.540e+01, 7.900e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 8.500e+01, 7.000e+01,
        1.945e+03, 1.680e+01, 7.700e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.350e+02, 8.400e+01,
        2.525e+03, 1.600e+01, 8.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.020e+02, 1.400e+02,
        3.449e+03, 1.050e+01, 7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.350e+02, 8.400e+01,
        2.370e+03, 1.300e+01, 8.200e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 9.000e+01, 4.800e+01,
        2.335e+03, 2.370e+01, 8.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.540e+02, 2.200e+02,
        4.354e+03, 9.000e+00, 7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 1.000e+02,
        2.914e+03, 1.600e+01, 7.500e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.160e+02, 7.500e+01,
        2.246e+03, 1.400e+01, 7.400e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.580e+02, 1.100e+02,
        3.632e+03, 1.800e+01, 7.400e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.180e+02, 1.500e+02,
        3.399e+03, 1.100e+01, 7.300e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.500e+02, 1.700e+02,
        4.165e+03, 1.140e+01, 7.700e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.290e+02, 1.980e+02,
        4.341e+03, 1.000e+01, 7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.600e+02, 1.500e+02,
        3.940e+03, 1.300e+01, 7.900e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.800e+01, 6.800e+01,
        2.045e+03, 1.850e+01, 7.700e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.250e+02, 1.000e+02,
        3.651e+03, 1.770e+01, 7.600e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.310e+02, 1.100e+02,
        3.039e+03, 1.500e+01, 7.500e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.350e+02, 8.400e+01,
        2.385e+03, 1.290e+01, 8.100e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.050e+02, 1.450e+02,
        3.425e+03, 1.320e+01, 7.800e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.510e+02, 8.800e+01,
        2.740e+03, 1.600e+01, 7.700e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.500e+02, 1.550e+02,
        4.502e+03, 1.350e+01, 7.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 1.120e+02,
        2.835e+03, 1.470e+01, 8.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.310e+02, 1.050e+02,
        3.425e+03, 1.690e+01, 7.700e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.050e+02, 1.400e+02,
        4.215e+03, 1.300e+01, 7.600e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.250e+02, 9.500e+01,
        3.785e+03, 1.900e+01, 7.500e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.310e+02, 1.050e+02,
        3.535e+03, 1.920e+01, 7.800e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.100e+01, 6.700e+01,
        1.965e+03, 1.500e+01, 8.200e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.700e+01, 8.800e+01,
        2.130e+03, 1.450e+01, 7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.000e+02, 1.900e+02,
        4.325e+03, 1.220e+01, 7.700e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.000e+02, 1.750e+02,
        4.385e+03, 1.200e+01, 7.200e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 6.000e+00, 1.560e+02, 1.220e+02,
        2.807e+03, 1.350e+01, 7.300e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 1.000e+02,
        2.901e+03, 1.600e+01, 7.400e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 1.000e+02,
        2.789e+03, 1.500e+01, 7.300e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.580e+02, 1.100e+02,
        3.730e+03, 1.900e+01, 7.500e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.000e+02, 1.500e+02,
        4.997e+03, 1.400e+01, 7.300e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.100e+01, 6.800e+01,
        1.970e+03, 1.760e+01, 8.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.250e+02, 1.000e+02,
        3.233e+03, 1.540e+01, 7.600e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.400e+02, 2.150e+02,
        4.735e+03, 1.100e+01, 7.300e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.040e+02, 1.500e+02,
        3.672e+03, 1.150e+01, 7.200e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.000e+02, 9.500e+01,
        3.155e+03, 1.820e+01, 7.800e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.510e+02, 9.000e+01,
        2.678e+03, 1.650e+01, 8.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.350e+02, 8.400e+01,
        2.295e+03, 1.160e+01, 8.200e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 8.900e+01, 6.200e+01,
        1.845e+03, 1.530e+01, 8.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 1.710e+02, 9.700e+01,
        2.984e+03, 1.450e+01, 7.500e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 1.730e+02, 1.150e+02,
        2.595e+03, 1.130e+01, 7.900e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.000e+02, 8.500e+01,
        2.587e+03, 1.600e+01, 7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 1.510e+02, 9.000e+01,
        2.556e+03, 1.320e+01, 7.900e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 9.100e+01, 6.000e+01,
        1.800e+03, 1.640e+01, 7.800e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.620e+02, 8.500e+01,
        3.015e+03, 1.700e+01, 8.200e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.070e+02, 8.600e+01,
        2.464e+03, 1.550e+01, 7.600e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 8.500e+01, 6.500e+01,
        1.975e+03, 1.940e+01, 8.100e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 2.600e+02, 1.100e+02,
        3.365e+03, 1.550e+01, 7.800e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 9.000e+01,
        3.085e+03, 1.760e+01, 7.600e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 6.000e+00, 2.320e+02, 9.000e+01,
        3.211e+03, 1.700e+01, 7.500e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.200e+02, 8.800e+01,
        3.270e+03, 2.190e+01, 7.600e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.400e+02, 1.600e+02,
        3.609e+03, 8.000e+00, 7.000e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 8.900e+01, 7.100e+01,
        1.925e+03, 1.400e+01, 7.900e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.830e+02, 1.800e+02,
        4.955e+03, 1.150e+01, 7.100e+01],
       [0.000e+00, 0.000e+00, 1.000e+00, 4.000e+00, 1.190e+02, 9.200e+01,
        2.434e+03, 1.500e+01, 8.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 2.670e+02, 1.250e+02,
        3.605e+03, 1.500e+01, 7.900e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.180e+02, 1.500e+02,
        3.755e+03, 1.400e+01, 7.600e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 9.700e+01, 7.800e+01,
        2.188e+03, 1.580e+01, 8.000e+01],
       [0.000e+00, 1.000e+00, 0.000e+00, 4.000e+00, 1.210e+02, 1.130e+02,
        2.234e+03, 1.250e+01, 7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 4.000e+00, 9.800e+01, 8.000e+01,
        1.915e+03, 1.440e+01, 7.900e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.550e+02, 2.250e+02,
        3.086e+03, 1.000e+01, 7.000e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 4.000e+02, 1.500e+02,
        4.464e+03, 1.200e+01, 7.300e+01],
       [1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.500e+02, 1.650e+02,
        4.274e+03, 1.200e+01, 7.200e+01]])

 

## 데이터 프리프로세싱은 완료!! 이제 인공지능을 만들어 학습시킨후 예측 실행 ##

 

< 인공지능 학습 및 예측 실행 >

from sklearn.linear_model import LinearRegression

 

# 보편적으로 Regression 인공지는 이름은 regressor 로 사용

# 깡통 regressor 생성

regressor = LinearRegression()

 

# regressor 학습

regressor.fit(X_train, y_train)

 

# regressor 실행

regressor.predict(X_test)

array([23.94462531, 28.64761934, 32.33077781, 21.99464755, 35.28265957,
       28.12319115, 26.45524167, 12.58160302, 25.56306456, 32.04254865,
       23.32597109, 32.29214001, 20.14095012, 31.77638576, 29.46904954,
       15.04190357, 30.0344167 , 32.62473165, 10.92503097, 22.93824236,
       27.20037833, 17.75867846, 18.10527569, 16.16985336, 10.79919676,
       20.03178998, 31.66807007, 18.42520819, 21.73299914, 29.1359896 ,
       21.92214974, 24.36825885, 10.33853798, 28.57027834, 20.81243752,
       14.53200154, 16.94944932, 21.21237735, 35.27195558, 24.73713275,
       16.12598196, 11.89879942, 22.60011043, 22.26645573, 22.1334667 ,
       17.99528974,  8.68452228, 35.73286016, 21.07296509, 10.51727695,
       15.10201083, 23.20486955, 27.21539361, 30.31799228, 34.51063284,
       20.79063836, 26.05083995, 20.90202994, 26.71031312, 33.73741146,
       28.52415583, 27.14325924, 35.16257625, 22.03416555, 22.81474093,
       20.99775758, 22.69550132, 14.0908763 , 32.84090607,  6.40461693,
       30.72823425, 20.98887219, 18.35621099, 32.14480289, 23.79497128,
       30.57166865, 20.49454935, 12.24164985, 11.67133326])

 

# 이 실행한 값을 예측값이라는 의미로 하여 변수로 저장하여 메모리 업로드

y_pred = regressor.predict(X_test)

y_pred

array([23.94462531, 28.64761934, 32.33077781, 21.99464755, 35.28265957,
       28.12319115, 26.45524167, 12.58160302, 25.56306456, 32.04254865,
       23.32597109, 32.29214001, 20.14095012, 31.77638576, 29.46904954,
       15.04190357, 30.0344167 , 32.62473165, 10.92503097, 22.93824236,
       27.20037833, 17.75867846, 18.10527569, 16.16985336, 10.79919676,
       20.03178998, 31.66807007, 18.42520819, 21.73299914, 29.1359896 ,
       21.92214974, 24.36825885, 10.33853798, 28.57027834, 20.81243752,
       14.53200154, 16.94944932, 21.21237735, 35.27195558, 24.73713275,
       16.12598196, 11.89879942, 22.60011043, 22.26645573, 22.1334667 ,
       17.99528974,  8.68452228, 35.73286016, 21.07296509, 10.51727695,
       15.10201083, 23.20486955, 27.21539361, 30.31799228, 34.51063284,
       20.79063836, 26.05083995, 20.90202994, 26.71031312, 33.73741146,
       28.52415583, 27.14325924, 35.16257625, 22.03416555, 22.81474093,
       20.99775758, 22.69550132, 14.0908763 , 32.84090607,  6.40461693,
       30.72823425, 20.98887219, 18.35621099, 32.14480289, 23.79497128,
       30.57166865, 20.49454935, 12.24164985, 11.67133326])

 

# 오차값 구하기 (MSE 값)

y_test - y_pred

81    -0.944625
165    0.352381
351    0.069222
119   -2.994648
379    2.717340
         ...   
23     2.205029
293    5.128331
13    -6.494549
90     0.758350
61     1.328667
Name: mpg, Length: 79, dtype: float64

 

error = y_test - y_pred

 

(error ** 2).mean()

11.882268558597172

 

# 차트로 비교해 보자

y_test

81     23.0
165    29.0
351    32.4
119    19.0
379    38.0
       ... 
23     26.0
293    35.7
13     14.0
90     13.0
61     13.0
Name: mpg, Length: 79, dtype: float64

 

# 실제 결과에 예상 결과를 삽입한후 차트를 그려야하기 때문에 frame 형태로 변환후 컬럼으로 삽입해준다.

df_test = y_test.to_frame()

 

df_test['y_pred'] = y_pred

df_test

 

# 차트 분석을 용이하게 하기 위해서 인덱스 정렬
df_test.reset_index(drop=True, inplace=True)

df_test.plot()
plt.show()

 

< 신규 데이터가 생겼다고 가정 후 적용하여 실행해 보자 >

 

# 새로운 차가 나왔습니다. 이 차의 연비를 예측하세요.
# displ 301, hp 133, cyl 8, weight 2900, accel 10.7, yr 81, origin 유럽차

 

# 데이터 생성
new_data = [ 8, 301, 133, 2900, 10.7, 81, 2 ]

 

# 기계 학습은 numpy로 시켜야함 . 행렬 nparray
np.array(new_data)

array([8.00e+00, 3.01e+02, 1.33e+02, 2.90e+03, 1.07e+01, 8.10e+01,
       2.00e+00])

 

new_data = np.array(new_data)

 

# 2차원이어야 학습시킨 인공지능이 분석할수 있음
# 1개 자동차가 추가된거고 컬럼은 7개 이므로 reshape 진행
new_data.reshape(1, 7)

array([[8.00e+00, 3.01e+02, 1.33e+02, 2.90e+03, 1.07e+01, 8.10e+01,
        2.00e+00]])

 

new_data = new_data.reshape(1, 7)

 

# 그대로 시행하면 이전 원-핫 인코딩을 통해 9개 컬럼으로 인공지능을 만들었기 때문에 오류가 뜸 똑같이 인코딩 진행 해야됨
regressor.predict( new_data )

 

# new_data 도 인코딩 진행

ct.transform(new_data)

array([[0.00e+00, 1.00e+00, 0.00e+00, 8.00e+00, 3.01e+02, 1.33e+02,
        2.90e+03, 1.07e+01, 8.10e+01]])

 

# 변수로 메모리에 재업로드

new_data = ct.transform(new_data)

 

# 재실행
regressor.predict( new_data )

array([30.17837904])

 

# 정상동작하니 파일로 저장하여 서버로 보내준다고 가정

# 인코딩 작업을 위해 ct 변수와, 인공지능인 regressor 두개 파일을 저장해야 한다.

 

import joblib

joblib.dump(ct, 'ct.pkl')

['ct.pkl']

 

joblib.dump( regressor, 'regressor.pkl')

['regressor.pkl']

 

ㄴ 정상적으로 파일로 저장된것까지 확인

 

다음 실습문제로 계속

반응형