This notebook is available at arjunsavel/cortecs

Optimizing fits#

At this point, we know how to fit functions to opacity dependence as a function of temperature, pressure, and wavelength. The question remains: Is our fit as good as it can be?

Some of the tweaking, of course, occurs during the fitting process. For instance, a neural network’s weights are optimized during a training process. But the hyperparameters of these fits — such as how many polynomial terms to include in the fit — are currently fixed for each fit.

In this tutorial, we’ll demonstrate how cortecs can optimize its hyperparameters. This “optimization” process refers to how well the original data can be reconstructed given a maximum size of the compression model. This process essentially performs a grid search to find the hyperparameters with the lowest mean-squared error.

Let’s get started! We’ll quickly run through a standard neural network fit to get things going. Please reference the neural network-fitting notebook for more detailed information on how to do so.

Setting up the fit#

[1]:
import numpy as np
import random
import os
import sys

sys.path.insert(0, os.path.abspath("../../src"))

import cortecs
from cortecs.opac.opac import *
from cortecs.fit.fit import *
from cortecs.eval.eval import *
from cortecs.opt.opt import *

seed = 42
np.random.seed(seed)
tf.random.set_seed(seed)
os.environ["PYTHONHASHSEED"] = str(seed)
random.seed(seed)
/home/docs/checkouts/readthedocs.org/user_builds/cortecs/checkouts/latest/src/cortecs/opac/io.py:11: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from tqdm.autonotebook import tqdm
2024-03-13 00:08:48.794670: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
2024-03-13 00:08:48.794721: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
2024-03-13 00:08:48.795921: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered
2024-03-13 00:08:49.709913: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
[2]:
T_filename = "temperatures.npy"
P_filename = "pressures.npy"
wl_filename = "wavelengths.npy"

cross_sec_filename = "absorb_coeffs_C2H4.npy"

load_kwargs = {
    "T_filename": T_filename,
    "P_filename": P_filename,
    "wl_filename": wl_filename,
}
opac_obj = Opac(cross_sec_filename, loader="platon", load_kwargs=load_kwargs)
[3]:
fitter = Fitter(opac_obj, method="neural_net")
res = cortecs.fit.fit_neural_net.fit_neural_net(
    fitter.opac.cross_section[:, :, -2],
    fitter.opac.T,
    fitter.opac.P,
    None,
    n_layers=3,
    n_neurons=8,
    activation="sigmoid",
    learn_rate=0.04,
    loss="mean_squared_error",
    epochs=4000,
    verbose=0,
    sequential_model=None,
    plot=True,
)
../../_images/pages_optimizing_5_0.png

Things look pretty good — let’s check to be sure.

[4]:
history, neural_network = res
P_unraveled = unravel_data(fitter.opac.P, fitter.opac.T, None, tileboth=True)
T_unraveled = unravel_data(fitter.opac.T, fitter.opac.P, None, tileboth=False)
input_array = np.column_stack([T_unraveled, P_unraveled])

npres = len(fitter.opac.P)
ntemp = len(fitter.opac.T)

predictions = neural_network.predict(input_array)
plt.imshow(
    100
    * (predictions.reshape(ntemp, npres) - fitter.opac.cross_section[:, :, -1])
    / predictions.reshape(ntemp, npres)
)
plt.colorbar()
13/13 [==============================] - 0s 1ms/step
[4]:
<matplotlib.colorbar.Colorbar at 0x7fb634f21710>
../../_images/pages_optimizing_7_2.png

Optimization#

[5]:
optimizer = Optimizer(fitter)

Next, we need to restrict how many hyperparameters the Optimizer tests.

We’ll first define the max_size parameter. This sets how large the opacity fit at a single point is. Something on the order of a few KB is probably reasonable, but the decision is up to you — at the end of the day, you want your fit to consume less memory than the opacity function it’s fitting!

[6]:
max_size = 1.6  # in KB

In addition to this parameter, we need to set the max_evaluations parameter. This parameter sets how many models the Optimizer tests, essentially setting how long the optimization takes. For the purposes of this tutorial, we’ll set a relatively low number. Note that this is an upper bound — setting max_evaluations = 8, for instance, will only run 2 model evaluations.

[7]:
max_evaluations = 16

Now, it’s time to run the optimizer!

[8]:
optimizer.optimize(max_size, max_evaluations)
max number of weights:  546
max number of layers:  3
max number of neurons / layer:  13
Optimizing neural network hyperparameters: 100%|██████████| 16/16 [09:19<00:00, 35.00s/it]

This took a couple of minutes on a laptop. Let’s look at those best-fit parameters.

[9]:
optimizer.best_params
[9]:
{'n_layers': 2, 'n_neurons': 13.0, 'activation': 'sigmoid', 'learn_rate': 0.01}

Note that if you’d like, you can set custom ranges for each of the neural net parameters.

Optimizing for PCA#

