|
from typing import Type
|
|
|
|
import numpy as np
|
|
import optuna
|
|
import torch
|
|
from torch import nn
|
|
|
|
from utils import tts_last_n
|
|
from .early_stopping import EarlyStopping
|
|
from .loaders import get_dataloader
|
|
from .train_eval import train_model, validate_model, predict
|
|
from sklearn.metrics import roc_auc_score
|
|
import math
|
|
|
|
|
|
def objective_tune_reg_a(trial: optuna.Trial,
|
|
model_class: Type[nn.Module],
|
|
inputs: np.ndarray,
|
|
targets: np.ndarray
|
|
) -> float:
|
|
criterion = nn.MSELoss()
|
|
hidden_size = trial.suggest_categorical('hidden_size', [4, 8, 16, 32, 64, 128])
|
|
num_layers = trial.suggest_int('num_layers', 1, 4)
|
|
dropout = trial.suggest_float('dropout', 0.05, 0.5, log=True)
|
|
learning_rate = trial.suggest_float('learning_rate', 1e-4, 1e-1, log=True)
|
|
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
|
|
|
model = model_class(
|
|
input_size=inputs.shape[2],
|
|
hidden_size=hidden_size,
|
|
num_layers=num_layers,
|
|
dropout=dropout,
|
|
output_size=1
|
|
)
|
|
|
|
train_seq, test_seq, train_tar, test_tar = tts_last_n(inputs, targets, 252)
|
|
tloader = get_dataloader(train_seq, train_tar, device)
|
|
vloader = get_dataloader(test_seq, test_tar, device)
|
|
train_model(
|
|
model=model,
|
|
criterion=criterion,
|
|
train_loader=tloader,
|
|
val_loader=vloader,
|
|
early_stopping=EarlyStopping(5, 1e-6),
|
|
epochs=100,
|
|
lr=learning_rate,
|
|
verbose=0
|
|
)
|
|
|
|
return math.sqrt(validate_model(model, vloader, criterion, device))
|
|
|
|
|
|
def objective_tune_clas_a(trial: optuna.Trial,
|
|
model_class: Type[nn.Module],
|
|
inputs: np.ndarray,
|
|
targets: np.ndarray
|
|
) -> float:
|
|
criterion = nn.BCELoss()
|
|
hidden_size = trial.suggest_categorical('hidden_size', [4, 8, 16, 32, 64, 128])
|
|
num_layers = trial.suggest_int('num_layers', 1, 4)
|
|
dropout = trial.suggest_float('dropout', 0.05, 0.5, log=True)
|
|
learning_rate = trial.suggest_float('learning_rate', 1e-4, 1e-1, log=True)
|
|
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
|
|
|
model = model_class(
|
|
input_size=inputs.shape[2],
|
|
hidden_size=hidden_size,
|
|
num_layers=num_layers,
|
|
dropout=dropout,
|
|
output_size=1
|
|
)
|
|
|
|
train_seq, test_seq, train_tar, test_tar = tts_last_n(inputs, targets, 252)
|
|
tloader = get_dataloader(train_seq, train_tar, device)
|
|
vloader = get_dataloader(test_seq, test_tar, device)
|
|
train_model(
|
|
model=model,
|
|
criterion=criterion,
|
|
train_loader=tloader,
|
|
val_loader=vloader,
|
|
early_stopping=EarlyStopping(5, 1e-6),
|
|
epochs=100,
|
|
lr=learning_rate,
|
|
verbose=0
|
|
)
|
|
|
|
labels, preds = predict(model, vloader, device)
|
|
return roc_auc_score(labels, preds) |