Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 60 additions & 8 deletions src/scripts/tune_ts_baseline.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# pylint: disable-all
import argparse
import os

Expand All @@ -15,6 +16,8 @@
from src.settings import LOGS_ROOT, UTCNOW
from src.ts import load_ABIDE1, TSQuantileTransformer

import wandb

sns.set_theme(style="whitegrid", font_scale=2, rc={"figure.figsize": (18, 9)})


Expand Down Expand Up @@ -66,6 +69,9 @@ def on_tune_start(self):

def on_experiment_start(self, exp: "IExperiment"):
super().on_experiment_start(exp)

# init logger
self.wandb_logger: wandb.run = wandb.init(project="tune_ts")
# setup model
clf_type = self._trial.suggest_categorical(
"classifier",
Expand All @@ -76,30 +82,53 @@ def on_experiment_start(self, exp: "IExperiment"):
"RandomForestClassifier",
],
)

if clf_type == "LogisticRegression":
solver = self._trial.suggest_categorical(
"classifier.logistic.solver", ["liblinear", "lbfgs"]
)
decay = self._trial.suggest_loguniform(
"classifier.logistic.C", low=1e-3, high=1e3
)
decay = self._trial.suggest_loguniform("classifier.logistic.C", low=1e-3, high=1e3)
if solver == "liblinear":
penalty = self._trial.suggest_categorical(
"classifier.logistic.penalty", ["l1", "l2"]
)
else:
penalty = "l2"

# configure logger
self.wandb_logger.name = f"{UTCNOW}-{clf_type}"
self.wandb_logger.config.update(
{
"classifier": clf_type,
"solver": solver,
"decay": decay,
"penalty": penalty,
"max_iter": 1000,
}
)