We can perform the same optimization process for our PCA fit. For instance, we can optimize which wavelength index is initially fit over, or how many PCA components to use.

[10]:
fitter = Fitter(opac_obj, method="pca")
fitter.fit()
100%|██████████| 4616/4616 [00:00<00:00, 21051.88it/s]
[11]:
optimizer = Optimizer(fitter)
[12]:
optimizer.optimize(max_size, max_evaluations)
len wl
4616
wl range
[3573 3920 4267 4615]
Optimizing PCA hyperparameters:   0%|          | 0/16 [00:00<?, ?it/s]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:49,  1.69s/it]
  7%|▋         | 2/30 [00:03<00:45,  1.61s/it]
 10%|█         | 3/30 [00:04<00:42,  1.59s/it]
 13%|█▎        | 4/30 [00:06<00:41,  1.58s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.57s/it]
 30%|███       | 9/30 [00:14<00:33,  1.57s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.57s/it]
 37%|███▋      | 11/30 [00:17<00:29,  1.57s/it]
 40%|████      | 12/30 [00:18<00:28,  1.58s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.57s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.57s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.57s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.57s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.57s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.57s/it]
 63%|██████▎   | 19/30 [00:29<00:17,  1.57s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.57s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.57s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.57s/it]
 77%|███████▋  | 23/30 [00:36<00:10,  1.57s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.57s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.57s/it]
 87%|████████▋ | 26/30 [00:40<00:06,  1.57s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.57s/it]
Optimizing PCA hyperparameters:   6%|▋         | 1/16 [00:47<11:52, 47.52s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:46,  1.59s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.57s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.57s/it]
 20%|██        | 6/30 [00:09<00:37,  1.57s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.58s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:29<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.57s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.57s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.57s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.57s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.57s/it]
 87%|████████▋ | 26/30 [00:40<00:06,  1.57s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.57s/it]
Optimizing PCA hyperparameters:  12%|█▎        | 2/16 [01:35<11:05, 47.55s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:47,  1.65s/it]
  7%|▋         | 2/30 [00:03<00:44,  1.60s/it]
 10%|█         | 3/30 [00:04<00:43,  1.59s/it]
 13%|█▎        | 4/30 [00:06<00:41,  1.59s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.59s/it]
 20%|██        | 6/30 [00:09<00:38,  1.59s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.59s/it]
 27%|██▋       | 8/30 [00:12<00:35,  1.59s/it]
 30%|███       | 9/30 [00:14<00:33,  1.59s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.59s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.59s/it]
 40%|████      | 12/30 [00:19<00:28,  1.60s/it]
 43%|████▎     | 13/30 [00:20<00:27,  1.60s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.60s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.59s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.59s/it]
 57%|█████▋    | 17/30 [00:27<00:20,  1.59s/it]
 60%|██████    | 18/30 [00:28<00:19,  1.59s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.59s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.59s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.59s/it]
 73%|███████▎  | 22/30 [00:35<00:12,  1.59s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.59s/it]
 80%|████████  | 24/30 [00:38<00:09,  1.58s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.58s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.58s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.58s/it]
 97%|█████████▋| 29/30 [00:46<00:01,  1.58s/it]
