빅데이터분석기사/작업형2

[작업형2] 중고 자동차 가격 예측하기(회귀)

seo0seok 2023. 6. 24. 03:49

// 퇴근후딴짓 님의 강의를 참고하였습니다. //

 

Dataset :

test.csv
0.07MB
train.csv
0.18MB
y.csv
0.01MB

 

 

문제) 중고 자동차 가격을 예측하여 다음과 같은 형식으로 제출하시오.

  • 자동차 가격을 예측해주세요!
  • 예측할 값(y): price
  • 평가: RMSE (Root Mean Squared Error)
  • data: train.csv, test.csv

 

1. EDA

# 데이터 불러오기
import pandas as pd

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

 

train.info()

실행 결과 : 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3759 entries, 0 to 3758
Data columns (total 9 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   model         3759 non-null   object 
 1   year          3759 non-null   int64  
 2   price         3759 non-null   int64  
 3   transmission  3759 non-null   object 
 4   mileage       3759 non-null   int64  
 5   fuelType      3759 non-null   object 
 6   tax           3759 non-null   int64  
 7   mpg           3759 non-null   float64
 8   engineSize    3759 non-null   float64
dtypes: float64(2), int64(4), object(3)

→ 6개의 수치형 변수, 3개의 명목형 변수로 이루어져있다.

 

train.isnull().sum()

실행 결과 : 
model           0
year            0
price           0
transmission    0
mileage         0
fuelType        0
tax             0
mpg             0
engineSize      0
dtype: int64
test.isnull().sum()

실행 결과 : 
model           0
year            0
transmission    0
mileage         0
fuelType        0
tax             0
mpg             0
engineSize      0
dtype: int64

→ train, test 데이터 모두 결측치는 없다.

 

y_train = train.pop("price")

→ 가격 예측에 사용될 'price' 컬럼은 y_train 변수에 따로 담아두고 train 데이터에서 삭제한다.

 

2. 수치형 활용

cols = ['year', 'mileage', 'tax', 'mpg', 'engineSize']
train = train[cols]
test = test[cols]

→ train, test 데이터에서 수치형 변수들만 선택한다.

 

from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, y_train, test_size=0.2, random_state=2022)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)

→ 랜덤포레스트 회귀 모형으로 훈련 및 예측을 실시한다.

 

from sklearn.metrics import mean_squared_error
def rmse(y_true, y_pred):
    return mean_squared_error(y_true, y_pred)**0.5

→ 사이킷런에서 rmse는 제공하고 있지 않아 함수로 rmse 계산 방식을 만들어준다.

 

rmse(y_val, pred)

실행 결과 :
1565.0567336921324

→ 검증 데이터로 평가 시 1565가 나온다.

 

3. 수치형 + 범주형 활용

train = pd.get_dummies(train)
test = pd.get_dummies(test)

→ train, test 데이터를 get_dummies 함수를 사용해 원핫 인코딩을 진행한다.

 

from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, y_train, test_size=0.2, random_state=2022)
X_tr.shape, X_val.shape, y_tr.shape, y_val.shape
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)
rmse(y_val, pred)

→ 원핫인코딩 진행 후 평가 진행시 rmse는 1305가 나온다.

→ rmse는 오차에 기반하기 때문에 숫자가 낮을수록 좋다. 즉, 원핫 인코딩 진행 후 더 좋은 성능이 나온 것이다.

 

4. Test 예측

pred = rf.predict(test)
result = pd.DataFrame({
    'pred':pred
})
result.to_csv("result.csv", index=False)
pd.read_csv('result.csv')

문제에서 제시한 형식대로 'pred' 컬럼에 pred값을 넣어 데이터프레임으로 만든 후 제출