본문 바로가기
딥러닝 스터디

[keras] Decision Tree Regressor를 이용한 항공권 가격 예측

by 공부하는우니 2023. 10. 25.

Keras DTR를 이용한 항공권 가격 예측

# 항공권 가격 예측
# https://www.kaggle.com/datasets/shubhambathwal/flight-price-prediction
# dtr로 항공권 가격 예측

import pandas as pd
cdf = pd.read_csv('Clean_Dataset.csv')
cdf = cdf[:5000] #시간 단축을 위해 데이터 줄이기
print(cdf.info())

# 0번째 column인 Unnamed: 0 는 index이긴 한데 필요 없으니 삭제
cdf.drop('Unnamed: 0', axis = 1, inplace = True) # inplace = True를 수행하면 원본 데이터에서 col을 삭제함
print(cdf.describe(include = 'all'))
print(cdf.info()) # non-null 데이터가 모두 같으니 null이 없는거라고 예상

# 항공사가 결과에 관련이 있을까 체크 => 그래프를 보는 한 꽤 관련이 있어 보임
print(cdf.airline.value_counts())

import matplotlib.pyplot as plt
import seaborn as sns
ax = sns.barplot(x='airline', y='price', data = cdf)
# plt.show()

# (가정) 편명 : 국제선/국내선 & 출발-도착지 거리로 어느 정도 알 수 있으니 삭제
# print(cdf.flight.value_counts())
cdf.drop('flight', axis = 1, inplace = True) # 11 columns -> 10 columns
print(cdf.info())

# one-hot encoding
dummies_cdf = pd.get_dummies(cdf, columns = ['airline', 'source_city', 'departure_time', 'stops', 'arrival_time', 'destination_city', 'class'], drop_first=True)
print('before one-hot encoding', cdf.shape)
print('after one-hot encoding', dummies_cdf.shape)

# 변수 분리
y = dummies_cdf.price
x = dummies_cdf.drop('price', axis = 1)
print('x shape', x.shape)
print('y shape', y.shape)

from sklearn.tree import DecisionTreeRegressor
dtr = DecisionTreeRegressor(max_depth = 5, min_samples_split = 3, random_state = 120)

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 42) # stratify = y 라면 y라는 class에 대해 균등한 비율을 유지한 채 Train/Test로 나눠즘
print('x train test', x_train.shape, x_test.shape)
print('y train test', y_train.shape, y_test.shape)

# Normalization
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(x_train)
X_train = scaler.transform(x_train)
X_val = scaler.transform(x_test)

dtr.fit(x_train, y_train)

from sklearn.metrics import mean_squared_error
pred = dtr.predict(x_test)
mse = mean_squared_error(y_test, pred, squared = False) # Squared False = RMSE

print()
print('prediction check')
print('gt', y_test[:10].values)
print('pred', list(map(int, pred[:10])))
print('mse', mse)

댓글