100%|██████████| 30/30 [00:47<00:00,  1.59s/it]
Optimizing PCA hyperparameters:  19%|█▉        | 3/16 [02:23<10:20, 47.76s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:47,  1.64s/it]
  7%|▋         | 2/30 [00:03<00:44,  1.60s/it]
 10%|█         | 3/30 [00:04<00:42,  1.59s/it]
 13%|█▎        | 4/30 [00:06<00:41,  1.58s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:19<00:28,  1.58s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.57s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.57s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.57s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  25%|██▌       | 4/16 [03:10<09:33, 47.75s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:46,  1.59s/it]
  7%|▋         | 2/30 [00:03<00:44,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.58s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.59s/it]
 30%|███       | 9/30 [00:14<00:33,  1.59s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.59s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.59s/it]
 40%|████      | 12/30 [00:19<00:28,  1.59s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.59s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.59s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:19,  1.58s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.58s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.58s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.58s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.58s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.58s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.58s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  31%|███▏      | 5/16 [03:58<08:45, 47.75s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.57s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.57s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.58s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.57s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.57s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.57s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.57s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  38%|███▊      | 6/16 [04:46<07:57, 47.70s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.56s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.57s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:38,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.58s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:29<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.57s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.57s/it]
 77%|███████▋  | 23/30 [00:36<00:10,  1.57s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.57s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.57s/it]
 87%|████████▋ | 26/30 [00:40<00:06,  1.57s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  44%|████▍     | 7/16 [05:33<07:09, 47.67s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:46,  1.59s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.57s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.57s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.59s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.59s/it]
 40%|████      | 12/30 [00:18<00:28,  1.59s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.57s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.57s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.57s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.57s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.57s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.57s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  50%|█████     | 8/16 [06:21<06:21, 47.67s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.58s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.59s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.59s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.59s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:19,  1.58s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.58s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.58s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.58s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.58s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.58s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.58s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  56%|█████▋    | 9/16 [07:09<05:33, 47.70s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.58s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.58s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.57s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.57s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.57s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.57s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.57s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.58s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  62%|██████▎   | 10/16 [07:56<04:46, 47.67s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:44,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.58s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.58s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:38,  1.59s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.59s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.59s/it]
 30%|███       | 9/30 [00:14<00:33,  1.59s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.59s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.59s/it]
 40%|████      | 12/30 [00:19<00:28,  1.59s/it]
 43%|████▎     | 13/30 [00:20<00:27,  1.59s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.59s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.59s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.59s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.59s/it]
 60%|██████    | 18/30 [00:28<00:19,  1.59s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.58s/it]
 80%|████████  | 24/30 [00:38<00:09,  1.58s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.58s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.58s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.58s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.58s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  69%|██████▉   | 11/16 [08:44<03:58, 47.72s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.57s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.58s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.58s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.58s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.58s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  75%|███████▌  | 12/16 [09:32<03:10, 47.70s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:44,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.57s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.59s/it]
 40%|████      | 12/30 [00:18<00:28,  1.59s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.59s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.59s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.58s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.58s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.58s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  81%|████████▏ | 13/16 [10:20<02:23, 47.69s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.56s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.57s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.59s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.59s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.61s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.60s/it]
 60%|██████    | 18/30 [00:28<00:19,  1.60s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.59s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.59s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.58s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.58s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.58s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  88%|████████▊ | 14/16 [11:07<01:35, 47.70s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.58s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.58s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.59s/it]
 30%|███       | 9/30 [00:14<00:33,  1.59s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.59s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.59s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.59s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.59s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.59s/it]
 60%|██████    | 18/30 [00:28<00:19,  1.59s/it]
 63%|██████▎   | 19/30 [00:30<00:17,  1.59s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.58s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.58s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.58s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.58s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.58s/it]
 87%|████████▋ | 26/30 [00:41<00:06,  1.58s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.58s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.58s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters:  94%|█████████▍| 15/16 [11:55<00:47, 47.72s/it]
  0%|          | 0/30 [00:00<?, ?it/s]
  3%|▎         | 1/30 [00:01<00:45,  1.58s/it]
  7%|▋         | 2/30 [00:03<00:43,  1.57s/it]
 10%|█         | 3/30 [00:04<00:42,  1.57s/it]
 13%|█▎        | 4/30 [00:06<00:40,  1.58s/it]
 17%|█▋        | 5/30 [00:07<00:39,  1.57s/it]
 20%|██        | 6/30 [00:09<00:37,  1.58s/it]
 23%|██▎       | 7/30 [00:11<00:36,  1.58s/it]
 27%|██▋       | 8/30 [00:12<00:34,  1.58s/it]
 30%|███       | 9/30 [00:14<00:33,  1.58s/it]
 33%|███▎      | 10/30 [00:15<00:31,  1.58s/it]
 37%|███▋      | 11/30 [00:17<00:30,  1.58s/it]
 40%|████      | 12/30 [00:18<00:28,  1.58s/it]
 43%|████▎     | 13/30 [00:20<00:26,  1.58s/it]
 47%|████▋     | 14/30 [00:22<00:25,  1.58s/it]
 50%|█████     | 15/30 [00:23<00:23,  1.58s/it]
 53%|█████▎    | 16/30 [00:25<00:22,  1.58s/it]
 57%|█████▋    | 17/30 [00:26<00:20,  1.58s/it]
 60%|██████    | 18/30 [00:28<00:18,  1.58s/it]
 63%|██████▎   | 19/30 [00:29<00:17,  1.58s/it]
 67%|██████▋   | 20/30 [00:31<00:15,  1.57s/it]
 70%|███████   | 21/30 [00:33<00:14,  1.57s/it]
 73%|███████▎  | 22/30 [00:34<00:12,  1.58s/it]
 77%|███████▋  | 23/30 [00:36<00:11,  1.58s/it]
 80%|████████  | 24/30 [00:37<00:09,  1.57s/it]
 83%|████████▎ | 25/30 [00:39<00:07,  1.57s/it]
 87%|████████▋ | 26/30 [00:40<00:06,  1.57s/it]
 90%|█████████ | 27/30 [00:42<00:04,  1.57s/it]
 93%|█████████▎| 28/30 [00:44<00:03,  1.57s/it]
 97%|█████████▋| 29/30 [00:45<00:01,  1.57s/it]
100%|██████████| 30/30 [00:47<00:00,  1.58s/it]
Optimizing PCA hyperparameters: 100%|██████████| 16/16 [12:43<00:00, 47.69s/it]
[13]:
optimizer.best_params
[13]:
{'n_pc': 4, 'wav_ind': 4615}

Note that optimizing for the polynomial fits is not currently supported; we plan to support this functionality in a future release of cortecs.