self.classifier = LogisticRegression(
solver=solver, C=decay, penalty=penalty, max_iter=1000
)
elif clf_type == "SGDClassifier":
penalty = self._trial.suggest_categorical(
"classifier.sgd.penalty", ["l1", "l2", "elasticnet"]
)
alpha = self._trial.suggest_loguniform(
"classifier.sgd.alpha", low=1e-4, high=1e-2
alpha = self._trial.suggest_loguniform("classifier.sgd.alpha", low=1e-4, high=1e-2)

# configure logger
self.wandb_logger.name = f"{UTCNOW}-{clf_type}"
self.wandb_logger.config.update(
{
"classifier": clf_type,
"loss": "modified_huber",
"penalty": penalty,
"alpha": alpha,
"max_iter": 1000,
"tol": 1e-3,
}
)

self.classifier = SGDClassifier(
loss="modified_huber",
penalty=penalty,
Expand All @@ -112,6 +141,16 @@ def on_experiment_start(self, exp: "IExperiment"):
n_estimators = self._trial.suggest_int(
"classifier.adaboost.n_estimators", 2, 32, log=True
)

# configure logger
self.wandb_logger.name = f"{UTCNOW}-{clf_type}"
self.wandb_logger.config.update(
{
"classifier": clf_type,
"n_estimators": n_estimators,
}
)

self.classifier = AdaBoostClassifier(n_estimators=n_estimators)
elif clf_type == "RandomForestClassifier":
max_depth = self._trial.suggest_int(
Expand All @@ -120,6 +159,18 @@ def on_experiment_start(self, exp: "IExperiment"):
n_estimators = self._trial.suggest_int(
"classifier.random_forest.n_estimators", 2, 32, log=True
)

# configure logger
self.wandb_logger.name = f"{UTCNOW}-{clf_type}"
self.wandb_logger.config.update(
{
"classifier": clf_type,
"max_depth": max_depth,
"n_estimators": n_estimators,
"max_features": 1,
}
)

self.classifier = RandomForestClassifier(
max_depth=max_depth, n_estimators=n_estimators, max_features=1
)
Expand All @@ -135,24 +186,25 @@ def run_dataset(self) -> None:
num_times=self._num_times,
logpath=f"{self._logdir}/{self._trial.number}.coefs.png",
)
report = get_classification_report(
y_true=y_test, y_pred=y_pred, y_score=y_score, beta=0.5
)
report = get_classification_report(y_true=y_test, y_pred=y_pred, y_score=y_score, beta=0.5)
for stats_type in [0, 1, "macro", "weighted"]:
stats = report.loc[stats_type]
for key, value in stats.items():
if "support" not in key:
self._trial.set_user_attr(f"{key}_{stats_type}", float(value))
self.dataset_metrics = {"score": report["auc"].loc["weighted"]}
self.wandb_logger.log({"score": self.dataset_metrics["score"]})

def on_experiment_end(self, exp: "IExperiment") -> None:
super().on_experiment_end(exp)
# we have only 1 epoch for baselines, so...
self._score = self.experiment_metrics[1]["ABIDE1"]["score"]
self.wandb_logger.finish()

def _objective(self, trial) -> float:
self._trial = trial
self.run()

return self._score

def tune(self, n_trials: int):
Expand Down
59 changes: 46 additions & 13 deletions src/scripts/tune_ts_lstm.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# pylint: disable-all
import argparse

from animus import EarlyStoppingCallback, IExperiment
Expand All @@ -16,6 +17,8 @@
from src.settings import LOGS_ROOT, UTCNOW
from src.ts import load_ABIDE1, TSQuantileTransformer

import wandb


class LSTM(nn.Module):
def __init__(
Expand All @@ -28,9 +31,7 @@ def __init__(
super(LSTM, self).__init__()
self.hidden_size = hidden_size
self.bidirectional = bidirectional
self.lstm = nn.LSTM(
hidden_size=hidden_size, bidirectional=bidirectional, **kwargs
)
self.lstm = nn.LSTM(hidden_size=hidden_size, bidirectional=bidirectional, **kwargs)
self.fc = nn.Sequential(
nn.Dropout(p=fc_dropout),
nn.Linear(2 * hidden_size if bidirectional else hidden_size, 1),
Expand Down Expand Up @@ -85,6 +86,9 @@ def on_tune_start(self):
)

def on_experiment_start(self, exp: "IExperiment"):
# init wandb logger
self.wandb_logger: wandb.run = wandb.init(project="tune_lstm", name=f"{UTCNOW}-lstm")

super().on_experiment_start(exp)
# setup experiment
self.num_epochs = self._trial.suggest_int("exp.num_epochs", 1, self.max_epochs)
Expand All @@ -99,20 +103,23 @@ def on_experiment_start(self, exp: "IExperiment"):
),
}
# setup model
hidden_size = self._trial.suggest_int("lstm.hidden_size", 32, 256, log=True)
num_layers = self._trial.suggest_int("lstm.num_layers", 1, 4)
bidirectional = self._trial.suggest_categorical("lstm.bidirectional", [True, False])
fc_dropout = self._trial.suggest_uniform("lstm.fc_dropout", 0.1, 0.9)
self.model = LSTM(
input_size=53, # PRIOR
hidden_size=self._trial.suggest_int("lstm.hidden_size", 32, 256, log=True),
num_layers=self._trial.suggest_int("lstm.num_layers", 1, 4),
hidden_size=hidden_size,
num_layers=num_layers,
batch_first=True,
bidirectional=self._trial.suggest_categorical(
"lstm.bidirectional", [True, False]
),
fc_dropout=self._trial.suggest_uniform("lstm.fc_dropout", 0.1, 0.9),
bidirectional=bidirectional,
fc_dropout=fc_dropout,
)
lr = self._trial.suggest_float("adam.lr", 1e-5, 1e-3, log=True)
self.criterion = nn.BCEWithLogitsLoss()
self.optimizer = optim.Adam(
self.model.parameters(),
lr=self._trial.suggest_float("adam.lr", 1e-5, 1e-3, log=True),
lr=lr,
)
# setup callbacks
self.callbacks = {
Expand All @@ -131,6 +138,17 @@ def on_experiment_start(self, exp: "IExperiment"):
minimize=False,
),
}
self.wandb_logger.config.update(
{
"num_epochs": self.num_epochs,
"batch_size": self.batch_size,
"hidden_size": hidden_size,
"num_layers": num_layers,
"bidirectional": bidirectional,
"fc_dropout": fc_dropout,
"lr": lr,
}
)

def run_dataset(self) -> None:
all_scores, all_targets = [], []
Expand Down Expand Up @@ -159,9 +177,7 @@ def run_dataset(self) -> None:
y_test = np.hstack(all_targets)
y_score = np.hstack(all_scores)
y_pred = (y_score > 0.5).astype(np.int32)
report = get_classification_report(
y_true=y_test, y_pred=y_pred, y_score=y_score, beta=0.5
)
report = get_classification_report(y_true=y_test, y_pred=y_pred, y_score=y_score, beta=0.5)
for stats_type in [0, 1, "macro", "weighted"]:
stats = report.loc[stats_type]
for key, value in stats.items():
Expand All @@ -174,13 +190,30 @@ def run_dataset(self) -> None:
"loss": total_loss,
}

