머신러닝

머신러닝을 이용한 자동차 구매 가격 예측과 joblib이용해 모델 저장하기

HooSL 2022. 3. 28. 17:00

다음과 같은 컬럼을 가지고 있는 데이터셋을 읽어서, 어떠한 고객이 있을때, 그 고객이 얼마정도의 차를 구매할 수 있을지를 예측하여, 그 사람에게 맞는 자동차를 보여주려 합니다.

 

컬럼 : 

  • Customer Name
  • Customer e-mail
  • Country
  • Gender
  • Age
  • Annual Salary
  • Credit Card Debt
  • Net Worth (순자산)

예측하고자 하는 값 :

  • Car Purchase Amount

 

구글드라이브 import

from google.colab import drive
drive.mount('/content/drive')

필요한 라이브러리 import

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

Car_Purchasing_Data.csv
0.06MB

import os
os.chdir('/content/drive/csv파일 경로')

인코딩은 ISO-8859-1를 사용합니다.

car_df = pd.read_csv('Car_Purchasing_Data.csv',encoding='ISO-8859-1')

NaN값이 있는지 확인

car_df.isna().sum()

학습을 위해 'Customer Name', 'Customer e-mail', 'Country', 'Car Purchase Amount' 컬럼을 제외한 컬럼만,

X로 만들어야 합니다.

여기서 'Country'는 왜 제외할까요?

컬럼이 너무 많아서 인공지능 학습에 오히려 비효율적입니다.

 

그래서 필요한 컬럼만 X로 저장합니다.

X = car_df.iloc[:,3:8]
X.head(3)

y 값은 'Car Purchase Amount' 컬럼으로 세팅합니다.

y = car_df['Car Purchase Amount']
y.head(3)

정규화(normalization)를 사용합니다.

MinMaxScaler 를 이용해서 피처 스케일링 하겠습니다.

from sklearn.preprocessing import MinMaxScaler
scaler_X =MinMaxScaler()
X = scaler_X.fit_transform(X)

학습을 위해서, y의 shape을 변경합니다.

scaler_y = MinMaxScaler()
y.values.reshape(500,1)

트레이닝셋과 테스트셋으로 분리합니다.

(테스트 사이즈는 25%로 하며, 랜덤스테이트는 50 으로 세팅하면 저랑 동일한 결과가 나올겁니다.. 아마..)

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=50)

 

RandomForest 나 XGBoost 를 이용

from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(random_state=50)
regressor.fit(X_train,y_train)
y_pred=regressor.predict(X_test)

MSE

X_test.shape

y_test 값이 피처스케일링을 통해서 2차원으로 만들어져 있기 때문에 오차를 구하려면 이를 다시 1차원으로 변경시켜 줘야합니다.

y_test=y_test.reshape(125,)

reshape로 1차원으로 변경

error = y_test-y_pred
(error**2).mean()
plt.plot(y_test)
plt.plot(y_pred)
plt.show()

파란색이 정답이고 주황색이 컴퓨터가 풀이한 답입니다.

거의 근접했네요.

 

예시를 들어보겠습니다.

 

유저가 앱을 통해서 데이터 입력했습니다
이 사람은 얼마 정도의 차를 구매할수있는지 예측하세요

 

여자이고 나이는 38살 연봉은 78,000달러 카드빚은 15,000달러이고,
자산은 480,000만 달러 입니다.

이 사람의 얼마짜리 차를 구매할 여력이 될까요?

new_data=np.array([0,38,78000,15000,480000])
new_data=new_data.reshape(1,5)

 

피쳐스케일링을 해줘야 하는데 학습할때 사용한 스케일러가 이미 최대, 최소값들을 가지고 있기 때문에그 스케일러를 이용해서 변환해야 합니다.

new_data = scaler_X.transform(new_data)
y_pred

위 예시의 예측값입니다.

scaler_y.inverse_transform(y_pred.reshape(1,1))

실제 서비스에 적용하려면, 서비스를 운영하고 있는 서버에 scaler_X와 scaler_y, regressor을 줘야합니다.

X스케일러, y스케일러, 인공지능 3개의 파일이 있어야 실제 서비스에 적용할 수 있습니다.

 

joblib 모델 저장

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

pkl이라는 피클파일이 해당 폴더에 생성되었을 겁니다.

 

딥러닝을 이용해보기.