import numpy as np
import pandas as pd
import time
import warnings
import os
warnings.filterwarnings("ignore")
# pip install tqdm tqdm_joblib imbalanced-learn matplotlib seaborn
from tqdm.auto import tqdm
from tqdm_joblib import tqdm_joblib
import joblib
import matplotlib
matplotlib.use("Agg") # backend sin pantalla; cambiar a "TkAgg" si se quiere ventana
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.feature_selection import VarianceThreshold, SelectKBest, mutual_info_classif
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold, RandomizedSearchCV, cross_val_score
from sklearn.metrics import (
confusion_matrix, classification_report,
f1_score, balanced_accuracy_score, recall_score,
accuracy_score, roc_auc_score, make_scorer
)
from scipy.stats import loguniform
from scipy.special import softmax
from imblearn.pipeline import Pipeline as ImbPipeline
from imblearn.over_sampling import SMOTE
start_time = time.time()
# =========================
# 0) DATOS
# =========================
x = pd.read_csv(r'C:\Users\Gamer\Desktop\Cata\ESIG\path_signature_esig_M9.csv')
y = pd.read_csv(r'C:\Users\Gamer\Desktop\Cata\ts_v9.0.1_SMBH_ZTF_xmatch.csv')
y["id"] = y["oid"]
data = pd.merge(x, y, on="id")
data_train = data.sample(frac=0.8, random_state=42).reset_index(drop=True)
data_test = data.drop(data_train.index).reset_index(drop=True)
X_train = data_train.drop(columns=['oid','survey_class_mapped','survey_class','survey_class_cat','id'])
y_train = data_train['survey_class_mapped']
X_test = data_test[X_train.columns].copy()
y_test = data_test['survey_class_mapped']
le = LabelEncoder()
y_train_enc = le.fit_transform(y_train)
y_test_enc = le.transform(y_test)
labels = list(le.classes_)
DOWNLOADS = r'C:\Users\Gamer\Downloads'
os.makedirs(DOWNLOADS, exist_ok=True)
print("Shapes:", X_train.shape, X_test.shape)
print("Labels:", labels)
print("Distribución train:", dict(zip(*np.unique(y_train_enc, return_counts=True))))
# =========================
# 1) SCORERS
# =========================
def robust_score(y_true, y_pred):
mf1 = f1_score(y_true, y_pred, average="macro", zero_division=0)
bacc = balanced_accuracy_score(y_true, y_pred)
recalls = recall_score(y_true, y_pred, average=None, zero_division=0)
minR = float(np.min(recalls))
penalty = 0.0 if minR >= 0.30 else (0.30 - minR) * 2.0
return 0.50 * mf1 + 0.40 * bacc + 0.10 * minR - penalty
robust_scorer = make_scorer(robust_score)
# AUC OVR: decision_function → softmax → roc_auc_score
def _auc_ovr(y_true, y_score):
proba = softmax(y_score, axis=1) # convierte scores crudos a distribución [0,1] que suma 1
return roc_auc_score(y_true, proba, multi_class="ovr", average="macro")
auc_scorer = make_scorer(_auc_ovr, response_method="decision_function")
# =========================
# 2) PIPELINE CON SMOTE
# =========================
min_class_count = min(np.bincount(y_train_enc))
smote_k = min(5, min_class_count - 1)
def make_pipe(params=None):
p = ImbPipeline(steps=[
("imp", SimpleImputer(strategy="median")),
("sc", StandardScaler()),
("vt", VarianceThreshold(0.0)),
("smote", SMOTE(k_neighbors=smote_k, random_state=42)),
("kbest", SelectKBest(score_func=mutual_info_classif)),
("svc", SVC(kernel="rbf", decision_function_shape="ovr", cache_size=4000))
])
if params:
p.set_params(**params)
return p
pipe = make_pipe()
# =========================
# 3) ESPACIO DE BÚSQUEDA
# =========================
cw_options = [
"balanced",
{0: 2.0, 1: 4.0, 2: 1.0},
{0: 2.5, 1: 5.0, 2: 1.0},
{0: 1.5, 1: 3.5, 2: 0.8},
{0: 3.0, 1: 6.0, 2: 1.0},
{0: 1.0, 1: 3.0, 2: 0.7},
]
param_dist = {
"kbest__k": [128, 256, 384, 512, 768, 1023],
"svc__C": loguniform(0.5, 2000),
"svc__gamma": loguniform(1e-6, 0.1),
"svc__class_weight": cw_options,
}
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# =========================
# 4) BÚSQUEDA CON BARRA DE PROGRESO
# =========================
t0 = time.time()
rs = RandomizedSearchCV(
estimator=pipe,
param_distributions=param_dist,
n_iter=80,
scoring=robust_scorer,
cv=cv,
random_state=42,
n_jobs=-1,
verbose=0,
refit=True,
return_train_score=False,
error_score=0.0
)
n_fits = 80 * cv.n_splits
with tqdm_joblib(tqdm(
desc="Buscando hiperparámetros",
total=n_fits,
unit="fit",
colour="cyan",
bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} fits [{elapsed}<{remaining}, {rate_fmt}]"
)):
with joblib.parallel_config(backend="threading"):
rs.fit(X_train, y_train_enc)
print("\nTiempo búsqueda (s):", int(time.time() - t0))
print("Best robust CV:", rs.best_score_)
print("Best params:", rs.best_params_)
# =========================
# 5) TOP-10 ÚNICOS
# =========================
def _canon_value(v):
if isinstance(v, np.generic): return v.item()
if isinstance(v, dict): return tuple(sorted((int(k), float(w)) for k, w in v.items()))
return v
def _params_key(d):
return tuple(sorted((k, _canon_value(v)) for k, v in d.items()))
res = pd.DataFrame(rs.cv_results_).copy()
res["params_key"] = res["params"].apply(_params_key)
res = res.sort_values(["mean_test_score", "std_test_score"], ascending=[False, True]).reset_index(drop=True)
res_unique = res.drop_duplicates(subset=["params_key"], keep="first").reset_index(drop=True)
top10 = res_unique.head(10)[["mean_test_score", "std_test_score", "params"]].copy()
print("\nTOP-10 CV robust (únicos):")
print(top10.to_string(index=False))
# =========================
# 6) EVALUACIÓN COMPLETA + FIGURAS
# =========================
def _row_normalize(cm):
cm = cm.astype(float)
row_sums = cm.sum(axis=1, keepdims=True)
row_sums[row_sums == 0] = 1.0
return (cm / row_sums) * 100.0
def plot_cms(cm_train, cm_test, tag, save_dir, subtitle="",
gap_width=0.28, wspace=0.15,
label_fontsize=13, tick_fontsize=13, title_fontsize=14):
"""Guarda figura con CM de train y test — mismo estilo que el resto de tus CMs."""
cm_tr_pct = _row_normalize(cm_train)
cm_te_pct = _row_normalize(cm_test)
fig = plt.figure(figsize=(10.8, 4.8))
gs = gridspec.GridSpec(1, 4,
width_ratios=[1, gap_width, 1, 0.08],
wspace=wspace)
ax1 = fig.add_subplot(gs[0, 0])
ax_gap = fig.add_subplot(gs[0, 1]); ax_gap.axis("off")
ax2 = fig.add_subplot(gs[0, 2])
ax_cb = fig.add_subplot(gs[0, 3])
im = None
for ax, cm_pct, cm_cnt, title in [
(ax1, cm_tr_pct, cm_train, "Train"),
(ax2, cm_te_pct, cm_test, "Test"),
]:
im = ax.imshow(cm_pct, cmap="Blues", vmin=0, vmax=100)
ax.set_title(title, fontsize=title_fontsize)
ax.set_xticks(np.arange(len(labels)))
ax.set_yticks(np.arange(len(labels)))
ax.set_xticklabels(labels, rotation=45, ha="right", fontsize=tick_fontsize)
ax.set_yticklabels(labels, fontsize=tick_fontsize)
ax.set_xlabel("Predicho", fontsize=label_fontsize)
ax.set_ylabel("Real", fontsize=label_fontsize)
for i in range(cm_pct.shape[0]):
for j in range(cm_pct.shape[1]):
pct = cm_pct[i, j]
cnt = int(cm_cnt[i, j])
color_txt = "white" if pct > 50 else "black"
ax.text(j, i - 0.10, f"{pct:.1f}%",
ha="center", va="center",
color=color_txt, fontsize=10, fontweight="bold")
ax.text(j, i + 0.22, f"({cnt})",
ha="center", va="center",
color=color_txt, fontsize=7)
fig.colorbar(im, cax=ax_cb, label="% por fila (clase real)")
fig.suptitle(f"{tag}\n{subtitle}", fontsize=13, y=0.98)
fig.subplots_adjust(left=0.08, right=0.92, bottom=0.22, top=0.82)
fname = os.path.join(save_dir, f"{tag}.png")
fig.savefig(fname, dpi=300, bbox_inches="tight")
plt.close(fig)
print(f" Figura guardada: {fname}")
def eval_one(params, tag):
print("\n" + "="*95)
print(f"Evaluando {tag}...")
# AUC en CV (5 folds, calcula sobreajuste respecto a validación)
auc_cv_scores = cross_val_score(
make_pipe(params), X_train, y_train_enc,
cv=cv, scoring=auc_scorer, n_jobs=-1
)
auc_cv = float(np.mean(auc_cv_scores))
sd_cv = float(np.std(auc_cv_scores))
# Reentrenar sobre todo el train
model = make_pipe(params)
model.fit(X_train, y_train_enc)
yhat_tr = model.predict(X_train)
yhat_te = model.predict(X_test)
df_tr = softmax(model.decision_function(X_train), axis=1)
df_te = softmax(model.decision_function(X_test), axis=1)
auc_train = roc_auc_score(y_train_enc, df_tr, multi_class="ovr", average="macro")
auc_test = roc_auc_score(y_test_enc, df_te, multi_class="ovr", average="macro")
gap_cv = round(auc_train - auc_cv, 4)
gap_rep = round(auc_train - auc_test, 4)
acc_test = accuracy_score(y_test_enc, yhat_te)
f1w_test = f1_score(y_test_enc, yhat_te, average="weighted", zero_division=0)
mf1_test = f1_score(y_test_enc, yhat_te, average="macro", zero_division=0)
bacc_test = balanced_accuracy_score(y_test_enc, yhat_te)
cm_tr = confusion_matrix(y_train_enc, yhat_tr)
cm_te = confusion_matrix(y_test_enc, yhat_te)
print(f" AUC_CV={auc_cv:.4f}±{sd_cv:.4f} | AUC_train={auc_train:.4f} | AUC_test={auc_test:.4f}")
print(f" Gap_CV={gap_cv:.4f} | Gap_rep={gap_rep:.4f}")
print(f" Acc={acc_test:.4f} | F1w={f1w_test:.4f} | macroF1={mf1_test:.4f} | balacc={bacc_test:.4f}")
print("\n Report TRAIN")
print(classification_report(y_train_enc, yhat_tr, target_names=labels, zero_division=0))
print(" CM TEST")
print(pd.DataFrame(cm_te, index=labels, columns=labels))
print("\n Report TEST")
print(classification_report(y_test_enc, yhat_te, target_names=labels, zero_division=0))
subtitle = (
f"Acc train={accuracy_score(y_train_enc, yhat_tr):.3f} | "
f"Acc test={acc_test:.3f} | "
f"F1w train={f1_score(y_train_enc, yhat_tr, average='weighted', zero_division=0):.3f} | "
f"F1w test={f1w_test:.3f}"
)
plot_cms(cm_tr, cm_te, tag, DOWNLOADS, subtitle=subtitle)
return {
"tag": tag,
"AUC_CV": round(auc_cv, 4),
"SD_CV": round(sd_cv, 4),
"Gap_CV": gap_cv,
"AUC_rep": round(auc_test, 4),
"SD_rep": round(sd_cv, 4),
"Gap_rep": gap_rep,
"Acc_test": round(acc_test, 4),
"F1w_test": round(f1w_test, 4),
"macroF1": round(mf1_test, 4),
"balacc": round(bacc_test, 4),
}
results_summary = []
for i, row in enumerate(top10.head(5).itertuples(index=False), start=1):
r = eval_one(row.params, f"SVM{i}")
results_summary.append(r)
# =========================
# 7) TABLA RESUMEN + LATEX AUTO-GENERADO
# =========================
summary_df = pd.DataFrame(results_summary)
print("\n" + "="*95)
print("RESUMEN FINAL:")
print(summary_df.to_string(index=False))
best_idx = summary_df["AUC_rep"].idxmax()
best_tag = summary_df.loc[best_idx, "tag"]
print(f"\n>>> Mejor modelo: {best_tag} AUC_test={summary_df.loc[best_idx,'AUC_rep']:.4f}")
# Generar snippet LaTeX
latex_rows = []
for _, r in summary_df.iterrows():
highlight = r"\rowcolor{BlueBest} " if r["tag"] == best_tag else ""
latex_rows.append(
f" {highlight}SVM$_{{{r['tag'][-1]}}}$ & "
f"{r['AUC_CV']:.4f} & {r['SD_CV']:.4f} & {r['Gap_CV']:.4f} & "
f"{r['AUC_rep']:.4f} & {r['SD_rep']:.4f} & {r['Gap_rep']:.4f} & "
f"{r['Acc_test']:.4f} & {r['F1w_test']:.4f} \\\\"
)
latex_table = (
r"\begin{table}[!ht]" + "\n"
r"\centering" + "\n"
r"\small" + "\n"
r"\renewcommand{\arraystretch}{1.18}" + "\n"
r"\setlength{\tabcolsep}{6pt}" + "\n"
r"\begin{adjustbox}{width=\textwidth}" + "\n"
r"\rowcolors{2}{white}{gray!8}" + "\n"
r"\begin{tabular}{ccccccccc}" + "\n"
r"\toprule" + "\n"
r"\rowcolor{BlueHeader}" + "\n"
r"\color{white}\textbf{Modelo} &" + "\n"
r"\color{white}\textbf{AUC\textsubscript{CV}} &" + "\n"
r"\color{white}\textbf{SD\textsubscript{CV}} &" + "\n"
r"\color{white}\textbf{Gap\textsubscript{CV}} &" + "\n"
r"\color{white}\textbf{AUC\textsubscript{rep}} &" + "\n"
r"\color{white}\textbf{SD\textsubscript{rep}} &" + "\n"
r"\color{white}\textbf{Gap\textsubscript{rep}} &" + "\n"
r"\color{white}\textbf{Acc\textsubscript{test}} &" + "\n"
r"\color{white}\textbf{F1\textsubscript{w,test}} \\" + "\n"
r"\midrule" + "\n"
+ "\n".join(latex_rows) + "\n"
r"\bottomrule" + "\n"
r"\end{tabular}" + "\n"
r"\end{adjustbox}" + "\n"
r"\caption{Desempeño de los cinco mejores modelos SVM (path signature, ESIG).}" + "\n"
r"\label{tab:svm_top5_auc}" + "\n"
r"\end{table}"
)
latex_path = os.path.join(DOWNLOADS, "tabla_svm_top5.tex")
with open(latex_path, "w", encoding="utf-8") as f:
f.write(latex_table)
print(f"\nTabla LaTeX guardada en: {latex_path}")
print("\n--- PREVIEW ---\n" + latex_table)
# =========================
# 8) TIEMPO TOTAL
# =========================
elapsed = int(time.time() - start_time)
h, rem = divmod(elapsed, 3600)
m, s = divmod(rem, 60)
print(f"\nTiempo total: {h:02d}:{m:02d}:{s:02d}")Shapes: (1510, 1023) (377, 1023)
Labels: ['AGN', 'Blazar', 'QSO']
Distribución train: {np.int64(0): np.int64(422), np.int64(1): np.int64(189), np.int64(2): np.int64(899)}
Buscando hiperparámetros: 0%| | 0/400 fits [00:00<?, ?fit/s]
0%| | 0/400 [00:00<?, ?it/s]
0%|▏ | 1/400 [00:27<3:01:40, 27.32s/it]
0%|▍ | 2/400 [00:29<1:23:08, 12.53s/it]
1%|▌ | 3/400 [00:29<45:47, 6.92s/it]
1%|▊ | 4/400 [00:30<29:42, 4.50s/it]
2%|█▍ | 7/400 [00:30<11:09, 1.70s/it]
2%|█▋ | 8/400 [00:42<26:08, 4.00s/it]
2%|█▊ | 9/400 [00:44<22:56, 3.52s/it]
2%|██ | 10/400 [00:45<18:06, 2.79s/it]
3%|██▏ | 11/400 [00:45<14:09, 2.18s/it]
3%|██▍ | 12/400 [00:48<15:35, 2.41s/it]
3%|██▋ | 13/400 [00:49<13:12, 2.05s/it]
4%|██▊ | 14/400 [00:50<09:41, 1.51s/it]
4%|███▏ | 16/400 [00:50<06:02, 1.06it/s]
4%|███▍ | 17/400 [00:50<04:43, 1.35it/s]
4%|███▋ | 18/400 [00:50<03:47, 1.68it/s]
5%|███▊ | 19/400 [00:51<03:24, 1.87it/s]
5%|████ | 20/400 [01:05<27:28, 4.34s/it]
5%|████▎ | 21/400 [01:09<27:40, 4.38s/it]
6%|████▍ | 22/400 [01:10<21:35, 3.43s/it]
6%|████▋ | 23/400 [01:11<16:48, 2.67s/it]
6%|████▊ | 24/400 [01:14<17:06, 2.73s/it]
6%|█████ | 25/400 [01:14<12:23, 1.98s/it]
6%|█████▎ | 26/400 [01:16<11:38, 1.87s/it]
7%|█████▍ | 27/400 [01:16<09:00, 1.45s/it]
7%|█████▊ | 29/400 [01:17<05:28, 1.13it/s]
8%|██████▎ | 31/400 [01:17<03:24, 1.80it/s]
8%|██████▍ | 32/400 [01:28<17:13, 2.81s/it]
8%|██████▋ | 33/400 [01:32<19:49, 3.24s/it]
8%|██████▉ | 34/400 [01:34<16:40, 2.73s/it]
9%|███████ | 35/400 [01:34<13:32, 2.23s/it]
9%|███████▎ | 36/400 [01:39<17:05, 2.82s/it]
9%|███████▍ | 37/400 [01:39<12:40, 2.09s/it]
10%|███████▋ | 38/400 [01:41<12:10, 2.02s/it]
10%|███████▉ | 39/400 [01:42<10:07, 1.68s/it]
10%|████████ | 40/400 [01:42<07:33, 1.26s/it]
10%|████████▎ | 41/400 [01:45<09:58, 1.67s/it]
10%|████████▌ | 42/400 [01:45<07:55, 1.33s/it]
11%|████████▋ | 43/400 [01:45<05:48, 1.02it/s]
11%|████████▉ | 44/400 [01:53<17:55, 3.02s/it]
11%|█████████ | 45/400 [01:58<20:44, 3.51s/it]
12%|█████████▎ | 46/400 [02:01<20:28, 3.47s/it]
12%|█████████▌ | 47/400 [02:02<16:03, 2.73s/it]
12%|█████████▋ | 48/400 [02:06<18:10, 3.10s/it]
12%|█████████▉ | 49/400 [02:08<15:07, 2.59s/it]
12%|██████████▏ | 50/400 [02:09<13:26, 2.31s/it]
13%|██████████▎ | 51/400 [02:10<09:54, 1.70s/it]
13%|██████████▋ | 53/400 [02:11<07:40, 1.33s/it]
14%|██████████▉ | 54/400 [02:12<07:10, 1.24s/it]
14%|███████████▏ | 55/400 [02:13<06:51, 1.19s/it]
14%|███████████▎ | 56/400 [02:15<06:54, 1.21s/it]
14%|███████████▌ | 57/400 [02:19<12:28, 2.18s/it]
14%|███████████▋ | 58/400 [02:23<14:54, 2.62s/it]
15%|███████████▉ | 59/400 [02:24<12:03, 2.12s/it]
15%|████████████▏ | 60/400 [02:29<16:38, 2.94s/it]
15%|████████████▎ | 61/400 [02:31<16:12, 2.87s/it]
16%|████████████▌ | 62/400 [02:34<16:07, 2.86s/it]
16%|████████████▊ | 63/400 [02:35<12:14, 2.18s/it]
16%|█████████████▏ | 65/400 [02:37<08:53, 1.59s/it]
16%|█████████████▎ | 66/400 [02:37<07:45, 1.39s/it]
17%|█████████████▌ | 67/400 [02:39<07:43, 1.39s/it]
17%|█████████████▊ | 68/400 [02:39<06:24, 1.16s/it]
17%|█████████████▉ | 69/400 [02:45<12:36, 2.28s/it]
18%|██████████████▏ | 70/400 [02:48<14:02, 2.55s/it]
18%|██████████████▍ | 71/400 [02:48<10:50, 1.98s/it]
18%|██████████████▌ | 72/400 [02:53<15:14, 2.79s/it]
18%|██████████████▊ | 73/400 [02:56<15:04, 2.77s/it]
18%|██████████████▉ | 74/400 [02:59<15:40, 2.89s/it]
19%|███████████████▏ | 75/400 [03:00<11:59, 2.21s/it]
19%|███████████████▍ | 76/400 [03:00<08:48, 1.63s/it]
19%|███████████████▌ | 77/400 [03:02<09:39, 1.79s/it]
20%|███████████████▊ | 78/400 [03:03<08:25, 1.57s/it]
20%|███████████████▉ | 79/400 [03:05<08:13, 1.54s/it]
20%|████████████████▏ | 80/400 [03:05<06:16, 1.18s/it]
20%|████████████████▍ | 81/400 [03:09<10:52, 2.05s/it]
20%|████████████████▌ | 82/400 [03:12<12:51, 2.43s/it]
21%|████████████████▊ | 83/400 [03:13<09:51, 1.87s/it]
21%|█████████████████ | 84/400 [03:17<13:53, 2.64s/it]
21%|█████████████████▏ | 85/400 [03:20<14:17, 2.72s/it]
22%|█████████████████▍ | 86/400 [03:27<20:56, 4.00s/it]
22%|█████████████████▌ | 87/400 [03:29<17:50, 3.42s/it]
22%|█████████████████▊ | 88/400 [03:31<15:21, 2.95s/it]
22%|██████████████████ | 89/400 [03:32<11:37, 2.24s/it]
22%|██████████████████▏ | 90/400 [03:32<08:43, 1.69s/it]
23%|██████████████████▍ | 91/400 [03:33<07:18, 1.42s/it]
23%|██████████████████▋ | 92/400 [03:33<05:16, 1.03s/it]
23%|██████████████████▊ | 93/400 [03:34<05:04, 1.01it/s]
24%|███████████████████ | 94/400 [03:38<09:15, 1.82s/it]
24%|███████████████████▏ | 95/400 [03:39<07:54, 1.56s/it]
24%|███████████████████▍ | 96/400 [03:44<13:57, 2.75s/it]
24%|███████████████████▋ | 97/400 [03:47<13:50, 2.74s/it]
24%|███████████████████▊ | 98/400 [03:54<20:04, 3.99s/it]
25%|████████████████████ | 99/400 [03:56<16:39, 3.32s/it]
25%|████████████████████ | 100/400 [03:56<11:56, 2.39s/it]
25%|████████████████████▏ | 101/400 [03:57<09:29, 1.91s/it]
26%|████████████████████▌ | 103/400 [03:57<05:41, 1.15s/it]
26%|████████████████████▊ | 104/400 [03:58<05:19, 1.08s/it]
26%|█████████████████████ | 105/400 [03:59<05:14, 1.07s/it]
26%|█████████████████████▏ | 106/400 [04:01<06:52, 1.40s/it]
27%|█████████████████████▍ | 107/400 [04:02<06:16, 1.29s/it]
27%|█████████████████████▌ | 108/400 [04:08<12:41, 2.61s/it]
27%|█████████████████████▊ | 109/400 [04:11<12:46, 2.63s/it]
28%|██████████████████████ | 110/400 [04:18<18:37, 3.85s/it]
28%|██████████████████████▏ | 111/400 [04:21<17:07, 3.56s/it]
28%|██████████████████████▍ | 112/400 [04:21<12:22, 2.58s/it]
28%|██████████████████████▌ | 113/400 [04:21<09:26, 1.97s/it]
28%|██████████████████████▊ | 114/400 [04:22<07:18, 1.53s/it]
29%|███████████████████████▏ | 116/400 [04:22<04:35, 1.03it/s]
29%|███████████████████████▍ | 117/400 [04:23<03:56, 1.20it/s]
30%|███████████████████████▌ | 118/400 [04:25<05:40, 1.21s/it]
30%|███████████████████████▊ | 119/400 [04:26<05:49, 1.24s/it]
30%|████████████████████████ | 120/400 [04:32<11:44, 2.52s/it]
30%|████████████████████████▏ | 121/400 [04:35<11:35, 2.49s/it]
30%|████████████████████████▍ | 122/400 [04:42<17:29, 3.77s/it]
31%|████████████████████████▌ | 123/400 [04:45<16:31, 3.58s/it]
31%|████████████████████████▊ | 124/400 [04:45<12:08, 2.64s/it]
31%|█████████████████████████ | 125/400 [04:45<09:02, 1.97s/it]
32%|█████████████████████████▏ | 126/400 [04:52<15:01, 3.29s/it]
32%|█████████████████████████▌ | 128/400 [04:52<08:28, 1.87s/it]
32%|█████████████████████████▊ | 129/400 [04:53<06:58, 1.55s/it]
32%|██████████████████████████ | 130/400 [04:55<07:11, 1.60s/it]
33%|██████████████████████████▏ | 131/400 [04:57<08:32, 1.91s/it]
33%|██████████████████████████▍ | 132/400 [05:01<11:15, 2.52s/it]
33%|██████████████████████████▌ | 133/400 [05:02<09:04, 2.04s/it]
34%|██████████████████████████▊ | 134/400 [05:08<14:11, 3.20s/it]
34%|███████████████████████████ | 135/400 [05:14<17:27, 3.95s/it]
34%|███████████████████████████▏ | 136/400 [05:25<26:53, 6.11s/it]
34%|███████████████████████████▍ | 137/400 [05:28<21:55, 5.00s/it]
34%|███████████████████████████▌ | 138/400 [05:32<21:19, 4.88s/it]
35%|███████████████████████████▊ | 139/400 [05:34<16:45, 3.85s/it]
35%|████████████████████████████ | 140/400 [05:35<12:44, 2.94s/it]
35%|████████████████████████████▏ | 141/400 [05:36<10:49, 2.51s/it]
36%|████████████████████████████▍ | 142/400 [05:37<08:12, 1.91s/it]
36%|████████████████████████████▌ | 143/400 [05:39<08:19, 1.94s/it]
36%|████████████████████████████▊ | 144/400 [05:43<11:25, 2.68s/it]
36%|█████████████████████████████ | 145/400 [05:45<10:10, 2.39s/it]
36%|█████████████████████████████▏ | 146/400 [05:45<07:18, 1.73s/it]
37%|█████████████████████████████▍ | 147/400 [05:50<11:37, 2.76s/it]
37%|█████████████████████████████▌ | 148/400 [05:51<09:29, 2.26s/it]
37%|█████████████████████████████▊ | 149/400 [05:52<07:33, 1.81s/it]
38%|██████████████████████████████ | 150/400 [05:52<05:25, 1.30s/it]
38%|██████████████████████████████▏ | 151/400 [05:55<06:58, 1.68s/it]
38%|██████████████████████████████▍ | 152/400 [05:56<06:43, 1.63s/it]
38%|██████████████████████████████▌ | 153/400 [05:58<07:24, 1.80s/it]
38%|██████████████████████████████▊ | 154/400 [05:59<05:54, 1.44s/it]
39%|███████████████████████████████ | 155/400 [06:01<06:34, 1.61s/it]
39%|███████████████████████████████▏ | 156/400 [06:07<12:19, 3.03s/it]
39%|███████████████████████████████▍ | 157/400 [06:10<12:21, 3.05s/it]
40%|███████████████████████████████▌ | 158/400 [06:10<08:45, 2.17s/it]
40%|███████████████████████████████▊ | 159/400 [06:15<12:02, 3.00s/it]
40%|████████████████████████████████ | 160/400 [06:17<10:15, 2.56s/it]
40%|████████████████████████████████▏ | 161/400 [06:20<10:51, 2.73s/it]
40%|████████████████████████████████▍ | 162/400 [06:20<07:48, 1.97s/it]
41%|████████████████████████████████▌ | 163/400 [06:23<08:15, 2.09s/it]
41%|████████████████████████████████▊ | 164/400 [06:25<08:25, 2.14s/it]
41%|█████████████████████████████████ | 165/400 [06:26<06:37, 1.69s/it]
42%|█████████████████████████████████▏ | 166/400 [06:27<06:07, 1.57s/it]
42%|█████████████████████████████████▍ | 167/400 [06:27<04:50, 1.25s/it]
42%|█████████████████████████████████▌ | 168/400 [06:32<08:25, 2.18s/it]
42%|█████████████████████████████████▊ | 169/400 [06:36<11:25, 2.97s/it]
42%|██████████████████████████████████ | 170/400 [06:37<08:24, 2.19s/it]
43%|██████████████████████████████████▏ | 171/400 [06:39<07:59, 2.09s/it]
43%|██████████████████████████████████▍ | 172/400 [06:41<07:40, 2.02s/it]
43%|██████████████████████████████████▌ | 173/400 [06:45<09:53, 2.62s/it]
44%|██████████████████████████████████▊ | 174/400 [06:45<07:11, 1.91s/it]
44%|███████████████████████████████████ | 175/400 [06:47<07:30, 2.00s/it]
44%|███████████████████████████████████▏ | 176/400 [06:49<07:32, 2.02s/it]
44%|███████████████████████████████████▍ | 177/400 [06:50<05:47, 1.56s/it]
44%|███████████████████████████████████▌ | 178/400 [06:51<05:44, 1.55s/it]
45%|███████████████████████████████████▊ | 179/400 [06:52<04:31, 1.23s/it]
45%|████████████████████████████████████ | 180/400 [06:56<07:39, 2.09s/it]
45%|████████████████████████████████████▏ | 181/400 [07:03<12:56, 3.55s/it]
46%|████████████████████████████████████▍ | 182/400 [07:03<09:31, 2.62s/it]
46%|████████████████████████████████████▌ | 183/400 [07:04<07:45, 2.15s/it]
46%|████████████████████████████████████▊ | 184/400 [07:06<07:24, 2.06s/it]
46%|█████████████████████████████████████ | 185/400 [07:09<08:30, 2.37s/it]
46%|█████████████████████████████████████▏ | 186/400 [07:10<06:51, 1.92s/it]
47%|█████████████████████████████████████▍ | 187/400 [07:11<05:53, 1.66s/it]
47%|█████████████████████████████████████▌ | 188/400 [07:13<06:25, 1.82s/it]
47%|█████████████████████████████████████▊ | 189/400 [07:14<04:49, 1.37s/it]
48%|██████████████████████████████████████ | 190/400 [07:15<05:04, 1.45s/it]
48%|██████████████████████████████████████▏ | 191/400 [07:17<05:43, 1.65s/it]
48%|██████████████████████████████████████▍ | 192/400 [07:21<08:13, 2.37s/it]
48%|██████████████████████████████████████▌ | 193/400 [07:29<14:01, 4.06s/it]
48%|██████████████████████████████████████▊ | 194/400 [07:30<10:35, 3.08s/it]
49%|███████████████████████████████████████ | 195/400 [07:30<07:43, 2.26s/it]
49%|███████████████████████████████████████▏ | 196/400 [07:31<05:53, 1.73s/it]
49%|███████████████████████████████████████▍ | 197/400 [07:33<06:27, 1.91s/it]
50%|███████████████████████████████████████▌ | 198/400 [07:34<05:21, 1.59s/it]
50%|███████████████████████████████████████▊ | 199/400 [07:35<04:53, 1.46s/it]
50%|████████████████████████████████████████ | 200/400 [07:38<05:38, 1.69s/it]
50%|████████████████████████████████████████▏ | 201/400 [07:38<04:18, 1.30s/it]
50%|████████████████████████████████████████▍ | 202/400 [07:40<04:41, 1.42s/it]
51%|████████████████████████████████████████▌ | 203/400 [07:42<05:17, 1.61s/it]
51%|████████████████████████████████████████▊ | 204/400 [07:46<07:40, 2.35s/it]
51%|█████████████████████████████████████████ | 205/400 [07:54<13:09, 4.05s/it]
52%|█████████████████████████████████████████▏ | 206/400 [08:00<15:20, 4.75s/it]
52%|█████████████████████████████████████████▍ | 207/400 [08:02<12:45, 3.97s/it]
52%|█████████████████████████████████████████▌ | 208/400 [08:02<08:59, 2.81s/it]
52%|█████████████████████████████████████████▊ | 209/400 [08:04<07:19, 2.30s/it]
52%|██████████████████████████████████████████ | 210/400 [08:05<06:42, 2.12s/it]
53%|██████████████████████████████████████████▏ | 211/400 [08:05<04:48, 1.53s/it]
53%|██████████████████████████████████████████▍ | 212/400 [08:06<04:23, 1.40s/it]
53%|██████████████████████████████████████████▌ | 213/400 [08:07<03:36, 1.16s/it]
54%|██████████████████████████████████████████▊ | 214/400 [08:07<02:55, 1.06it/s]
54%|███████████████████████████████████████████ | 215/400 [08:10<04:05, 1.33s/it]
54%|███████████████████████████████████████████▏ | 216/400 [08:10<03:13, 1.05s/it]
54%|███████████████████████████████████████████▍ | 217/400 [08:15<06:58, 2.29s/it]
55%|███████████████████████████████████████████▌ | 218/400 [08:22<11:21, 3.75s/it]
55%|███████████████████████████████████████████▊ | 219/400 [08:26<10:50, 3.59s/it]
55%|████████████████████████████████████████████ | 220/400 [08:26<07:41, 2.56s/it]
55%|████████████████████████████████████████████▏ | 221/400 [08:28<07:10, 2.40s/it]
56%|████████████████████████████████████████████▍ | 222/400 [08:31<07:45, 2.62s/it]
56%|████████████████████████████████████████████▊ | 224/400 [08:32<05:02, 1.72s/it]
56%|█████████████████████████████████████████████ | 225/400 [08:33<04:17, 1.47s/it]
56%|█████████████████████████████████████████████▏ | 226/400 [08:34<04:05, 1.41s/it]
57%|█████████████████████████████████████████████▍ | 227/400 [08:37<04:56, 1.71s/it]
57%|█████████████████████████████████████████████▌ | 228/400 [08:37<03:39, 1.27s/it]
57%|█████████████████████████████████████████████▊ | 229/400 [08:41<05:43, 2.01s/it]
57%|██████████████████████████████████████████████ | 230/400 [08:48<10:08, 3.58s/it]
58%|██████████████████████████████████████████████▏ | 231/400 [08:52<10:09, 3.61s/it]
58%|██████████████████████████████████████████████▍ | 232/400 [08:52<07:19, 2.61s/it]
58%|██████████████████████████████████████████████▌ | 233/400 [08:53<06:10, 2.22s/it]
58%|██████████████████████████████████████████████▊ | 234/400 [08:57<07:26, 2.69s/it]
59%|███████████████████████████████████████████████▏ | 236/400 [08:57<04:05, 1.50s/it]
59%|███████████████████████████████████████████████▍ | 237/400 [08:58<03:19, 1.22s/it]
60%|███████████████████████████████████████████████▌ | 238/400 [08:59<03:07, 1.16s/it]
60%|███████████████████████████████████████████████▊ | 239/400 [09:02<04:19, 1.61s/it]
60%|████████████████████████████████████████████████▏ | 241/400 [09:10<07:22, 2.78s/it]
60%|████████████████████████████████████████████████▍ | 242/400 [09:19<10:50, 4.12s/it]
61%|████████████████████████████████████████████████▌ | 243/400 [09:21<09:28, 3.62s/it]
61%|████████████████████████████████████████████████▊ | 244/400 [09:21<06:59, 2.69s/it]
62%|█████████████████████████████████████████████████▏ | 246/400 [09:21<04:03, 1.58s/it]
62%|█████████████████████████████████████████████████▍ | 247/400 [09:22<03:31, 1.38s/it]
62%|█████████████████████████████████████████████████▌ | 248/400 [09:23<03:14, 1.28s/it]
62%|█████████████████████████████████████████████████▊ | 249/400 [09:23<02:38, 1.05s/it]
62%|██████████████████████████████████████████████████ | 250/400 [09:26<03:44, 1.49s/it]
63%|██████████████████████████████████████████████████▏ | 251/400 [09:36<09:45, 3.93s/it]
63%|██████████████████████████████████████████████████▍ | 252/400 [09:37<07:56, 3.22s/it]
63%|██████████████████████████████████████████████████▌ | 253/400 [09:42<09:08, 3.73s/it]
64%|██████████████████████████████████████████████████▊ | 254/400 [09:45<08:10, 3.36s/it]
64%|███████████████████████████████████████████████████ | 255/400 [09:45<05:49, 2.41s/it]
64%|███████████████████████████████████████████████████▏ | 256/400 [09:45<04:08, 1.73s/it]
64%|███████████████████████████████████████████████████▍ | 257/400 [09:46<03:37, 1.52s/it]
64%|███████████████████████████████████████████████████▌ | 258/400 [09:47<03:11, 1.35s/it]
65%|███████████████████████████████████████████████████▊ | 259/400 [09:56<08:35, 3.66s/it]
65%|████████████████████████████████████████████████████ | 260/400 [09:58<06:55, 2.97s/it]
65%|████████████████████████████████████████████████████▏ | 261/400 [10:01<07:06, 3.07s/it]
66%|████████████████████████████████████████████████████▍ | 262/400 [10:04<06:52, 2.99s/it]
66%|████████████████████████████████████████████████████▌ | 263/400 [10:05<05:50, 2.56s/it]
66%|████████████████████████████████████████████████████▊ | 264/400 [10:05<04:10, 1.84s/it]
66%|█████████████████████████████████████████████████████ | 265/400 [10:06<03:05, 1.37s/it]
66%|█████████████████████████████████████████████████████▏ | 266/400 [10:07<02:52, 1.29s/it]
67%|█████████████████████████████████████████████████████▍ | 267/400 [10:08<02:38, 1.19s/it]
67%|█████████████████████████████████████████████████████▌ | 268/400 [10:09<02:27, 1.12s/it]
67%|█████████████████████████████████████████████████████▊ | 269/400 [10:15<05:57, 2.73s/it]
68%|██████████████████████████████████████████████████████ | 270/400 [10:18<06:04, 2.80s/it]
68%|██████████████████████████████████████████████████████▏ | 271/400 [10:20<05:23, 2.50s/it]
68%|██████████████████████████████████████████████████████▍ | 272/400 [10:22<04:55, 2.31s/it]
68%|██████████████████████████████████████████████████████▌ | 273/400 [10:25<05:25, 2.56s/it]
68%|██████████████████████████████████████████████████████▊ | 274/400 [10:29<05:59, 2.85s/it]
69%|███████████████████████████████████████████████████████ | 275/400 [10:29<04:20, 2.09s/it]
69%|███████████████████████████████████████████████████████▏ | 276/400 [10:29<03:14, 1.57s/it]
69%|███████████████████████████████████████████████████████▍ | 277/400 [10:30<02:42, 1.33s/it]
70%|███████████████████████████████████████████████████████▌ | 278/400 [10:31<02:27, 1.21s/it]
70%|███████████████████████████████████████████████████████▊ | 279/400 [10:31<01:47, 1.12it/s]
70%|████████████████████████████████████████████████████████ | 280/400 [10:32<01:51, 1.07it/s]
70%|████████████████████████████████████████████████████████▏ | 281/400 [10:52<13:15, 6.68s/it]
70%|████████████████████████████████████████████████████████▍ | 282/400 [10:53<09:26, 4.80s/it]
71%|████████████████████████████████████████████████████████▌ | 283/400 [10:53<06:40, 3.43s/it]
71%|████████████████████████████████████████████████████████▊ | 284/400 [10:53<04:52, 2.52s/it]
71%|█████████████████████████████████████████████████████████ | 285/400 [10:54<03:54, 2.04s/it]
72%|█████████████████████████████████████████████████████████▏ | 286/400 [11:01<06:31, 3.44s/it]
72%|█████████████████████████████████████████████████████████▍ | 287/400 [11:01<04:48, 2.55s/it]
72%|█████████████████████████████████████████████████████████▌ | 288/400 [11:18<12:25, 6.66s/it]
72%|█████████████████████████████████████████████████████████▊ | 289/400 [11:18<08:55, 4.83s/it]
72%|██████████████████████████████████████████████████████████ | 290/400 [11:20<07:11, 3.92s/it]
73%|██████████████████████████████████████████████████████████▏ | 291/400 [11:22<05:57, 3.28s/it]
73%|██████████████████████████████████████████████████████████▍ | 292/400 [11:22<04:12, 2.34s/it]
73%|██████████████████████████████████████████████████████████▌ | 293/400 [11:23<03:24, 1.91s/it]
74%|███████████████████████████████████████████████████████████ | 295/400 [11:38<07:59, 4.57s/it]
74%|███████████████████████████████████████████████████████████▏ | 296/400 [11:43<07:55, 4.57s/it]
74%|███████████████████████████████████████████████████████████▍ | 297/400 [11:44<06:18, 3.68s/it]
74%|███████████████████████████████████████████████████████████▌ | 298/400 [11:47<06:04, 3.58s/it]
75%|███████████████████████████████████████████████████████████▊ | 299/400 [11:51<05:59, 3.56s/it]
75%|████████████████████████████████████████████████████████████▏ | 301/400 [11:52<03:39, 2.21s/it]
76%|████████████████████████████████████████████████████████████▍ | 302/400 [11:53<03:19, 2.04s/it]
76%|████████████████████████████████████████████████████████████▌ | 303/400 [11:56<03:26, 2.13s/it]
76%|████████████████████████████████████████████████████████████▊ | 304/400 [12:00<04:15, 2.66s/it]
76%|█████████████████████████████████████████████████████████████ | 305/400 [12:02<03:59, 2.52s/it]
76%|█████████████████████████████████████████████████████████████▏ | 306/400 [12:07<05:11, 3.31s/it]
77%|█████████████████████████████████████████████████████████████▍ | 307/400 [12:12<05:45, 3.71s/it]
77%|█████████████████████████████████████████████████████████████▌ | 308/400 [12:16<05:40, 3.70s/it]
77%|█████████████████████████████████████████████████████████████▊ | 309/400 [12:17<04:35, 3.02s/it]
78%|██████████████████████████████████████████████████████████████ | 310/400 [12:17<03:20, 2.23s/it]
78%|██████████████████████████████████████████████████████████████▏ | 311/400 [12:18<02:35, 1.74s/it]
78%|██████████████████████████████████████████████████████████████▍ | 312/400 [12:18<01:57, 1.33s/it]
78%|██████████████████████████████████████████████████████████████▌ | 313/400 [12:19<01:39, 1.14s/it]
78%|██████████████████████████████████████████████████████████████▊ | 314/400 [12:20<01:29, 1.04s/it]
79%|███████████████████████████████████████████████████████████████ | 315/400 [12:21<01:23, 1.02it/s]
79%|███████████████████████████████████████████████████████████████▏ | 316/400 [12:21<01:20, 1.04it/s]
79%|███████████████████████████████████████████████████████████████▍ | 317/400 [12:24<01:51, 1.34s/it]
80%|███████████████████████████████████████████████████████████████▌ | 318/400 [12:29<03:34, 2.61s/it]
80%|███████████████████████████████████████████████████████████████▊ | 319/400 [12:35<04:40, 3.47s/it]
80%|████████████████████████████████████████████████████████████████ | 320/400 [12:39<05:05, 3.82s/it]
80%|████████████████████████████████████████████████████████████████▏ | 321/400 [12:43<04:45, 3.62s/it]
80%|████████████████████████████████████████████████████████████████▍ | 322/400 [12:43<03:35, 2.76s/it]
81%|████████████████████████████████████████████████████████████████▌ | 323/400 [12:43<02:31, 1.97s/it]
81%|████████████████████████████████████████████████████████████████▊ | 324/400 [12:44<01:51, 1.47s/it]
81%|█████████████████████████████████████████████████████████████████ | 325/400 [12:44<01:22, 1.10s/it]
82%|█████████████████████████████████████████████████████████████████▏ | 326/400 [12:44<01:07, 1.09it/s]
82%|█████████████████████████████████████████████████████████████████▍ | 327/400 [12:45<00:50, 1.46it/s]
82%|█████████████████████████████████████████████████████████████████▌ | 328/400 [12:45<00:50, 1.42it/s]
82%|█████████████████████████████████████████████████████████████████▊ | 329/400 [12:48<01:26, 1.22s/it]
82%|██████████████████████████████████████████████████████████████████ | 330/400 [12:53<02:56, 2.52s/it]
83%|██████████████████████████████████████████████████████████████████▏ | 331/400 [13:02<05:07, 4.45s/it]
83%|██████████████████████████████████████████████████████████████████▍ | 332/400 [13:06<04:55, 4.34s/it]
83%|██████████████████████████████████████████████████████████████████▌ | 333/400 [13:14<06:02, 5.41s/it]
84%|██████████████████████████████████████████████████████████████████▊ | 334/400 [13:15<04:16, 3.89s/it]
84%|███████████████████████████████████████████████████████████████████ | 335/400 [13:15<03:02, 2.81s/it]
84%|███████████████████████████████████████████████████████████████████▏ | 336/400 [13:16<02:35, 2.44s/it]
84%|███████████████████████████████████████████████████████████████████▍ | 337/400 [13:17<01:49, 1.74s/it]
84%|███████████████████████████████████████████████████████████████████▌ | 338/400 [13:18<01:48, 1.75s/it]
85%|████████████████████████████████████████████████████████████████████ | 340/400 [13:19<01:04, 1.07s/it]
85%|████████████████████████████████████████████████████████████████████▏ | 341/400 [13:19<00:55, 1.06it/s]
86%|████████████████████████████████████████████████████████████████████▍ | 342/400 [13:20<00:53, 1.08it/s]
86%|████████████████████████████████████████████████████████████████████▌ | 343/400 [13:23<01:15, 1.33s/it]
86%|████████████████████████████████████████████████████████████████████▊ | 344/400 [13:27<01:56, 2.08s/it]
86%|█████████████████████████████████████████████████████████████████████ | 345/400 [13:38<04:21, 4.76s/it]
86%|█████████████████████████████████████████████████████████████████████▏ | 346/400 [13:38<03:06, 3.45s/it]
87%|█████████████████████████████████████████████████████████████████████▍ | 347/400 [13:40<02:34, 2.92s/it]
87%|█████████████████████████████████████████████████████████████████████▌ | 348/400 [13:40<01:53, 2.18s/it]
88%|██████████████████████████████████████████████████████████████████████ | 350/400 [13:42<01:21, 1.62s/it]
88%|██████████████████████████████████████████████████████████████████████▏ | 351/400 [13:43<01:03, 1.30s/it]
88%|██████████████████████████████████████████████████████████████████████▍ | 352/400 [13:43<00:54, 1.14s/it]
88%|██████████████████████████████████████████████████████████████████████▌ | 353/400 [13:44<00:44, 1.05it/s]
88%|██████████████████████████████████████████████████████████████████████▊ | 354/400 [13:45<00:43, 1.05it/s]
89%|███████████████████████████████████████████████████████████████████████ | 355/400 [13:47<00:57, 1.27s/it]
89%|███████████████████████████████████████████████████████████████████████▏ | 356/400 [13:54<02:06, 2.87s/it]
89%|███████████████████████████████████████████████████████████████████████▍ | 357/400 [14:07<04:08, 5.79s/it]
90%|███████████████████████████████████████████████████████████████████████▌ | 358/400 [14:07<02:52, 4.12s/it]
90%|███████████████████████████████████████████████████████████████████████▊ | 359/400 [14:09<02:29, 3.64s/it]
90%|████████████████████████████████████████████████████████████████████████ | 360/400 [14:11<02:00, 3.01s/it]
90%|████████████████████████████████████████████████████████████████████████▏ | 361/400 [14:14<02:05, 3.22s/it]
90%|████████████████████████████████████████████████████████████████████████▍ | 362/400 [14:17<01:55, 3.03s/it]
91%|████████████████████████████████████████████████████████████████████████▌ | 363/400 [14:18<01:27, 2.36s/it]
91%|████████████████████████████████████████████████████████████████████████▊ | 364/400 [14:19<01:08, 1.91s/it]
91%|█████████████████████████████████████████████████████████████████████████ | 365/400 [14:19<00:54, 1.56s/it]
92%|█████████████████████████████████████████████████████████████████████████▍ | 367/400 [14:20<00:33, 1.03s/it]
92%|█████████████████████████████████████████████████████████████████████████▌ | 368/400 [14:20<00:25, 1.25it/s]
92%|█████████████████████████████████████████████████████████████████████████▊ | 369/400 [14:27<01:14, 2.41s/it]
92%|██████████████████████████████████████████████████████████████████████████ | 370/400 [14:28<00:55, 1.84s/it]
93%|██████████████████████████████████████████████████████████████████████████▏ | 371/400 [14:32<01:16, 2.65s/it]
93%|██████████████████████████████████████████████████████████████████████████▍ | 372/400 [14:35<01:14, 2.65s/it]
93%|██████████████████████████████████████████████████████████████████████████▌ | 373/400 [14:40<01:31, 3.38s/it]
94%|██████████████████████████████████████████████████████████████████████████▊ | 374/400 [14:43<01:22, 3.17s/it]
94%|███████████████████████████████████████████████████████████████████████████ | 375/400 [14:43<01:00, 2.43s/it]
94%|███████████████████████████████████████████████████████████████████████████▏ | 376/400 [14:44<00:42, 1.76s/it]
94%|███████████████████████████████████████████████████████████████████████████▍ | 377/400 [14:44<00:31, 1.37s/it]
94%|███████████████████████████████████████████████████████████████████████████▌ | 378/400 [14:44<00:21, 1.01it/s]
95%|███████████████████████████████████████████████████████████████████████████▊ | 379/400 [14:45<00:17, 1.22it/s]
95%|████████████████████████████████████████████████████████████████████████████ | 380/400 [14:46<00:21, 1.09s/it]
95%|████████████████████████████████████████████████████████████████████████████▏ | 381/400 [14:54<00:57, 3.04s/it]
96%|████████████████████████████████████████████████████████████████████████████▍ | 382/400 [14:54<00:41, 2.30s/it]
96%|████████████████████████████████████████████████████████████████████████████▌ | 383/400 [14:58<00:44, 2.63s/it]
96%|████████████████████████████████████████████████████████████████████████████▊ | 384/400 [15:00<00:41, 2.60s/it]
96%|█████████████████████████████████████████████████████████████████████████████ | 385/400 [15:06<00:50, 3.40s/it]
96%|█████████████████████████████████████████████████████████████████████████████▏ | 386/400 [15:09<00:46, 3.29s/it]
97%|█████████████████████████████████████████████████████████████████████████████▍ | 387/400 [15:10<00:36, 2.80s/it]
97%|█████████████████████████████████████████████████████████████████████████████▌ | 388/400 [15:11<00:26, 2.22s/it]
97%|█████████████████████████████████████████████████████████████████████████████▊ | 389/400 [15:13<00:21, 1.94s/it]
98%|██████████████████████████████████████████████████████████████████████████████ | 390/400 [15:13<00:14, 1.42s/it]
98%|██████████████████████████████████████████████████████████████████████████████▍ | 392/400 [15:13<00:06, 1.21it/s]
98%|██████████████████████████████████████████████████████████████████████████████▌ | 393/400 [15:16<00:09, 1.41s/it]
98%|██████████████████████████████████████████████████████████████████████████████▊ | 394/400 [15:17<00:06, 1.16s/it]
99%|███████████████████████████████████████████████████████████████████████████████ | 395/400 [15:18<00:06, 1.27s/it]
99%|███████████████████████████████████████████████████████████████████████████████▏| 396/400 [15:21<00:06, 1.66s/it]
99%|███████████████████████████████████████████████████████████████████████████████▍| 397/400 [15:23<00:05, 1.94s/it]
100%|███████████████████████████████████████████████████████████████████████████████▌| 398/400 [15:25<00:03, 1.88s/it]
100%|███████████████████████████████████████████████████████████████████████████████▊| 399/400 [15:26<00:01, 1.53s/it]
100%|████████████████████████████████████████████████████████████████████████████████| 400/400 [15:51<00:00, 2.38s/it]
Tiempo búsqueda (s): 951
Best robust CV: 0.3053026861636998
Best params: {'kbest__k': 512, 'svc__C': np.float64(1328.923467281017), 'svc__class_weight': {0: 2.5, 1: 5.0, 2: 1.0}, 'svc__gamma': np.float64(0.00791507439765622)}
TOP-10 CV robust (únicos):
mean_test_score std_test_score params
0.305303 0.069117 {'kbest__k': 512, 'svc__C': 1328.923467281017, 'svc__class_weight': {0: 2.5, 1: 5.0, 2: 1.0}, 'svc__gamma': 0.00791507439765622}
0.287945 0.084995 {'kbest__k': 512, 'svc__C': 1221.212458656701, 'svc__class_weight': {0: 2.0, 1: 4.0, 2: 1.0}, 'svc__gamma': 0.01543656015027835}
0.194202 0.113900 {'kbest__k': 768, 'svc__C': 617.774408226366, 'svc__class_weight': {0: 1.5, 1: 3.5, 2: 0.8}, 'svc__gamma': 0.0024424282201158257}
0.188927 0.156790 {'kbest__k': 384, 'svc__C': 159.0841875063149, 'svc__class_weight': {0: 1.5, 1: 3.5, 2: 0.8}, 'svc__gamma': 0.0445131431564921}
0.120687 0.206468 {'kbest__k': 512, 'svc__C': 61.75015483640841, 'svc__class_weight': {0: 1.0, 1: 3.0, 2: 0.7}, 'svc__gamma': 0.05019578058935042}
0.118068 0.048082 {'kbest__k': 1023, 'svc__C': 784.8081929215668, 'svc__class_weight': 'balanced', 'svc__gamma': 8.215507070842181e-05}
0.116988 0.140381 {'kbest__k': 384, 'svc__C': 607.4373269037123, 'svc__class_weight': {0: 1.0, 1: 3.0, 2: 0.7}, 'svc__gamma': 0.007931909113857064}
0.104806 0.157056 {'kbest__k': 1023, 'svc__C': 0.6576892252744615, 'svc__class_weight': 'balanced', 'svc__gamma': 0.0014851035064938566}
0.103125 0.149126 {'kbest__k': 1023, 'svc__C': 1.2456144526856272, 'svc__class_weight': 'balanced', 'svc__gamma': 0.001731612063445476}
0.077383 0.072905 {'kbest__k': 1023, 'svc__C': 571.2267368106508, 'svc__class_weight': {0: 3.0, 1: 6.0, 2: 1.0}, 'svc__gamma': 0.0006403036652671174}
===============================================================================================
Evaluando SVM1...
AUC_CV=0.5137±0.0449 | AUC_train=0.7583 | AUC_test=0.8458
Gap_CV=0.2446 | Gap_rep=-0.0875
Acc=0.8117 | F1w=0.8161 | macroF1=0.7913 | balacc=0.8122
Report TRAIN
precision recall f1-score support
AGN 0.63 0.68 0.65 422
Blazar 0.29 0.99 0.45 189
QSO 1.00 0.46 0.63 899
accuracy 0.59 1510
macro avg 0.64 0.71 0.58 1510
weighted avg 0.81 0.59 0.61 1510
CM TEST
AGN Blazar QSO
AGN 84 1 16
Blazar 2 24 4
QSO 42 6 198
Report TEST
precision recall f1-score support
AGN 0.66 0.83 0.73 101
Blazar 0.77 0.80 0.79 30
QSO 0.91 0.80 0.85 246
accuracy 0.81 377
macro avg 0.78 0.81 0.79 377
weighted avg 0.83 0.81 0.82 377
Figura guardada: C:\Users\Gamer\Downloads\SVM1.png
===============================================================================================
Evaluando SVM2...
AUC_CV=0.5087±0.0479 | AUC_train=0.7764 | AUC_test=0.8716
Gap_CV=0.2677 | Gap_rep=-0.0952
Acc=0.8488 | F1w=0.8506 | macroF1=0.8284 | balacc=0.8292
Report TRAIN
precision recall f1-score support
AGN 0.67 0.70 0.69 422
Blazar 0.31 0.99 0.47 189
QSO 1.00 0.51 0.67 899
accuracy 0.62 1510
macro avg 0.66 0.73 0.61 1510
weighted avg 0.82 0.62 0.65 1510
CM TEST
AGN Blazar QSO
AGN 83 0 18
Blazar 2 24 4
QSO 29 4 213
Report TEST
precision recall f1-score support
AGN 0.73 0.82 0.77 101
Blazar 0.86 0.80 0.83 30
QSO 0.91 0.87 0.89 246
accuracy 0.85 377
macro avg 0.83 0.83 0.83 377
weighted avg 0.85 0.85 0.85 377
Figura guardada: C:\Users\Gamer\Downloads\SVM2.png
===============================================================================================
Evaluando SVM3...
AUC_CV=0.5155±0.0455 | AUC_train=0.7289 | AUC_test=0.7965
Gap_CV=0.2134 | Gap_rep=-0.0677
Acc=0.7109 | F1w=0.7206 | macroF1=0.6942 | balacc=0.7568
Report TRAIN
precision recall f1-score support
AGN 0.56 0.60 0.58 422
Blazar 0.26 0.99 0.41 189
QSO 0.98 0.35 0.52 899
accuracy 0.50 1510
macro avg 0.60 0.65 0.50 1510
weighted avg 0.77 0.50 0.52 1510
CM TEST
AGN Blazar QSO
AGN 82 3 16
Blazar 3 24 3
QSO 71 13 162
Report TEST
precision recall f1-score support
AGN 0.53 0.81 0.64 101
Blazar 0.60 0.80 0.69 30
QSO 0.90 0.66 0.76 246
accuracy 0.71 377
macro avg 0.67 0.76 0.69 377
weighted avg 0.77 0.71 0.72 377
Figura guardada: C:\Users\Gamer\Downloads\SVM3.png
===============================================================================================
Evaluando SVM4...
Buscando hiperparámetros: 0%| | 0/400 fits [19:00<?, ?fit/s]
AUC_CV=0.5120±0.0521 | AUC_train=0.7879 | AUC_test=0.8786
Gap_CV=0.2758 | Gap_rep=-0.0908
Acc=0.7984 | F1w=0.8025 | macroF1=0.7666 | balacc=0.8015
Report TRAIN
precision recall f1-score support
AGN 0.68 0.63 0.65 422
Blazar 0.26 0.99 0.42 189
QSO 1.00 0.45 0.63 899
accuracy 0.57 1510
macro avg 0.65 0.69 0.57 1510
weighted avg 0.82 0.57 0.61 1510
CM TEST
AGN Blazar QSO
AGN 82 1 18
Blazar 1 24 5
QSO 40 11 195
Report TEST
precision recall f1-score support
AGN 0.67 0.81 0.73 101
Blazar 0.67 0.80 0.73 30
QSO 0.89 0.79 0.84 246
accuracy 0.80 377
macro avg 0.74 0.80 0.77 377
weighted avg 0.82 0.80 0.80 377
Figura guardada: C:\Users\Gamer\Downloads\SVM4.png
===============================================================================================
Evaluando SVM5...
AUC_CV=0.5204±0.0566 | AUC_train=0.7942 | AUC_test=0.9101
Gap_CV=0.2738 | Gap_rep=-0.1159
Acc=0.8462 | F1w=0.8506 | macroF1=0.8059 | balacc=0.8688
Report TRAIN
precision recall f1-score support
AGN 0.75 0.59 0.66 422
Blazar 0.25 1.00 0.41 189
QSO 1.00 0.48 0.65 899
accuracy 0.58 1510
macro avg 0.67 0.69 0.57 1510
weighted avg 0.84 0.58 0.62 1510
CM TEST
AGN Blazar QSO
AGN 84 5 12
Blazar 1 28 1
QSO 26 13 207
Report TEST
precision recall f1-score support
AGN 0.76 0.83 0.79 101
Blazar 0.61 0.93 0.74 30
QSO 0.94 0.84 0.89 246
accuracy 0.85 377
macro avg 0.77 0.87 0.81 377
weighted avg 0.87 0.85 0.85 377
Figura guardada: C:\Users\Gamer\Downloads\SVM5.png
===============================================================================================
RESUMEN FINAL:
tag AUC_CV SD_CV Gap_CV AUC_rep SD_rep Gap_rep Acc_test F1w_test macroF1 balacc
SVM1 0.5137 0.0449 0.2446 0.8458 0.0449 -0.0875 0.8117 0.8161 0.7913 0.8122
SVM2 0.5087 0.0479 0.2677 0.8716 0.0479 -0.0952 0.8488 0.8506 0.8284 0.8292
SVM3 0.5155 0.0455 0.2134 0.7965 0.0455 -0.0677 0.7109 0.7206 0.6942 0.7568
SVM4 0.5120 0.0521 0.2758 0.8786 0.0521 -0.0908 0.7984 0.8025 0.7666 0.8015
SVM5 0.5204 0.0566 0.2738 0.9101 0.0566 -0.1159 0.8462 0.8506 0.8059 0.8688
>>> Mejor modelo: SVM5 AUC_test=0.9101
Tabla LaTeX guardada en: C:\Users\Gamer\Downloads\tabla_svm_top5.tex
--- PREVIEW ---
\begin{table}[!ht]
\centering
\small
\renewcommand{\arraystretch}{1.18}
\setlength{\tabcolsep}{6pt}
\begin{adjustbox}{width=\textwidth}
\rowcolors{2}{white}{gray!8}
\begin{tabular}{ccccccccc}
\toprule
\rowcolor{BlueHeader}
\color{white}\textbf{Modelo} &
\color{white}\textbf{AUC\textsubscript{CV}} &
\color{white}\textbf{SD\textsubscript{CV}} &
\color{white}\textbf{Gap\textsubscript{CV}} &
\color{white}\textbf{AUC\textsubscript{rep}} &
\color{white}\textbf{SD\textsubscript{rep}} &
\color{white}\textbf{Gap\textsubscript{rep}} &
\color{white}\textbf{Acc\textsubscript{test}} &
\color{white}\textbf{F1\textsubscript{w,test}} \\
\midrule
SVM$_{1}$ & 0.5137 & 0.0449 & 0.2446 & 0.8458 & 0.0449 & -0.0875 & 0.8117 & 0.8161 \\
SVM$_{2}$ & 0.5087 & 0.0479 & 0.2677 & 0.8716 & 0.0479 & -0.0952 & 0.8488 & 0.8506 \\
SVM$_{3}$ & 0.5155 & 0.0455 & 0.2134 & 0.7965 & 0.0455 & -0.0677 & 0.7109 & 0.7206 \\
SVM$_{4}$ & 0.5120 & 0.0521 & 0.2758 & 0.8786 & 0.0521 & -0.0908 & 0.7984 & 0.8025 \\
\rowcolor{BlueBest} SVM$_{5}$ & 0.5204 & 0.0566 & 0.2738 & 0.9101 & 0.0566 & -0.1159 & 0.8462 & 0.8506 \\
\bottomrule
\end{tabular}
\end{adjustbox}
\caption{Desempeño de los cinco mejores modelos SVM (path signature, ESIG).}
\label{tab:svm_top5_auc}
\end{table}
Tiempo total: 00:19:22