def on_epoch_end(self, exp: "IExperiment") -> None:
super().on_epoch_end(self)
self.wandb_logger.log(
{
"train_score": self.epoch_metrics["train"]["score"],
"train_accuracy": self.epoch_metrics["train"]["accuracy"],
"train_loss": self.epoch_metrics["train"]["loss"],
"valid_score": self.epoch_metrics["valid"]["score"],
"valid_accuracy": self.epoch_metrics["valid"]["accuracy"],
"valid_loss": self.epoch_metrics["valid"]["loss"],
},
)

def on_experiment_end(self, exp: "IExperiment") -> None:
super().on_experiment_end(exp)
self._score = self.callbacks["early-stop"].best_score

wandb.summary["valid_score"] = self._score
self.wandb_logger.finish()

def _objective(self, trial) -> float:
self._trial = trial
self.run()

return self._score

def tune(self, n_trials: int):
Expand Down
49 changes: 42 additions & 7 deletions src/scripts/tune_ts_mlp.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# pylint: disable-all
import argparse

from animus import EarlyStoppingCallback, IExperiment
Expand All @@ -16,6 +17,8 @@
from src.settings import LOGS_ROOT, UTCNOW
from src.ts import load_ABIDE1, TSQuantileTransformer

import wandb


class ResidualBlock(nn.Module):
def __init__(self, block):
Expand Down Expand Up @@ -105,6 +108,9 @@ def on_tune_start(self):
)

def on_experiment_start(self, exp: "IExperiment"):
# init wandb logger
self.wandb_logger: wandb.run = wandb.init(project="tune_mlp", name=f"{UTCNOW}-mlp")

super().on_experiment_start(exp)
# setup experiment
self.num_epochs = self._trial.suggest_int("exp.num_epochs", 1, self.max_epochs)
Expand All @@ -119,17 +125,22 @@ def on_experiment_start(self, exp: "IExperiment"):
),
}
# setup model
hidden_size = self._trial.suggest_int("mlp.hidden_size", 32, 256, log=True)
num_layers = self._trial.suggest_int("mlp.num_layers", 0, 4)
dropout = self._trial.suggest_uniform("mlp.dropout", 0.1, 0.9)
self.model = MLP(
input_size=53, # PRIOR
output_size=2, # PRIOR
hidden_size=self._trial.suggest_int("mlp.hidden_size", 32, 256, log=True),
num_layers=self._trial.suggest_int("mlp.num_layers", 0, 4),
dropout=self._trial.suggest_uniform("mlp.dropout", 0.1, 0.9),
hidden_size=hidden_size,
num_layers=num_layers,
dropout=dropout,
)

lr = self._trial.suggest_float("adam.lr", 1e-5, 1e-3, log=True)
self.criterion = nn.CrossEntropyLoss()
self.optimizer = optim.Adam(
self.model.parameters(),
lr=self._trial.suggest_float("adam.lr", 1e-5, 1e-3, log=True),
lr=lr,
)
# setup callbacks
self.callbacks = {
Expand All @@ -149,6 +160,17 @@ def on_experiment_start(self, exp: "IExperiment"):
),
}

self.wandb_logger.config.update(
{
"num_epochs": self.num_epochs,
"batch_size": self.batch_size,
"hidden_size": hidden_size,
"num_layers": num_layers,
"dropout": dropout,
"lr": lr,
}
)

def run_dataset(self) -> None:
all_scores, all_targets = [], []
total_loss = 0.0
Expand All @@ -173,9 +195,7 @@ def run_dataset(self) -> None:
y_test = np.hstack(all_targets)
y_score = np.vstack(all_scores)
y_pred = np.argmax(y_score, axis=-1).astype(np.int32)
report = get_classification_report(
y_true=y_test, y_pred=y_pred, y_score=y_score, beta=0.5
)
report = get_classification_report(y_true=y_test, y_pred=y_pred, y_score=y_score, beta=0.5)
for stats_type in [0, 1, "macro", "weighted"]:
stats = report.loc[stats_type]
for key, value in stats.items():
Expand All @@ -187,13 +207,28 @@ def run_dataset(self) -> None:
"loss": total_loss,
}

def on_epoch_end(self, exp: "IExperiment") -> None:
super().on_epoch_end(self)
self.wandb_logger.log(
{
"train_score": self.epoch_metrics["train"]["score"],
"train_loss": self.epoch_metrics["train"]["loss"],
"valid_score": self.epoch_metrics["valid"]["score"],
"valid_loss": self.epoch_metrics["valid"]["loss"],
},
)

def on_experiment_end(self, exp: "IExperiment") -> None:
super().on_experiment_end(exp)
self._score = self.callbacks["early-stop"].best_score

wandb.summary["valid_score"] = self._score
self.wandb_logger.finish()

def _objective(self, trial) -> float:
self._trial = trial
self.run()

return self._score

def tune(self, n_trials: int):
Expand Down
Loading