날씨 정보와 장애인 콜택시 이용 정보를 바탕으로 내일의 콜택시 대기시간을 예측하는 프로젝트
약 7~10년 치의 일별 시계열 데이터가 csv 형식으로 주어졌다.
is_holiday
라는 이진 범주 데이터로 분류하고자 하였다workalendar.asia
가 대체 공휴일까지는 제공하지 않는다는 점이다. 때문에 대체 공유일까지 포함하여 직접 공휴일을 지정하는 방식을 택했다..shift(-1)
메서드를 이용하여 내일의 대기시간 데이터를 현재 행으로 가져왔다.
## 시계열 학습을 위해 데이터를 7일 단위로 잘라줌
# 예측할 시점
prediction_time_start = 7
prediction_time_end = y_train.shape[0]
# 입력 데이터와 타겟 데이터 구성
input_data = []
target_data = []
for prediction_time in range(prediction_time_start, prediction_time_end):
input_data.append(x_train_sc[prediction_time-7:prediction_time])
target_data.append(y_train[prediction_time])
input_data = np.array(input_data)
target_data = np.array(target_data)
input_data.shape, target_data.shape
>>>((2823, 7, 8), (2823,))
# 세션 클리어
clear_session()
# 레이어 연결
il = Input(shape=(7, x_train_sc.shape[1]))
hl = GRU(256, return_sequences=True, dropout=0.2)(il)
hl = GRU(256, return_sequences=True, dropout=0.2)(hl)
hl = GRU(256, return_sequences=False, dropout=0.2)(hl)
hl = Dense(512, activation='swish')(hl)
hl = Dropout(0.2)(hl)
hl = Dense(256, activation='swish')(hl)
ol = Dense(1, activation='linear')(hl)
# 모델 선언
model_gru = Model(il, ol)
# 컴파일
model_gru.compile(loss=tf.keras.losses.MAE,
optimizer = optimizer)
# 요약
model_gru.summary()
RF MAE: 4.337944444444444
RF MAPE: 0.10497016004449432
LGBM MAE: 4.698064907257304
LGBM MAPE: 0.1152820555856439
SVM(rbf) MAE: 3.920023449465459
SVM(rbf) MAPE: 0.09651161968948858
Deep Learning val_loss (Dense) : 4.5102
Deep Learning val_loss (GRU) : 4.9285
RF MAE: 4.500879120879121
RF MAPE: 0.11081339353997685
LGBM MAE: 4.751442426973392
LGBM MAPE: 0.11700754955505734
SVM(rbf) MAE: 4.386472626901607
SVM(rbf) MAPE: 0.10940582338268688
Deep Learning val_loss (Dense) : 4.4669
Deep Learning val_loss (GRU) : 4.7615
RF MAE: 4.500076923076926
RF MAPE: 0.11236237866433593
LGBM MAE: 5.357368944198414
LGBM MAPE: 0.13343935153178763
SVM(rbf) MAE: 6.221996802160059
SVM(rbf) MAPE: 0.14353848727060758
Deep Learning val_loss (Dense) : 4.8564
Deep Learning val_loss (GRU) : 5.0761
RF MAE: 4.6255714285714316
RF MAPE: 0.11378363789418271
LGBM MAE: 4.655814447958255
LGBM MAPE: 0.11492872789738516
SVM(rbf) MAE: 6.026767086401065
SVM(rbf) MAPE: 0.13962495237841524
Deep Learning val_loss (Dense) : 5.4655
Deep Learning val_loss (GRU) : 4.9922
# 1. 평가 결과를 반환하는 함수 작성
def objective(trial):
# 하이퍼파라미터 탐색범위
kernel = trial.suggest_categorical('kernel', ['rbf', 'linear'])
gamma = trial.suggest_categorical('gamma', ['scale', 'auto'])
cost = trial.suggest_float('C', 1e-1, 100, log=True)
epsilon = trial.suggest_float('epsilon', 1e-2, 1, log=True)
# 모델 선언
model = SVR(kernel=kernel, gamma=gamma, C=cost, epsilon=epsilon)
# 학습
model.fit(x_train_sc, y_train)
# 예측
y_pred = model.predict(x_test_sc)
return mean_absolute_error(y_test, y_pred)
# 2. 평가 결과를 받아 다음 파라미터값을 찾으며 최적의 하이퍼파라미터 탐색
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=100)
SVM(rbf) MAE: 3.836902936672689
한동안 AutoML만 사용해서 모델을 다루는 실력이 퇴보하고 있다고 생각했는데, 오랜만에 직접 모델링과 튜닝을 수행하여 배운 것을 다시 점검해보는 시간이 되었다.
특징 선택에 대한 많은 인사이트를 얻을 수 있었다.