AMULETY: using embeddings for Machine Learning

This tutorial demonstrates how to use AMULETY for downstream machine learning tasks with B-cell receptor (BCR) data. AMULETY is a python package for generating embeddings from BCR and TCR sequences using various state-of-the-art models.

Overview

In this tutorial, you will learn to:

  1. Install and set up AMULETY

  2. Load and prepare BCR data in AIRR format

  3. Generate embeddings using different models

  4. Perform downstream machine learning tasks

  5. Evaluate model performance

Installation

First, install AMULETY using pip:

[ ]:
# Install Amulety
!pip install amulety

# Install additional dependencies for this tutorial
!pip install pandas numpy scikit-learn torch matplotlib seaborn
Requirement already satisfied: amulety in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (0.1.1)
Requirement already satisfied: numpy in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (1.26.0)
Requirement already satisfied: pandas in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (2.2.3)
Requirement already satisfied: torch in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (2.6.0)
Requirement already satisfied: transformers in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (4.50.3)
Requirement already satisfied: typer in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (0.15.4)
Requirement already satisfied: antiberty in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (0.1.3)
Requirement already satisfied: ablang in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (0.3.1)
Requirement already satisfied: rjieba in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (0.1.13)
Requirement already satisfied: pre-commit in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (4.2.0)
Requirement already satisfied: protobuf in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (4.25.6)
Requirement already satisfied: sentencepiece in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (0.2.0)
Requirement already satisfied: pytest-workflow>=1.6.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (2.1.0)
Requirement already satisfied: pytest>=7.0.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (8.3.5)
Requirement already satisfied: gensim>=3.8.3 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from amulety) (4.3.3)
Requirement already satisfied: scipy<1.14.0,>=1.7.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from gensim>=3.8.3->amulety) (1.13.1)
Requirement already satisfied: smart-open>=1.8.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from gensim>=3.8.3->amulety) (7.1.0)
Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest>=7.0.0->amulety) (1.2.0)
Requirement already satisfied: iniconfig in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest>=7.0.0->amulety) (2.1.0)
Requirement already satisfied: packaging in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest>=7.0.0->amulety) (24.2)
Requirement already satisfied: pluggy<2,>=1.5 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest>=7.0.0->amulety) (1.6.0)
Requirement already satisfied: tomli>=1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest>=7.0.0->amulety) (2.2.1)
Requirement already satisfied: pyyaml in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest-workflow>=1.6.0->amulety) (6.0.2)
Requirement already satisfied: jsonschema in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest-workflow>=1.6.0->amulety) (4.23.0)
Requirement already satisfied: xopen>=1.4.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest-workflow>=1.6.0->amulety) (2.0.2)
Requirement already satisfied: zstandard in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pytest-workflow>=1.6.0->amulety) (0.23.0)
Requirement already satisfied: wrapt in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from smart-open>=1.8.1->gensim>=3.8.3->amulety) (1.14.1)
Requirement already satisfied: requests in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from ablang->amulety) (2.32.4)
Requirement already satisfied: numba in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from ablang->amulety) (0.61.0)
Requirement already satisfied: filelock in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch->amulety) (3.17.0)
Requirement already satisfied: typing-extensions>=4.10.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch->amulety) (4.12.2)
Requirement already satisfied: networkx in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch->amulety) (3.4.2)
Requirement already satisfied: jinja2 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch->amulety) (3.1.5)
Requirement already satisfied: fsspec in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch->amulety) (2025.2.0)
Requirement already satisfied: sympy==1.13.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch->amulety) (1.13.1)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from sympy==1.13.1->torch->amulety) (1.3.0)
Requirement already satisfied: huggingface-hub<1.0,>=0.26.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from transformers->amulety) (0.30.1)
Requirement already satisfied: regex!=2019.12.17 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from transformers->amulety) (2024.11.6)
Requirement already satisfied: tokenizers<0.22,>=0.21 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from transformers->amulety) (0.21.1)
Requirement already satisfied: safetensors>=0.4.3 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from transformers->amulety) (0.5.3)
Requirement already satisfied: tqdm>=4.27 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from transformers->amulety) (4.67.1)
Requirement already satisfied: MarkupSafe>=2.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from jinja2->torch->amulety) (3.0.2)
Requirement already satisfied: attrs>=22.2.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from jsonschema->pytest-workflow>=1.6.0->amulety) (24.3.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from jsonschema->pytest-workflow>=1.6.0->amulety) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from jsonschema->pytest-workflow>=1.6.0->amulety) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from jsonschema->pytest-workflow>=1.6.0->amulety) (0.23.1)
Requirement already satisfied: llvmlite<0.45,>=0.44.0dev0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from numba->ablang->amulety) (0.44.0)
Requirement already satisfied: python-dateutil>=2.8.2 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pandas->amulety) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pandas->amulety) (2025.1)
Requirement already satisfied: tzdata>=2022.7 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pandas->amulety) (2025.1)
Requirement already satisfied: six>=1.5 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas->amulety) (1.17.0)
Requirement already satisfied: cfgv>=2.0.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pre-commit->amulety) (3.4.0)
Requirement already satisfied: identify>=1.0.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pre-commit->amulety) (2.6.12)
Requirement already satisfied: nodeenv>=0.11.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pre-commit->amulety) (1.9.1)
Requirement already satisfied: virtualenv>=20.10.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pre-commit->amulety) (20.31.2)
Requirement already satisfied: distlib<1,>=0.3.7 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from virtualenv>=20.10.0->pre-commit->amulety) (0.3.9)
Requirement already satisfied: platformdirs<5,>=3.9.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from virtualenv>=20.10.0->pre-commit->amulety) (4.3.7)
Requirement already satisfied: charset_normalizer<4,>=2 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from requests->ablang->amulety) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from requests->ablang->amulety) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from requests->ablang->amulety) (1.26.20)
Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from requests->ablang->amulety) (2025.6.15)
Requirement already satisfied: click<8.2,>=8.0.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from typer->amulety) (8.1.8)
Requirement already satisfied: shellingham>=1.3.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from typer->amulety) (1.5.4)
Requirement already satisfied: rich>=10.11.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from typer->amulety) (13.9.4)
Requirement already satisfied: markdown-it-py>=2.2.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from rich>=10.11.0->typer->amulety) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from rich>=10.11.0->typer->amulety) (2.19.1)
Requirement already satisfied: mdurl~=0.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer->amulety) (0.1.2)
Requirement already satisfied: pandas in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (2.2.3)
Requirement already satisfied: numpy in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (1.26.0)
Requirement already satisfied: scikit-learn in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (1.6.1)
Requirement already satisfied: torch in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (2.6.0)
Requirement already satisfied: matplotlib in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (3.10.0)
Requirement already satisfied: seaborn in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (0.13.2)
Requirement already satisfied: python-dateutil>=2.8.2 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pandas) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pandas) (2025.1)
Requirement already satisfied: tzdata>=2022.7 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from pandas) (2025.1)
Requirement already satisfied: scipy>=1.6.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from scikit-learn) (1.13.1)
Requirement already satisfied: joblib>=1.2.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from scikit-learn) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from scikit-learn) (3.5.0)
Requirement already satisfied: filelock in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch) (3.17.0)
Requirement already satisfied: typing-extensions>=4.10.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch) (4.12.2)
Requirement already satisfied: networkx in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch) (3.4.2)
Requirement already satisfied: jinja2 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch) (3.1.5)
Requirement already satisfied: fsspec in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch) (2025.2.0)
Requirement already satisfied: sympy==1.13.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from torch) (1.13.1)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from sympy==1.13.1->torch) (1.3.0)
Requirement already satisfied: contourpy>=1.0.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from matplotlib) (1.3.1)
Requirement already satisfied: cycler>=0.10 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from matplotlib) (0.11.0)
Requirement already satisfied: fonttools>=4.22.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from matplotlib) (4.55.3)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from matplotlib) (1.4.8)
Requirement already satisfied: packaging>=20.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from matplotlib) (24.2)
Requirement already satisfied: pillow>=8 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from matplotlib) (11.1.0)
Requirement already satisfied: pyparsing>=2.3.1 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from matplotlib) (3.2.0)
Requirement already satisfied: six>=1.5 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)
Requirement already satisfied: MarkupSafe>=2.0 in /opt/anaconda3/envs/torchen/lib/python3.10/site-packages (from jinja2->torch) (3.0.2)

Import Required Libraries

[59]:
import pandas as pd
import numpy as np
import torch
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import StratifiedGroupKFold, GridSearchCV
from sklearn.svm import SVC
from sklearn.metrics import matthews_corrcoef, f1_score, accuracy_score
from sklearn.preprocessing import LabelEncoder
from collections import Counter
import warnings
warnings.filterwarnings('ignore')

# Import Amulety
from amulety import embed_airr

print("All libraries imported successfully!")
All libraries imported successfully!

Load BCR Data

We’ll load the BCR data in AIRR (Adaptive Immune Receptor Repertoire) format. This dataset contains antibody sequences with associated metadata including gene usage, isotype, and other annotations.

[ ]:
# Download the tutorial dataset
! mkdir -p tutorial
! wget -P tutorial https://zenodo.org/records/17186858/files/ML_bcr_airr_dataset.tsv
--2025-09-24 13:32:27--  https://zenodo.org/records/17186858/files/ML_bcr_airr_dataset.tsv
Resolving zenodo.org (zenodo.org)... 188.185.43.25, 188.185.45.92, 188.185.48.194, ...
Connecting to zenodo.org (zenodo.org)|188.185.43.25|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 345071483 (329M) [application/octet-stream]
Saving to: 'tutorial/ML_bcr_airr_dataset.tsv'

ML_bcr_airr_dataset 100%[===================>] 329.08M  6.45MB/s    in 54s

2025-09-24 13:33:21 (6.14 MB/s) - 'tutorial/ML_bcr_airr_dataset.tsv' saved [345071483/345071483]

[60]:
# Load the BCR AIRR dataset
bcr_data = pd.read_csv("tutorial/ML_bcr_airr_dataset.tsv", sep='\t')

print(f"Dataset shape: {bcr_data.shape}")
print(f"\nColumns: {list(bcr_data.columns)}")
print(f"\nFirst few rows:")
bcr_data.head()
Dataset shape: (1399366, 19)

Columns: ['sequence_id', 'sequence_vdj_aa', 'locus', 'cell_id', 'chain_type', 'v_call', 'v_call_family', 'j_call_family', 'mu_freq', 'junction_aa_length', 'isotype', 'source', 'subject', 'specificity', 'duplicate_count', 'productive', 'rev_comp', 'stop_codon', 'vj_in_frame']

First few rows:
[60]:
sequence_id sequence_vdj_aa locus cell_id chain_type v_call v_call_family j_call_family mu_freq junction_aa_length isotype source subject specificity duplicate_count productive rev_comp stop_codon vj_in_frame
0 1_heavy QVQLVESGGGLVKPGGSLRLSCAASGFTFSDYYMSWIRQAPGKGLE... IGH cell_1 H IGHV3-11 IGHV3 IGHJ4 0.016447 12.0 NaN OAS OAS_King_Subject-BCP3 unlabeled 1 True False False True
1 2_heavy QVQLVESGGGVVQPGRSLRLSCAASGFTFSSYAMHWVRQAPGKGLE... IGH cell_2 H IGHV3-30 IGHV3 IGHJ4 0.026578 17.0 NaN OAS OAS_King_Subject-BCP3 unlabeled 1 True False False True
2 3_heavy EVQLVESGGGLVKPGGSLTLSCAVSGFTFKNAWMSWVRQAPGKGLE... IGH cell_3 H IGHV3-15 IGHV3 IGHJ4 0.069536 14.0 NaN OAS OAS_King_Subject-BCP3 unlabeled 1 True False False True
3 4_heavy EVQLVESGGALVKPGGSLRLSCVVSGLTFTDAYMIWVRQAPGKGLE... IGH cell_4 H IGHV3-15 IGHV3 IGHJ6 0.075410 14.0 NaN OAS OAS_King_Subject-BCP3 unlabeled 1 True False False True
4 5_heavy QEELVEAGGTVVQPGRSLGLSCAASGFSFSNYLMHWVRQTPGKGLE... IGH cell_5 H IGHV3-30-3 IGHV3 IGHJ5 0.076923 22.0 NaN OAS OAS_King_Subject-BCP3 unlabeled 1 True False False True

Data Exploration

Let’s explore the dataset to understand its structure and characteristics.

[61]:
# Basic statistics
print("Dataset Statistics:")
print(f"Total sequences: {len(bcr_data)}")
print(f"Unique subjects: {bcr_data['subject'].nunique()}")
print(f"Chain types: {bcr_data['chain_type'].value_counts().to_dict()}")
print(f"Locus distribution: {bcr_data['locus'].value_counts().to_dict()}")

# Check sequence length distribution
bcr_data['sequence_length'] = bcr_data['sequence_vdj_aa'].str.len()
print(f"\nSequence length statistics:")
print(bcr_data['sequence_length'].describe())
Dataset Statistics:
Total sequences: 1399366
Unique subjects: 74
Chain types: {'H': 858682, 'L': 540684}
Locus distribution: {'IGH': 858682, 'IGK': 314772, 'IGL': 225912}

Sequence length statistics:
count    1.399366e+06
mean     1.171950e+02
std      8.253170e+00
min      2.100000e+01
25%      1.100000e+02
50%      1.190000e+02
75%      1.230000e+02
max      1.860000e+02
Name: sequence_length, dtype: float64
[62]:
# Visualize sequence length distribution
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.hist(bcr_data['sequence_length'], bins=50, alpha=0.7, edgecolor='black')
plt.xlabel('Sequence Length')
plt.ylabel('Frequency')
plt.title('Distribution of Sequence Lengths')

plt.subplot(1, 2, 2)
chain_counts = bcr_data['chain_type'].value_counts()
plt.pie(chain_counts.values, labels=chain_counts.index, autopct='%1.1f%%')
plt.title('Chain Type Distribution')

plt.tight_layout()
plt.show()
../_images/tutorials_ML_tutorial_9_0.png

Generate Embeddings with Amulety

Now we’ll use Amulety to generate embeddings from our BCR sequences. Amulety supports multiple embedding models including BCR-specific models and protein language models.

[63]:
# Prepare data for embedding
# Filter for heavy chains only for this example
heavy_chains = bcr_data[bcr_data['chain_type'] == 'H'].copy()
print(f"Using {len(heavy_chains)} heavy chain sequences for embedding")

# Take a subset for demonstration
# please adjust size based on computational resources)
sample_size = min(10000, len(heavy_chains))
heavy_sample = heavy_chains.sample(n=sample_size, random_state=42).reset_index(drop=True)
print(f"Working with {len(heavy_sample)} sequences for demonstration")
Using 858682 heavy chain sequences for embedding
Working with 10000 sequences for demonstration
[64]:
# Generate embeddings using antiBERTy model
print("Generating embeddings using antiBERTy model...")

# First, ensure the data has the required duplicate_count column
if 'duplicate_count' not in heavy_sample.columns:
    heavy_sample = heavy_sample.copy()
    heavy_sample['duplicate_count'] = 1
    print("Added duplicate_count column for amulety compatibility")

embeddings, data = embed_airr(
    airr=heavy_sample,
    chain="H",  # Heavy chain only
    model="antiberty",  # antiBERTy - Antibody BERT model
    sequence_col="sequence_vdj_aa",
    cell_id_col="cell_id",
    batch_size=8,  # Adjust based on available memory
    output_type="pickle"
)

print(f"Embeddings generated successfully!")
print(f"Embedding shape: {embeddings.shape}")
print(f"Embedding dimensions: {embeddings.shape[1]}")

# Convert to numpy for downstream analysis
X_embeddings = embeddings.numpy() if hasattr(embeddings, 'numpy') else embeddings
2025-09-24 13:37:22,906 - INFO - Detected single-cell data format
2025-09-24 13:37:22,912 - INFO - Single-cell AIRR data detected (all entries have cell_id).
2025-09-24 13:37:23,035 - INFO - AntiBERTy loaded. Size: 26.03 M
2025-09-24 13:37:23,035 - INFO - Batch 1/1250
Generating embeddings using antiBERTy model...
2025-09-24 13:37:23,122 - INFO - Batch 2/1250
2025-09-24 13:37:23,188 - INFO - Batch 3/1250
2025-09-24 13:37:23,244 - INFO - Batch 4/1250
2025-09-24 13:37:23,306 - INFO - Batch 5/1250
2025-09-24 13:37:23,366 - INFO - Batch 6/1250
2025-09-24 13:37:23,425 - INFO - Batch 7/1250
2025-09-24 13:37:23,491 - INFO - Batch 8/1250
2025-09-24 13:37:23,579 - INFO - Batch 9/1250
2025-09-24 13:37:23,642 - INFO - Batch 10/1250
2025-09-24 13:37:23,716 - INFO - Batch 11/1250
2025-09-24 13:37:23,774 - INFO - Batch 12/1250
2025-09-24 13:37:23,835 - INFO - Batch 13/1250
2025-09-24 13:37:23,893 - INFO - Batch 14/1250
2025-09-24 13:37:23,958 - INFO - Batch 15/1250
2025-09-24 13:37:24,024 - INFO - Batch 16/1250
2025-09-24 13:37:24,088 - INFO - Batch 17/1250
2025-09-24 13:37:24,154 - INFO - Batch 18/1250
2025-09-24 13:37:24,213 - INFO - Batch 19/1250
2025-09-24 13:37:24,292 - INFO - Batch 20/1250
2025-09-24 13:37:24,358 - INFO - Batch 21/1250
2025-09-24 13:37:24,424 - INFO - Batch 22/1250
2025-09-24 13:37:24,488 - INFO - Batch 23/1250
2025-09-24 13:37:24,553 - INFO - Batch 24/1250
2025-09-24 13:37:24,612 - INFO - Batch 25/1250
2025-09-24 13:37:24,677 - INFO - Batch 26/1250
2025-09-24 13:37:24,747 - INFO - Batch 27/1250
2025-09-24 13:37:24,808 - INFO - Batch 28/1250
2025-09-24 13:37:24,870 - INFO - Batch 29/1250
2025-09-24 13:37:24,937 - INFO - Batch 30/1250
2025-09-24 13:37:25,005 - INFO - Batch 31/1250
2025-09-24 13:37:25,069 - INFO - Batch 32/1250
2025-09-24 13:37:25,127 - INFO - Batch 33/1250
2025-09-24 13:37:25,197 - INFO - Batch 34/1250
2025-09-24 13:37:25,264 - INFO - Batch 35/1250
2025-09-24 13:37:25,333 - INFO - Batch 36/1250
2025-09-24 13:37:25,401 - INFO - Batch 37/1250
2025-09-24 13:37:25,469 - INFO - Batch 38/1250
2025-09-24 13:37:25,536 - INFO - Batch 39/1250
2025-09-24 13:37:25,603 - INFO - Batch 40/1250
2025-09-24 13:37:25,669 - INFO - Batch 41/1250
2025-09-24 13:37:25,735 - INFO - Batch 42/1250
2025-09-24 13:37:25,794 - INFO - Batch 43/1250
2025-09-24 13:37:25,856 - INFO - Batch 44/1250
2025-09-24 13:37:25,919 - INFO - Batch 45/1250
2025-09-24 13:37:25,980 - INFO - Batch 46/1250
2025-09-24 13:37:26,058 - INFO - Batch 47/1250
2025-09-24 13:37:26,119 - INFO - Batch 48/1250
2025-09-24 13:37:26,183 - INFO - Batch 49/1250
2025-09-24 13:37:26,241 - INFO - Batch 50/1250
2025-09-24 13:37:26,302 - INFO - Batch 51/1250
2025-09-24 13:37:26,363 - INFO - Batch 52/1250
2025-09-24 13:37:26,426 - INFO - Batch 53/1250
2025-09-24 13:37:26,488 - INFO - Batch 54/1250
2025-09-24 13:37:26,557 - INFO - Batch 55/1250
2025-09-24 13:37:26,622 - INFO - Batch 56/1250
2025-09-24 13:37:26,686 - INFO - Batch 57/1250
2025-09-24 13:37:26,748 - INFO - Batch 58/1250
2025-09-24 13:37:26,812 - INFO - Batch 59/1250
2025-09-24 13:37:26,872 - INFO - Batch 60/1250
2025-09-24 13:37:26,932 - INFO - Batch 61/1250
2025-09-24 13:37:27,001 - INFO - Batch 62/1250
2025-09-24 13:37:27,064 - INFO - Batch 63/1250
2025-09-24 13:37:27,127 - INFO - Batch 64/1250
2025-09-24 13:37:27,186 - INFO - Batch 65/1250
2025-09-24 13:37:27,250 - INFO - Batch 66/1250
2025-09-24 13:37:27,316 - INFO - Batch 67/1250
2025-09-24 13:37:27,377 - INFO - Batch 68/1250
2025-09-24 13:37:27,438 - INFO - Batch 69/1250
2025-09-24 13:37:27,501 - INFO - Batch 70/1250
2025-09-24 13:37:27,567 - INFO - Batch 71/1250
2025-09-24 13:37:27,632 - INFO - Batch 72/1250
2025-09-24 13:37:27,697 - INFO - Batch 73/1250
2025-09-24 13:37:27,761 - INFO - Batch 74/1250
2025-09-24 13:37:27,826 - INFO - Batch 75/1250
2025-09-24 13:37:27,897 - INFO - Batch 76/1250
2025-09-24 13:37:27,966 - INFO - Batch 77/1250
2025-09-24 13:37:28,028 - INFO - Batch 78/1250
2025-09-24 13:37:28,092 - INFO - Batch 79/1250
2025-09-24 13:37:28,153 - INFO - Batch 80/1250
2025-09-24 13:37:28,222 - INFO - Batch 81/1250
2025-09-24 13:37:28,284 - INFO - Batch 82/1250
2025-09-24 13:37:28,345 - INFO - Batch 83/1250
2025-09-24 13:37:28,474 - INFO - Batch 84/1250
2025-09-24 13:37:28,536 - INFO - Batch 85/1250
2025-09-24 13:37:28,610 - INFO - Batch 86/1250
2025-09-24 13:37:28,675 - INFO - Batch 87/1250
2025-09-24 13:37:28,744 - INFO - Batch 88/1250
2025-09-24 13:37:28,811 - INFO - Batch 89/1250
2025-09-24 13:37:28,875 - INFO - Batch 90/1250
2025-09-24 13:37:28,944 - INFO - Batch 91/1250
2025-09-24 13:37:29,005 - INFO - Batch 92/1250
2025-09-24 13:37:29,066 - INFO - Batch 93/1250
2025-09-24 13:37:29,131 - INFO - Batch 94/1250
2025-09-24 13:37:29,197 - INFO - Batch 95/1250
2025-09-24 13:37:29,263 - INFO - Batch 96/1250
2025-09-24 13:37:29,326 - INFO - Batch 97/1250
2025-09-24 13:37:29,387 - INFO - Batch 98/1250
2025-09-24 13:37:29,453 - INFO - Batch 99/1250
2025-09-24 13:37:29,530 - INFO - Batch 100/1250
2025-09-24 13:37:29,596 - INFO - Batch 101/1250
2025-09-24 13:37:29,662 - INFO - Batch 102/1250
2025-09-24 13:37:29,727 - INFO - Batch 103/1250
2025-09-24 13:37:29,795 - INFO - Batch 104/1250
2025-09-24 13:37:29,860 - INFO - Batch 105/1250
2025-09-24 13:37:29,923 - INFO - Batch 106/1250
2025-09-24 13:37:29,987 - INFO - Batch 107/1250
2025-09-24 13:37:30,049 - INFO - Batch 108/1250
2025-09-24 13:37:30,113 - INFO - Batch 109/1250
2025-09-24 13:37:30,175 - INFO - Batch 110/1250
2025-09-24 13:37:30,237 - INFO - Batch 111/1250
2025-09-24 13:37:30,303 - INFO - Batch 112/1250
2025-09-24 13:37:30,366 - INFO - Batch 113/1250
2025-09-24 13:37:30,432 - INFO - Batch 114/1250
2025-09-24 13:37:30,500 - INFO - Batch 115/1250
2025-09-24 13:37:30,604 - INFO - Batch 116/1250
2025-09-24 13:37:30,698 - INFO - Batch 117/1250
2025-09-24 13:37:30,803 - INFO - Batch 118/1250
2025-09-24 13:37:30,864 - INFO - Batch 119/1250
2025-09-24 13:37:30,938 - INFO - Batch 120/1250
2025-09-24 13:37:31,011 - INFO - Batch 121/1250
2025-09-24 13:37:31,116 - INFO - Batch 122/1250
2025-09-24 13:37:31,179 - INFO - Batch 123/1250
2025-09-24 13:37:31,304 - INFO - Batch 124/1250
2025-09-24 13:37:31,367 - INFO - Batch 125/1250
2025-09-24 13:37:31,437 - INFO - Batch 126/1250
2025-09-24 13:37:31,496 - INFO - Batch 127/1250
2025-09-24 13:37:31,561 - INFO - Batch 128/1250
2025-09-24 13:37:31,637 - INFO - Batch 129/1250
2025-09-24 13:37:31,712 - INFO - Batch 130/1250
2025-09-24 13:37:31,786 - INFO - Batch 131/1250
2025-09-24 13:37:31,858 - INFO - Batch 132/1250
2025-09-24 13:37:31,938 - INFO - Batch 133/1250
2025-09-24 13:37:32,013 - INFO - Batch 134/1250
2025-09-24 13:37:32,088 - INFO - Batch 135/1250
2025-09-24 13:37:32,161 - INFO - Batch 136/1250
2025-09-24 13:37:32,234 - INFO - Batch 137/1250
2025-09-24 13:37:32,310 - INFO - Batch 138/1250
2025-09-24 13:37:32,394 - INFO - Batch 139/1250
2025-09-24 13:37:32,464 - INFO - Batch 140/1250
2025-09-24 13:37:32,532 - INFO - Batch 141/1250
2025-09-24 13:37:32,603 - INFO - Batch 142/1250
2025-09-24 13:37:32,670 - INFO - Batch 143/1250
2025-09-24 13:37:32,741 - INFO - Batch 144/1250
2025-09-24 13:37:32,811 - INFO - Batch 145/1250
2025-09-24 13:37:32,890 - INFO - Batch 146/1250
2025-09-24 13:37:32,971 - INFO - Batch 147/1250
2025-09-24 13:37:33,047 - INFO - Batch 148/1250
2025-09-24 13:37:33,120 - INFO - Batch 149/1250
2025-09-24 13:37:33,189 - INFO - Batch 150/1250
2025-09-24 13:37:33,259 - INFO - Batch 151/1250
2025-09-24 13:37:33,325 - INFO - Batch 152/1250
2025-09-24 13:37:33,398 - INFO - Batch 153/1250
2025-09-24 13:37:33,475 - INFO - Batch 154/1250
2025-09-24 13:37:33,546 - INFO - Batch 155/1250
2025-09-24 13:37:33,617 - INFO - Batch 156/1250
2025-09-24 13:37:33,688 - INFO - Batch 157/1250
2025-09-24 13:37:33,762 - INFO - Batch 158/1250
2025-09-24 13:37:33,840 - INFO - Batch 159/1250
2025-09-24 13:37:33,911 - INFO - Batch 160/1250
2025-09-24 13:37:33,984 - INFO - Batch 161/1250
2025-09-24 13:37:34,055 - INFO - Batch 162/1250
2025-09-24 13:37:34,120 - INFO - Batch 163/1250
2025-09-24 13:37:34,180 - INFO - Batch 164/1250
2025-09-24 13:37:34,241 - INFO - Batch 165/1250
2025-09-24 13:37:34,300 - INFO - Batch 166/1250
2025-09-24 13:37:34,366 - INFO - Batch 167/1250
2025-09-24 13:37:34,431 - INFO - Batch 168/1250
2025-09-24 13:37:34,498 - INFO - Batch 169/1250
2025-09-24 13:37:34,561 - INFO - Batch 170/1250
2025-09-24 13:37:34,622 - INFO - Batch 171/1250
2025-09-24 13:37:34,688 - INFO - Batch 172/1250
2025-09-24 13:37:34,757 - INFO - Batch 173/1250
2025-09-24 13:37:34,819 - INFO - Batch 174/1250
2025-09-24 13:37:34,883 - INFO - Batch 175/1250
2025-09-24 13:37:34,944 - INFO - Batch 176/1250
2025-09-24 13:37:35,006 - INFO - Batch 177/1250
2025-09-24 13:37:35,068 - INFO - Batch 178/1250
2025-09-24 13:37:35,131 - INFO - Batch 179/1250
2025-09-24 13:37:35,192 - INFO - Batch 180/1250
2025-09-24 13:37:35,253 - INFO - Batch 181/1250
2025-09-24 13:37:35,369 - INFO - Batch 182/1250
2025-09-24 13:37:35,431 - INFO - Batch 183/1250
2025-09-24 13:37:35,492 - INFO - Batch 184/1250
2025-09-24 13:37:35,553 - INFO - Batch 185/1250
2025-09-24 13:37:35,616 - INFO - Batch 186/1250
2025-09-24 13:37:35,683 - INFO - Batch 187/1250
2025-09-24 13:37:35,744 - INFO - Batch 188/1250
2025-09-24 13:37:35,805 - INFO - Batch 189/1250
2025-09-24 13:37:35,863 - INFO - Batch 190/1250
2025-09-24 13:37:35,925 - INFO - Batch 191/1250
2025-09-24 13:37:35,985 - INFO - Batch 192/1250
2025-09-24 13:37:36,046 - INFO - Batch 193/1250
2025-09-24 13:37:36,106 - INFO - Batch 194/1250
2025-09-24 13:37:36,168 - INFO - Batch 195/1250
2025-09-24 13:37:36,233 - INFO - Batch 196/1250
2025-09-24 13:37:36,301 - INFO - Batch 197/1250
2025-09-24 13:37:36,368 - INFO - Batch 198/1250
2025-09-24 13:37:36,436 - INFO - Batch 199/1250
2025-09-24 13:37:36,519 - INFO - Batch 200/1250
2025-09-24 13:37:36,584 - INFO - Batch 201/1250
2025-09-24 13:37:36,665 - INFO - Batch 202/1250
2025-09-24 13:37:36,816 - INFO - Batch 203/1250
2025-09-24 13:37:36,882 - INFO - Batch 204/1250
2025-09-24 13:37:36,951 - INFO - Batch 205/1250
2025-09-24 13:37:37,011 - INFO - Batch 206/1250
2025-09-24 13:37:37,077 - INFO - Batch 207/1250
2025-09-24 13:37:37,163 - INFO - Batch 208/1250
2025-09-24 13:37:37,240 - INFO - Batch 209/1250
2025-09-24 13:37:37,334 - INFO - Batch 210/1250
2025-09-24 13:37:37,418 - INFO - Batch 211/1250
2025-09-24 13:37:37,502 - INFO - Batch 212/1250
2025-09-24 13:37:37,579 - INFO - Batch 213/1250
2025-09-24 13:37:37,652 - INFO - Batch 214/1250
2025-09-24 13:37:37,723 - INFO - Batch 215/1250
2025-09-24 13:37:37,789 - INFO - Batch 216/1250
2025-09-24 13:37:37,858 - INFO - Batch 217/1250
2025-09-24 13:37:37,930 - INFO - Batch 218/1250
2025-09-24 13:37:38,008 - INFO - Batch 219/1250
2025-09-24 13:37:38,083 - INFO - Batch 220/1250
2025-09-24 13:37:38,153 - INFO - Batch 221/1250
2025-09-24 13:37:38,225 - INFO - Batch 222/1250
2025-09-24 13:37:38,298 - INFO - Batch 223/1250
2025-09-24 13:37:38,369 - INFO - Batch 224/1250
2025-09-24 13:37:38,444 - INFO - Batch 225/1250
2025-09-24 13:37:38,517 - INFO - Batch 226/1250
2025-09-24 13:37:38,593 - INFO - Batch 227/1250
2025-09-24 13:37:38,667 - INFO - Batch 228/1250
2025-09-24 13:37:38,739 - INFO - Batch 229/1250
2025-09-24 13:37:38,814 - INFO - Batch 230/1250
2025-09-24 13:37:38,892 - INFO - Batch 231/1250
2025-09-24 13:37:38,962 - INFO - Batch 232/1250
2025-09-24 13:37:39,031 - INFO - Batch 233/1250
2025-09-24 13:37:39,105 - INFO - Batch 234/1250
2025-09-24 13:37:39,178 - INFO - Batch 235/1250
2025-09-24 13:37:39,252 - INFO - Batch 236/1250
2025-09-24 13:37:39,325 - INFO - Batch 237/1250
2025-09-24 13:37:39,409 - INFO - Batch 238/1250
2025-09-24 13:37:39,486 - INFO - Batch 239/1250
2025-09-24 13:37:39,552 - INFO - Batch 240/1250
2025-09-24 13:37:39,615 - INFO - Batch 241/1250
2025-09-24 13:37:39,679 - INFO - Batch 242/1250
2025-09-24 13:37:39,741 - INFO - Batch 243/1250
2025-09-24 13:37:39,812 - INFO - Batch 244/1250
2025-09-24 13:37:39,875 - INFO - Batch 245/1250
2025-09-24 13:37:39,937 - INFO - Batch 246/1250
2025-09-24 13:37:40,002 - INFO - Batch 247/1250
2025-09-24 13:37:40,063 - INFO - Batch 248/1250
2025-09-24 13:37:40,125 - INFO - Batch 249/1250
2025-09-24 13:37:40,186 - INFO - Batch 250/1250
2025-09-24 13:37:40,249 - INFO - Batch 251/1250
2025-09-24 13:37:40,311 - INFO - Batch 252/1250
2025-09-24 13:37:40,374 - INFO - Batch 253/1250
2025-09-24 13:37:40,433 - INFO - Batch 254/1250
2025-09-24 13:37:40,497 - INFO - Batch 255/1250
2025-09-24 13:37:40,563 - INFO - Batch 256/1250
2025-09-24 13:37:40,624 - INFO - Batch 257/1250
2025-09-24 13:37:40,686 - INFO - Batch 258/1250
2025-09-24 13:37:40,749 - INFO - Batch 259/1250
2025-09-24 13:37:40,811 - INFO - Batch 260/1250
2025-09-24 13:37:40,890 - INFO - Batch 261/1250
2025-09-24 13:37:40,967 - INFO - Batch 262/1250
2025-09-24 13:37:41,059 - INFO - Batch 263/1250
2025-09-24 13:37:41,144 - INFO - Batch 264/1250
2025-09-24 13:37:41,213 - INFO - Batch 265/1250
2025-09-24 13:37:41,290 - INFO - Batch 266/1250
2025-09-24 13:37:41,353 - INFO - Batch 267/1250
2025-09-24 13:37:41,414 - INFO - Batch 268/1250
2025-09-24 13:37:41,475 - INFO - Batch 269/1250
2025-09-24 13:37:41,535 - INFO - Batch 270/1250
2025-09-24 13:37:41,598 - INFO - Batch 271/1250
2025-09-24 13:37:41,661 - INFO - Batch 272/1250
2025-09-24 13:37:41,722 - INFO - Batch 273/1250
2025-09-24 13:37:41,804 - INFO - Batch 274/1250
2025-09-24 13:37:41,907 - INFO - Batch 275/1250
2025-09-24 13:37:41,974 - INFO - Batch 276/1250
2025-09-24 13:37:42,036 - INFO - Batch 277/1250
2025-09-24 13:37:42,098 - INFO - Batch 278/1250
2025-09-24 13:37:42,158 - INFO - Batch 279/1250
2025-09-24 13:37:42,220 - INFO - Batch 280/1250
2025-09-24 13:37:42,281 - INFO - Batch 281/1250
2025-09-24 13:37:42,342 - INFO - Batch 282/1250
2025-09-24 13:37:42,404 - INFO - Batch 283/1250
2025-09-24 13:37:42,466 - INFO - Batch 284/1250
2025-09-24 13:37:42,526 - INFO - Batch 285/1250
2025-09-24 13:37:42,587 - INFO - Batch 286/1250
2025-09-24 13:37:42,652 - INFO - Batch 287/1250
2025-09-24 13:37:42,715 - INFO - Batch 288/1250
2025-09-24 13:37:42,776 - INFO - Batch 289/1250
2025-09-24 13:37:42,836 - INFO - Batch 290/1250
2025-09-24 13:37:42,902 - INFO - Batch 291/1250
2025-09-24 13:37:42,966 - INFO - Batch 292/1250
2025-09-24 13:37:43,025 - INFO - Batch 293/1250
2025-09-24 13:37:43,113 - INFO - Batch 294/1250
2025-09-24 13:37:43,175 - INFO - Batch 295/1250
2025-09-24 13:37:43,239 - INFO - Batch 296/1250
2025-09-24 13:37:43,298 - INFO - Batch 297/1250
2025-09-24 13:37:43,363 - INFO - Batch 298/1250
2025-09-24 13:37:43,422 - INFO - Batch 299/1250
2025-09-24 13:37:43,486 - INFO - Batch 300/1250
2025-09-24 13:37:43,547 - INFO - Batch 301/1250
2025-09-24 13:37:43,610 - INFO - Batch 302/1250
2025-09-24 13:37:43,669 - INFO - Batch 303/1250
2025-09-24 13:37:43,734 - INFO - Batch 304/1250
2025-09-24 13:37:43,798 - INFO - Batch 305/1250
2025-09-24 13:37:43,862 - INFO - Batch 306/1250
2025-09-24 13:37:43,921 - INFO - Batch 307/1250
2025-09-24 13:37:43,978 - INFO - Batch 308/1250
2025-09-24 13:37:44,041 - INFO - Batch 309/1250
2025-09-24 13:37:44,103 - INFO - Batch 310/1250
2025-09-24 13:37:44,165 - INFO - Batch 311/1250
2025-09-24 13:37:44,228 - INFO - Batch 312/1250
2025-09-24 13:37:44,293 - INFO - Batch 313/1250
2025-09-24 13:37:44,351 - INFO - Batch 314/1250
2025-09-24 13:37:44,411 - INFO - Batch 315/1250
2025-09-24 13:37:44,473 - INFO - Batch 316/1250
2025-09-24 13:37:44,537 - INFO - Batch 317/1250
2025-09-24 13:37:44,598 - INFO - Batch 318/1250
2025-09-24 13:37:44,661 - INFO - Batch 319/1250
2025-09-24 13:37:44,731 - INFO - Batch 320/1250
2025-09-24 13:37:44,796 - INFO - Batch 321/1250
2025-09-24 13:37:44,854 - INFO - Batch 322/1250
2025-09-24 13:37:44,919 - INFO - Batch 323/1250
2025-09-24 13:37:44,978 - INFO - Batch 324/1250
2025-09-24 13:37:45,038 - INFO - Batch 325/1250
2025-09-24 13:37:45,099 - INFO - Batch 326/1250
2025-09-24 13:37:45,163 - INFO - Batch 327/1250
2025-09-24 13:37:45,224 - INFO - Batch 328/1250
2025-09-24 13:37:45,286 - INFO - Batch 329/1250
2025-09-24 13:37:45,346 - INFO - Batch 330/1250
2025-09-24 13:37:45,405 - INFO - Batch 331/1250
2025-09-24 13:37:45,464 - INFO - Batch 332/1250
2025-09-24 13:37:45,522 - INFO - Batch 333/1250
2025-09-24 13:37:45,586 - INFO - Batch 334/1250
2025-09-24 13:37:45,646 - INFO - Batch 335/1250
2025-09-24 13:37:45,704 - INFO - Batch 336/1250
2025-09-24 13:37:45,763 - INFO - Batch 337/1250
2025-09-24 13:37:45,827 - INFO - Batch 338/1250
2025-09-24 13:37:45,888 - INFO - Batch 339/1250
2025-09-24 13:37:45,950 - INFO - Batch 340/1250
2025-09-24 13:37:46,015 - INFO - Batch 341/1250
2025-09-24 13:37:46,080 - INFO - Batch 342/1250
2025-09-24 13:37:46,141 - INFO - Batch 343/1250
2025-09-24 13:37:46,204 - INFO - Batch 344/1250
2025-09-24 13:37:46,267 - INFO - Batch 345/1250
2025-09-24 13:37:46,331 - INFO - Batch 346/1250
2025-09-24 13:37:46,394 - INFO - Batch 347/1250
2025-09-24 13:37:46,456 - INFO - Batch 348/1250
2025-09-24 13:37:46,516 - INFO - Batch 349/1250
2025-09-24 13:37:46,608 - INFO - Batch 350/1250
2025-09-24 13:37:46,693 - INFO - Batch 351/1250
2025-09-24 13:37:46,770 - INFO - Batch 352/1250
2025-09-24 13:37:46,841 - INFO - Batch 353/1250
2025-09-24 13:37:46,912 - INFO - Batch 354/1250
2025-09-24 13:37:46,983 - INFO - Batch 355/1250
2025-09-24 13:37:47,057 - INFO - Batch 356/1250
2025-09-24 13:37:47,127 - INFO - Batch 357/1250
2025-09-24 13:37:47,199 - INFO - Batch 358/1250
2025-09-24 13:37:47,275 - INFO - Batch 359/1250
2025-09-24 13:37:47,350 - INFO - Batch 360/1250
2025-09-24 13:37:47,423 - INFO - Batch 361/1250
2025-09-24 13:37:47,494 - INFO - Batch 362/1250
2025-09-24 13:37:47,570 - INFO - Batch 363/1250
2025-09-24 13:37:47,645 - INFO - Batch 364/1250
2025-09-24 13:37:47,723 - INFO - Batch 365/1250
2025-09-24 13:37:47,800 - INFO - Batch 366/1250
2025-09-24 13:37:47,879 - INFO - Batch 367/1250
2025-09-24 13:37:47,950 - INFO - Batch 368/1250
2025-09-24 13:37:48,024 - INFO - Batch 369/1250
2025-09-24 13:37:48,097 - INFO - Batch 370/1250
2025-09-24 13:37:48,172 - INFO - Batch 371/1250
2025-09-24 13:37:48,247 - INFO - Batch 372/1250
2025-09-24 13:37:48,319 - INFO - Batch 373/1250
2025-09-24 13:37:48,392 - INFO - Batch 374/1250
2025-09-24 13:37:48,468 - INFO - Batch 375/1250
2025-09-24 13:37:48,538 - INFO - Batch 376/1250
2025-09-24 13:37:48,612 - INFO - Batch 377/1250
2025-09-24 13:37:48,683 - INFO - Batch 378/1250
2025-09-24 13:37:48,755 - INFO - Batch 379/1250
2025-09-24 13:37:48,829 - INFO - Batch 380/1250
2025-09-24 13:37:48,903 - INFO - Batch 381/1250
2025-09-24 13:37:48,978 - INFO - Batch 382/1250
2025-09-24 13:37:49,050 - INFO - Batch 383/1250
2025-09-24 13:37:49,116 - INFO - Batch 384/1250
2025-09-24 13:37:49,176 - INFO - Batch 385/1250
2025-09-24 13:37:49,240 - INFO - Batch 386/1250
2025-09-24 13:37:49,307 - INFO - Batch 387/1250
2025-09-24 13:37:49,368 - INFO - Batch 388/1250
2025-09-24 13:37:49,430 - INFO - Batch 389/1250
2025-09-24 13:37:49,492 - INFO - Batch 390/1250
2025-09-24 13:37:49,553 - INFO - Batch 391/1250
2025-09-24 13:37:49,616 - INFO - Batch 392/1250
2025-09-24 13:37:49,681 - INFO - Batch 393/1250
2025-09-24 13:37:49,745 - INFO - Batch 394/1250
2025-09-24 13:37:49,803 - INFO - Batch 395/1250
2025-09-24 13:37:49,862 - INFO - Batch 396/1250
2025-09-24 13:37:49,925 - INFO - Batch 397/1250
2025-09-24 13:37:49,999 - INFO - Batch 398/1250
2025-09-24 13:37:50,059 - INFO - Batch 399/1250
2025-09-24 13:37:50,120 - INFO - Batch 400/1250
2025-09-24 13:37:50,181 - INFO - Batch 401/1250
2025-09-24 13:37:50,245 - INFO - Batch 402/1250
2025-09-24 13:37:50,306 - INFO - Batch 403/1250
2025-09-24 13:37:50,370 - INFO - Batch 404/1250
2025-09-24 13:37:50,433 - INFO - Batch 405/1250
2025-09-24 13:37:50,497 - INFO - Batch 406/1250
2025-09-24 13:37:50,561 - INFO - Batch 407/1250
2025-09-24 13:37:50,619 - INFO - Batch 408/1250
2025-09-24 13:37:50,683 - INFO - Batch 409/1250
2025-09-24 13:37:50,745 - INFO - Batch 410/1250
2025-09-24 13:37:50,806 - INFO - Batch 411/1250
2025-09-24 13:37:50,866 - INFO - Batch 412/1250
2025-09-24 13:37:50,927 - INFO - Batch 413/1250
2025-09-24 13:37:50,990 - INFO - Batch 414/1250
2025-09-24 13:37:51,048 - INFO - Batch 415/1250
2025-09-24 13:37:51,110 - INFO - Batch 416/1250
2025-09-24 13:37:51,173 - INFO - Batch 417/1250
2025-09-24 13:37:51,234 - INFO - Batch 418/1250
2025-09-24 13:37:51,296 - INFO - Batch 419/1250
2025-09-24 13:37:51,362 - INFO - Batch 420/1250
2025-09-24 13:37:51,424 - INFO - Batch 421/1250
2025-09-24 13:37:51,483 - INFO - Batch 422/1250
2025-09-24 13:37:51,545 - INFO - Batch 423/1250
2025-09-24 13:37:51,607 - INFO - Batch 424/1250
2025-09-24 13:37:51,670 - INFO - Batch 425/1250
2025-09-24 13:37:51,731 - INFO - Batch 426/1250
2025-09-24 13:37:51,791 - INFO - Batch 427/1250
2025-09-24 13:37:51,851 - INFO - Batch 428/1250
2025-09-24 13:37:51,912 - INFO - Batch 429/1250
2025-09-24 13:37:51,972 - INFO - Batch 430/1250
2025-09-24 13:37:52,032 - INFO - Batch 431/1250
2025-09-24 13:37:52,092 - INFO - Batch 432/1250
2025-09-24 13:37:52,150 - INFO - Batch 433/1250
2025-09-24 13:37:52,211 - INFO - Batch 434/1250
2025-09-24 13:37:52,272 - INFO - Batch 435/1250
2025-09-24 13:37:52,330 - INFO - Batch 436/1250
2025-09-24 13:37:52,390 - INFO - Batch 437/1250
2025-09-24 13:37:52,450 - INFO - Batch 438/1250
2025-09-24 13:37:52,508 - INFO - Batch 439/1250
2025-09-24 13:37:52,573 - INFO - Batch 440/1250
2025-09-24 13:37:52,632 - INFO - Batch 441/1250
2025-09-24 13:37:52,691 - INFO - Batch 442/1250
2025-09-24 13:37:52,753 - INFO - Batch 443/1250
2025-09-24 13:37:52,816 - INFO - Batch 444/1250
2025-09-24 13:37:52,876 - INFO - Batch 445/1250
2025-09-24 13:37:52,939 - INFO - Batch 446/1250
2025-09-24 13:37:52,999 - INFO - Batch 447/1250
2025-09-24 13:37:53,062 - INFO - Batch 448/1250
2025-09-24 13:37:53,125 - INFO - Batch 449/1250
2025-09-24 13:37:53,189 - INFO - Batch 450/1250
2025-09-24 13:37:53,249 - INFO - Batch 451/1250
2025-09-24 13:37:53,313 - INFO - Batch 452/1250
2025-09-24 13:37:53,375 - INFO - Batch 453/1250
2025-09-24 13:37:53,438 - INFO - Batch 454/1250
2025-09-24 13:37:53,500 - INFO - Batch 455/1250
2025-09-24 13:37:53,560 - INFO - Batch 456/1250
2025-09-24 13:37:53,621 - INFO - Batch 457/1250
2025-09-24 13:37:53,687 - INFO - Batch 458/1250
2025-09-24 13:37:53,750 - INFO - Batch 459/1250
2025-09-24 13:37:53,811 - INFO - Batch 460/1250
2025-09-24 13:37:53,872 - INFO - Batch 461/1250
2025-09-24 13:37:53,939 - INFO - Batch 462/1250
2025-09-24 13:37:53,999 - INFO - Batch 463/1250
2025-09-24 13:37:54,057 - INFO - Batch 464/1250
2025-09-24 13:37:54,122 - INFO - Batch 465/1250
2025-09-24 13:37:54,186 - INFO - Batch 466/1250
2025-09-24 13:37:54,245 - INFO - Batch 467/1250
2025-09-24 13:37:54,309 - INFO - Batch 468/1250
2025-09-24 13:37:54,370 - INFO - Batch 469/1250
2025-09-24 13:37:54,433 - INFO - Batch 470/1250
2025-09-24 13:37:54,493 - INFO - Batch 471/1250
2025-09-24 13:37:54,555 - INFO - Batch 472/1250
2025-09-24 13:37:54,620 - INFO - Batch 473/1250
2025-09-24 13:37:54,685 - INFO - Batch 474/1250
2025-09-24 13:37:54,742 - INFO - Batch 475/1250
2025-09-24 13:37:54,811 - INFO - Batch 476/1250
2025-09-24 13:37:54,872 - INFO - Batch 477/1250
2025-09-24 13:37:54,932 - INFO - Batch 478/1250
2025-09-24 13:37:54,992 - INFO - Batch 479/1250
2025-09-24 13:37:55,054 - INFO - Batch 480/1250
2025-09-24 13:37:55,116 - INFO - Batch 481/1250
2025-09-24 13:37:55,178 - INFO - Batch 482/1250
2025-09-24 13:37:55,243 - INFO - Batch 483/1250
2025-09-24 13:37:55,305 - INFO - Batch 484/1250
2025-09-24 13:37:55,369 - INFO - Batch 485/1250
2025-09-24 13:37:55,434 - INFO - Batch 486/1250
2025-09-24 13:37:55,495 - INFO - Batch 487/1250
2025-09-24 13:37:55,559 - INFO - Batch 488/1250
2025-09-24 13:37:55,621 - INFO - Batch 489/1250
2025-09-24 13:37:55,682 - INFO - Batch 490/1250
2025-09-24 13:37:55,746 - INFO - Batch 491/1250
2025-09-24 13:37:55,808 - INFO - Batch 492/1250
2025-09-24 13:37:55,866 - INFO - Batch 493/1250
2025-09-24 13:37:55,931 - INFO - Batch 494/1250
2025-09-24 13:37:55,995 - INFO - Batch 495/1250
2025-09-24 13:37:56,056 - INFO - Batch 496/1250
2025-09-24 13:37:56,115 - INFO - Batch 497/1250
2025-09-24 13:37:56,175 - INFO - Batch 498/1250
2025-09-24 13:37:56,238 - INFO - Batch 499/1250
2025-09-24 13:37:56,303 - INFO - Batch 500/1250
2025-09-24 13:37:56,365 - INFO - Batch 501/1250
2025-09-24 13:37:56,425 - INFO - Batch 502/1250
2025-09-24 13:37:56,488 - INFO - Batch 503/1250
2025-09-24 13:37:56,550 - INFO - Batch 504/1250
2025-09-24 13:37:56,613 - INFO - Batch 505/1250
2025-09-24 13:37:56,677 - INFO - Batch 506/1250
2025-09-24 13:37:56,738 - INFO - Batch 507/1250
2025-09-24 13:37:56,803 - INFO - Batch 508/1250
2025-09-24 13:37:56,864 - INFO - Batch 509/1250
2025-09-24 13:37:56,925 - INFO - Batch 510/1250
2025-09-24 13:37:56,987 - INFO - Batch 511/1250
2025-09-24 13:37:57,047 - INFO - Batch 512/1250
2025-09-24 13:37:57,107 - INFO - Batch 513/1250
2025-09-24 13:37:57,167 - INFO - Batch 514/1250
2025-09-24 13:37:57,227 - INFO - Batch 515/1250
2025-09-24 13:37:57,290 - INFO - Batch 516/1250
2025-09-24 13:37:57,355 - INFO - Batch 517/1250
2025-09-24 13:37:57,418 - INFO - Batch 518/1250
2025-09-24 13:37:57,481 - INFO - Batch 519/1250
2025-09-24 13:37:57,545 - INFO - Batch 520/1250
2025-09-24 13:37:57,613 - INFO - Batch 521/1250
2025-09-24 13:37:57,680 - INFO - Batch 522/1250
2025-09-24 13:37:57,740 - INFO - Batch 523/1250
2025-09-24 13:37:57,798 - INFO - Batch 524/1250
2025-09-24 13:37:57,860 - INFO - Batch 525/1250
2025-09-24 13:37:57,929 - INFO - Batch 526/1250
2025-09-24 13:37:57,989 - INFO - Batch 527/1250
2025-09-24 13:37:58,053 - INFO - Batch 528/1250
2025-09-24 13:37:58,118 - INFO - Batch 529/1250
2025-09-24 13:37:58,180 - INFO - Batch 530/1250
2025-09-24 13:37:58,241 - INFO - Batch 531/1250
2025-09-24 13:37:58,302 - INFO - Batch 532/1250
2025-09-24 13:37:58,361 - INFO - Batch 533/1250
2025-09-24 13:37:58,424 - INFO - Batch 534/1250
2025-09-24 13:37:58,490 - INFO - Batch 535/1250
2025-09-24 13:37:58,556 - INFO - Batch 536/1250
2025-09-24 13:37:58,616 - INFO - Batch 537/1250
2025-09-24 13:37:58,678 - INFO - Batch 538/1250
2025-09-24 13:37:58,739 - INFO - Batch 539/1250
2025-09-24 13:37:58,808 - INFO - Batch 540/1250
2025-09-24 13:37:58,872 - INFO - Batch 541/1250
2025-09-24 13:37:58,936 - INFO - Batch 542/1250
2025-09-24 13:37:58,998 - INFO - Batch 543/1250
2025-09-24 13:37:59,065 - INFO - Batch 544/1250
2025-09-24 13:37:59,131 - INFO - Batch 545/1250
2025-09-24 13:37:59,192 - INFO - Batch 546/1250
2025-09-24 13:37:59,254 - INFO - Batch 547/1250
2025-09-24 13:37:59,319 - INFO - Batch 548/1250
2025-09-24 13:37:59,386 - INFO - Batch 549/1250
2025-09-24 13:37:59,452 - INFO - Batch 550/1250
2025-09-24 13:37:59,515 - INFO - Batch 551/1250
2025-09-24 13:37:59,578 - INFO - Batch 552/1250
2025-09-24 13:37:59,641 - INFO - Batch 553/1250
2025-09-24 13:37:59,704 - INFO - Batch 554/1250
2025-09-24 13:37:59,767 - INFO - Batch 555/1250
2025-09-24 13:37:59,829 - INFO - Batch 556/1250
2025-09-24 13:37:59,891 - INFO - Batch 557/1250
2025-09-24 13:37:59,957 - INFO - Batch 558/1250
2025-09-24 13:38:00,021 - INFO - Batch 559/1250
2025-09-24 13:38:00,084 - INFO - Batch 560/1250
2025-09-24 13:38:00,153 - INFO - Batch 561/1250
2025-09-24 13:38:00,250 - INFO - Batch 562/1250
2025-09-24 13:38:00,321 - INFO - Batch 563/1250
2025-09-24 13:38:00,384 - INFO - Batch 564/1250
2025-09-24 13:38:00,445 - INFO - Batch 565/1250
2025-09-24 13:38:00,505 - INFO - Batch 566/1250
2025-09-24 13:38:00,570 - INFO - Batch 567/1250
2025-09-24 13:38:00,633 - INFO - Batch 568/1250
2025-09-24 13:38:00,693 - INFO - Batch 569/1250
2025-09-24 13:38:00,754 - INFO - Batch 570/1250
2025-09-24 13:38:00,814 - INFO - Batch 571/1250
2025-09-24 13:38:00,878 - INFO - Batch 572/1250
2025-09-24 13:38:00,940 - INFO - Batch 573/1250
2025-09-24 13:38:01,002 - INFO - Batch 574/1250
2025-09-24 13:38:01,067 - INFO - Batch 575/1250
2025-09-24 13:38:01,133 - INFO - Batch 576/1250
2025-09-24 13:38:01,190 - INFO - Batch 577/1250
2025-09-24 13:38:01,250 - INFO - Batch 578/1250
2025-09-24 13:38:01,310 - INFO - Batch 579/1250
2025-09-24 13:38:01,372 - INFO - Batch 580/1250
2025-09-24 13:38:01,432 - INFO - Batch 581/1250
2025-09-24 13:38:01,491 - INFO - Batch 582/1250
2025-09-24 13:38:01,570 - INFO - Batch 583/1250
2025-09-24 13:38:01,632 - INFO - Batch 584/1250
2025-09-24 13:38:01,692 - INFO - Batch 585/1250
2025-09-24 13:38:01,756 - INFO - Batch 586/1250
2025-09-24 13:38:01,815 - INFO - Batch 587/1250
2025-09-24 13:38:01,876 - INFO - Batch 588/1250
2025-09-24 13:38:01,940 - INFO - Batch 589/1250
2025-09-24 13:38:02,002 - INFO - Batch 590/1250
2025-09-24 13:38:02,066 - INFO - Batch 591/1250
2025-09-24 13:38:02,125 - INFO - Batch 592/1250
2025-09-24 13:38:02,186 - INFO - Batch 593/1250
2025-09-24 13:38:02,251 - INFO - Batch 594/1250
2025-09-24 13:38:02,313 - INFO - Batch 595/1250
2025-09-24 13:38:02,373 - INFO - Batch 596/1250
2025-09-24 13:38:02,434 - INFO - Batch 597/1250
2025-09-24 13:38:02,495 - INFO - Batch 598/1250
2025-09-24 13:38:02,558 - INFO - Batch 599/1250
2025-09-24 13:38:02,622 - INFO - Batch 600/1250
2025-09-24 13:38:02,678 - INFO - Batch 601/1250
2025-09-24 13:38:02,742 - INFO - Batch 602/1250
2025-09-24 13:38:02,807 - INFO - Batch 603/1250
2025-09-24 13:38:02,870 - INFO - Batch 604/1250
2025-09-24 13:38:02,930 - INFO - Batch 605/1250
2025-09-24 13:38:02,992 - INFO - Batch 606/1250
2025-09-24 13:38:03,051 - INFO - Batch 607/1250
2025-09-24 13:38:03,115 - INFO - Batch 608/1250
2025-09-24 13:38:03,176 - INFO - Batch 609/1250
2025-09-24 13:38:03,234 - INFO - Batch 610/1250
2025-09-24 13:38:03,298 - INFO - Batch 611/1250
2025-09-24 13:38:03,361 - INFO - Batch 612/1250
2025-09-24 13:38:03,423 - INFO - Batch 613/1250
2025-09-24 13:38:03,486 - INFO - Batch 614/1250
2025-09-24 13:38:03,547 - INFO - Batch 615/1250
2025-09-24 13:38:03,609 - INFO - Batch 616/1250
2025-09-24 13:38:03,670 - INFO - Batch 617/1250
2025-09-24 13:38:03,732 - INFO - Batch 618/1250
2025-09-24 13:38:03,795 - INFO - Batch 619/1250
2025-09-24 13:38:03,854 - INFO - Batch 620/1250
2025-09-24 13:38:03,916 - INFO - Batch 621/1250
2025-09-24 13:38:03,977 - INFO - Batch 622/1250
2025-09-24 13:38:04,040 - INFO - Batch 623/1250
2025-09-24 13:38:04,102 - INFO - Batch 624/1250
2025-09-24 13:38:04,161 - INFO - Batch 625/1250
2025-09-24 13:38:04,218 - INFO - Batch 626/1250
2025-09-24 13:38:04,280 - INFO - Batch 627/1250
2025-09-24 13:38:04,340 - INFO - Batch 628/1250
2025-09-24 13:38:04,405 - INFO - Batch 629/1250
2025-09-24 13:38:04,469 - INFO - Batch 630/1250
2025-09-24 13:38:04,531 - INFO - Batch 631/1250
2025-09-24 13:38:04,595 - INFO - Batch 632/1250
2025-09-24 13:38:04,656 - INFO - Batch 633/1250
2025-09-24 13:38:04,718 - INFO - Batch 634/1250
2025-09-24 13:38:04,783 - INFO - Batch 635/1250
2025-09-24 13:38:04,845 - INFO - Batch 636/1250
2025-09-24 13:38:04,910 - INFO - Batch 637/1250
2025-09-24 13:38:04,971 - INFO - Batch 638/1250
2025-09-24 13:38:05,033 - INFO - Batch 639/1250
2025-09-24 13:38:05,100 - INFO - Batch 640/1250
2025-09-24 13:38:05,164 - INFO - Batch 641/1250
2025-09-24 13:38:05,225 - INFO - Batch 642/1250
2025-09-24 13:38:05,290 - INFO - Batch 643/1250
2025-09-24 13:38:05,356 - INFO - Batch 644/1250
2025-09-24 13:38:05,420 - INFO - Batch 645/1250
2025-09-24 13:38:05,481 - INFO - Batch 646/1250
2025-09-24 13:38:05,547 - INFO - Batch 647/1250
2025-09-24 13:38:05,612 - INFO - Batch 648/1250
2025-09-24 13:38:05,678 - INFO - Batch 649/1250
2025-09-24 13:38:05,738 - INFO - Batch 650/1250
2025-09-24 13:38:05,797 - INFO - Batch 651/1250
2025-09-24 13:38:05,857 - INFO - Batch 652/1250
2025-09-24 13:38:05,925 - INFO - Batch 653/1250
2025-09-24 13:38:05,990 - INFO - Batch 654/1250
2025-09-24 13:38:06,054 - INFO - Batch 655/1250
2025-09-24 13:38:06,116 - INFO - Batch 656/1250
2025-09-24 13:38:06,181 - INFO - Batch 657/1250
2025-09-24 13:38:06,241 - INFO - Batch 658/1250
2025-09-24 13:38:06,300 - INFO - Batch 659/1250
2025-09-24 13:38:06,366 - INFO - Batch 660/1250
2025-09-24 13:38:06,431 - INFO - Batch 661/1250
2025-09-24 13:38:06,494 - INFO - Batch 662/1250
2025-09-24 13:38:06,563 - INFO - Batch 663/1250
2025-09-24 13:38:06,626 - INFO - Batch 664/1250
2025-09-24 13:38:06,689 - INFO - Batch 665/1250
2025-09-24 13:38:06,749 - INFO - Batch 666/1250
2025-09-24 13:38:06,812 - INFO - Batch 667/1250
2025-09-24 13:38:06,876 - INFO - Batch 668/1250
2025-09-24 13:38:06,936 - INFO - Batch 669/1250
2025-09-24 13:38:06,999 - INFO - Batch 670/1250
2025-09-24 13:38:07,062 - INFO - Batch 671/1250
2025-09-24 13:38:07,127 - INFO - Batch 672/1250
2025-09-24 13:38:07,188 - INFO - Batch 673/1250
2025-09-24 13:38:07,249 - INFO - Batch 674/1250
2025-09-24 13:38:07,312 - INFO - Batch 675/1250
2025-09-24 13:38:07,377 - INFO - Batch 676/1250
2025-09-24 13:38:07,440 - INFO - Batch 677/1250
2025-09-24 13:38:07,503 - INFO - Batch 678/1250
2025-09-24 13:38:07,563 - INFO - Batch 679/1250
2025-09-24 13:38:07,634 - INFO - Batch 680/1250
2025-09-24 13:38:07,701 - INFO - Batch 681/1250
2025-09-24 13:38:07,764 - INFO - Batch 682/1250
2025-09-24 13:38:07,828 - INFO - Batch 683/1250
2025-09-24 13:38:07,896 - INFO - Batch 684/1250
2025-09-24 13:38:07,960 - INFO - Batch 685/1250
2025-09-24 13:38:08,020 - INFO - Batch 686/1250
2025-09-24 13:38:08,086 - INFO - Batch 687/1250
2025-09-24 13:38:08,143 - INFO - Batch 688/1250
2025-09-24 13:38:08,205 - INFO - Batch 689/1250
2025-09-24 13:38:08,270 - INFO - Batch 690/1250
2025-09-24 13:38:08,332 - INFO - Batch 691/1250
2025-09-24 13:38:08,396 - INFO - Batch 692/1250
2025-09-24 13:38:08,491 - INFO - Batch 693/1250
2025-09-24 13:38:08,553 - INFO - Batch 694/1250
2025-09-24 13:38:08,620 - INFO - Batch 695/1250
2025-09-24 13:38:08,680 - INFO - Batch 696/1250
2025-09-24 13:38:08,739 - INFO - Batch 697/1250
2025-09-24 13:38:08,804 - INFO - Batch 698/1250
2025-09-24 13:38:08,866 - INFO - Batch 699/1250
2025-09-24 13:38:08,929 - INFO - Batch 700/1250
2025-09-24 13:38:08,999 - INFO - Batch 701/1250
2025-09-24 13:38:09,060 - INFO - Batch 702/1250
2025-09-24 13:38:09,123 - INFO - Batch 703/1250
2025-09-24 13:38:09,193 - INFO - Batch 704/1250
2025-09-24 13:38:09,255 - INFO - Batch 705/1250
2025-09-24 13:38:09,313 - INFO - Batch 706/1250
2025-09-24 13:38:09,378 - INFO - Batch 707/1250
2025-09-24 13:38:09,451 - INFO - Batch 708/1250
2025-09-24 13:38:09,514 - INFO - Batch 709/1250
2025-09-24 13:38:09,577 - INFO - Batch 710/1250
2025-09-24 13:38:09,639 - INFO - Batch 711/1250
2025-09-24 13:38:09,701 - INFO - Batch 712/1250
2025-09-24 13:38:09,764 - INFO - Batch 713/1250
2025-09-24 13:38:09,826 - INFO - Batch 714/1250
2025-09-24 13:38:09,890 - INFO - Batch 715/1250
2025-09-24 13:38:09,952 - INFO - Batch 716/1250
2025-09-24 13:38:10,018 - INFO - Batch 717/1250
2025-09-24 13:38:10,078 - INFO - Batch 718/1250
2025-09-24 13:38:10,137 - INFO - Batch 719/1250
2025-09-24 13:38:10,198 - INFO - Batch 720/1250
2025-09-24 13:38:10,259 - INFO - Batch 721/1250
2025-09-24 13:38:10,325 - INFO - Batch 722/1250
2025-09-24 13:38:10,390 - INFO - Batch 723/1250
2025-09-24 13:38:10,448 - INFO - Batch 724/1250
2025-09-24 13:38:10,513 - INFO - Batch 725/1250
2025-09-24 13:38:10,578 - INFO - Batch 726/1250
2025-09-24 13:38:10,636 - INFO - Batch 727/1250
2025-09-24 13:38:10,704 - INFO - Batch 728/1250
2025-09-24 13:38:10,765 - INFO - Batch 729/1250
2025-09-24 13:38:10,829 - INFO - Batch 730/1250
2025-09-24 13:38:10,892 - INFO - Batch 731/1250
2025-09-24 13:38:10,955 - INFO - Batch 732/1250
2025-09-24 13:38:11,017 - INFO - Batch 733/1250
2025-09-24 13:38:11,078 - INFO - Batch 734/1250
2025-09-24 13:38:11,142 - INFO - Batch 735/1250
2025-09-24 13:38:11,205 - INFO - Batch 736/1250
2025-09-24 13:38:11,268 - INFO - Batch 737/1250
2025-09-24 13:38:11,326 - INFO - Batch 738/1250
2025-09-24 13:38:11,390 - INFO - Batch 739/1250
2025-09-24 13:38:11,453 - INFO - Batch 740/1250
2025-09-24 13:38:11,517 - INFO - Batch 741/1250
2025-09-24 13:38:11,583 - INFO - Batch 742/1250
2025-09-24 13:38:11,650 - INFO - Batch 743/1250
2025-09-24 13:38:11,717 - INFO - Batch 744/1250
2025-09-24 13:38:11,787 - INFO - Batch 745/1250
2025-09-24 13:38:11,854 - INFO - Batch 746/1250
2025-09-24 13:38:11,913 - INFO - Batch 747/1250
2025-09-24 13:38:11,975 - INFO - Batch 748/1250
2025-09-24 13:38:12,041 - INFO - Batch 749/1250
2025-09-24 13:38:12,106 - INFO - Batch 750/1250
2025-09-24 13:38:12,168 - INFO - Batch 751/1250
2025-09-24 13:38:12,230 - INFO - Batch 752/1250
2025-09-24 13:38:12,295 - INFO - Batch 753/1250
2025-09-24 13:38:12,359 - INFO - Batch 754/1250
2025-09-24 13:38:12,423 - INFO - Batch 755/1250
2025-09-24 13:38:12,492 - INFO - Batch 756/1250
2025-09-24 13:38:12,557 - INFO - Batch 757/1250
2025-09-24 13:38:12,623 - INFO - Batch 758/1250
2025-09-24 13:38:12,687 - INFO - Batch 759/1250
2025-09-24 13:38:12,753 - INFO - Batch 760/1250
2025-09-24 13:38:12,812 - INFO - Batch 761/1250
2025-09-24 13:38:12,870 - INFO - Batch 762/1250
2025-09-24 13:38:12,936 - INFO - Batch 763/1250
2025-09-24 13:38:13,005 - INFO - Batch 764/1250
2025-09-24 13:38:13,072 - INFO - Batch 765/1250
2025-09-24 13:38:13,137 - INFO - Batch 766/1250
2025-09-24 13:38:13,201 - INFO - Batch 767/1250
2025-09-24 13:38:13,262 - INFO - Batch 768/1250
2025-09-24 13:38:13,327 - INFO - Batch 769/1250
2025-09-24 13:38:13,392 - INFO - Batch 770/1250
2025-09-24 13:38:13,449 - INFO - Batch 771/1250
2025-09-24 13:38:13,515 - INFO - Batch 772/1250
2025-09-24 13:38:13,583 - INFO - Batch 773/1250
2025-09-24 13:38:13,648 - INFO - Batch 774/1250
2025-09-24 13:38:13,708 - INFO - Batch 775/1250
2025-09-24 13:38:13,770 - INFO - Batch 776/1250
2025-09-24 13:38:13,834 - INFO - Batch 777/1250
2025-09-24 13:38:13,899 - INFO - Batch 778/1250
2025-09-24 13:38:13,962 - INFO - Batch 779/1250
2025-09-24 13:38:14,026 - INFO - Batch 780/1250
2025-09-24 13:38:14,088 - INFO - Batch 781/1250
2025-09-24 13:38:14,149 - INFO - Batch 782/1250
2025-09-24 13:38:14,214 - INFO - Batch 783/1250
2025-09-24 13:38:14,277 - INFO - Batch 784/1250
2025-09-24 13:38:14,340 - INFO - Batch 785/1250
2025-09-24 13:38:14,401 - INFO - Batch 786/1250
2025-09-24 13:38:14,461 - INFO - Batch 787/1250
2025-09-24 13:38:14,526 - INFO - Batch 788/1250
2025-09-24 13:38:14,595 - INFO - Batch 789/1250
2025-09-24 13:38:14,661 - INFO - Batch 790/1250
2025-09-24 13:38:14,723 - INFO - Batch 791/1250
2025-09-24 13:38:14,786 - INFO - Batch 792/1250
2025-09-24 13:38:14,849 - INFO - Batch 793/1250
2025-09-24 13:38:14,911 - INFO - Batch 794/1250
2025-09-24 13:38:14,970 - INFO - Batch 795/1250
2025-09-24 13:38:15,033 - INFO - Batch 796/1250
2025-09-24 13:38:15,094 - INFO - Batch 797/1250
2025-09-24 13:38:15,159 - INFO - Batch 798/1250
2025-09-24 13:38:15,222 - INFO - Batch 799/1250
2025-09-24 13:38:15,287 - INFO - Batch 800/1250
2025-09-24 13:38:15,353 - INFO - Batch 801/1250
2025-09-24 13:38:15,421 - INFO - Batch 802/1250
2025-09-24 13:38:15,486 - INFO - Batch 803/1250
2025-09-24 13:38:15,550 - INFO - Batch 804/1250
2025-09-24 13:38:15,612 - INFO - Batch 805/1250
2025-09-24 13:38:15,675 - INFO - Batch 806/1250
2025-09-24 13:38:15,739 - INFO - Batch 807/1250
2025-09-24 13:38:15,800 - INFO - Batch 808/1250
2025-09-24 13:38:15,862 - INFO - Batch 809/1250
2025-09-24 13:38:15,920 - INFO - Batch 810/1250
2025-09-24 13:38:15,980 - INFO - Batch 811/1250
2025-09-24 13:38:16,042 - INFO - Batch 812/1250
2025-09-24 13:38:16,101 - INFO - Batch 813/1250
2025-09-24 13:38:16,166 - INFO - Batch 814/1250
2025-09-24 13:38:16,233 - INFO - Batch 815/1250
2025-09-24 13:38:16,295 - INFO - Batch 816/1250
2025-09-24 13:38:16,362 - INFO - Batch 817/1250
2025-09-24 13:38:16,428 - INFO - Batch 818/1250
2025-09-24 13:38:16,490 - INFO - Batch 819/1250
2025-09-24 13:38:16,557 - INFO - Batch 820/1250
2025-09-24 13:38:16,627 - INFO - Batch 821/1250
2025-09-24 13:38:16,696 - INFO - Batch 822/1250
2025-09-24 13:38:16,759 - INFO - Batch 823/1250
2025-09-24 13:38:16,820 - INFO - Batch 824/1250
2025-09-24 13:38:16,883 - INFO - Batch 825/1250
2025-09-24 13:38:16,948 - INFO - Batch 826/1250
2025-09-24 13:38:17,017 - INFO - Batch 827/1250
2025-09-24 13:38:17,081 - INFO - Batch 828/1250
2025-09-24 13:38:17,142 - INFO - Batch 829/1250
2025-09-24 13:38:17,202 - INFO - Batch 830/1250
2025-09-24 13:38:17,268 - INFO - Batch 831/1250
2025-09-24 13:38:17,328 - INFO - Batch 832/1250
2025-09-24 13:38:17,391 - INFO - Batch 833/1250
2025-09-24 13:38:17,453 - INFO - Batch 834/1250
2025-09-24 13:38:17,514 - INFO - Batch 835/1250
2025-09-24 13:38:17,576 - INFO - Batch 836/1250
2025-09-24 13:38:17,640 - INFO - Batch 837/1250
2025-09-24 13:38:17,702 - INFO - Batch 838/1250
2025-09-24 13:38:17,764 - INFO - Batch 839/1250
2025-09-24 13:38:17,826 - INFO - Batch 840/1250
2025-09-24 13:38:17,890 - INFO - Batch 841/1250
2025-09-24 13:38:17,955 - INFO - Batch 842/1250
2025-09-24 13:38:18,019 - INFO - Batch 843/1250
2025-09-24 13:38:18,085 - INFO - Batch 844/1250
2025-09-24 13:38:18,145 - INFO - Batch 845/1250
2025-09-24 13:38:18,207 - INFO - Batch 846/1250
2025-09-24 13:38:18,269 - INFO - Batch 847/1250
2025-09-24 13:38:18,338 - INFO - Batch 848/1250
2025-09-24 13:38:18,400 - INFO - Batch 849/1250
2025-09-24 13:38:18,470 - INFO - Batch 850/1250
2025-09-24 13:38:18,530 - INFO - Batch 851/1250
2025-09-24 13:38:18,596 - INFO - Batch 852/1250
2025-09-24 13:38:18,659 - INFO - Batch 853/1250
2025-09-24 13:38:18,722 - INFO - Batch 854/1250
2025-09-24 13:38:18,788 - INFO - Batch 855/1250
2025-09-24 13:38:18,853 - INFO - Batch 856/1250
2025-09-24 13:38:18,918 - INFO - Batch 857/1250
2025-09-24 13:38:18,983 - INFO - Batch 858/1250
2025-09-24 13:38:19,044 - INFO - Batch 859/1250
2025-09-24 13:38:19,108 - INFO - Batch 860/1250
2025-09-24 13:38:19,172 - INFO - Batch 861/1250
2025-09-24 13:38:19,238 - INFO - Batch 862/1250
2025-09-24 13:38:19,300 - INFO - Batch 863/1250
2025-09-24 13:38:19,363 - INFO - Batch 864/1250
2025-09-24 13:38:19,425 - INFO - Batch 865/1250
2025-09-24 13:38:19,491 - INFO - Batch 866/1250
2025-09-24 13:38:19,555 - INFO - Batch 867/1250
2025-09-24 13:38:19,623 - INFO - Batch 868/1250
2025-09-24 13:38:19,686 - INFO - Batch 869/1250
2025-09-24 13:38:19,752 - INFO - Batch 870/1250
2025-09-24 13:38:19,816 - INFO - Batch 871/1250
2025-09-24 13:38:19,881 - INFO - Batch 872/1250
2025-09-24 13:38:19,949 - INFO - Batch 873/1250
2025-09-24 13:38:20,015 - INFO - Batch 874/1250
2025-09-24 13:38:20,080 - INFO - Batch 875/1250
2025-09-24 13:38:20,143 - INFO - Batch 876/1250
2025-09-24 13:38:20,198 - INFO - Batch 877/1250
2025-09-24 13:38:20,266 - INFO - Batch 878/1250
2025-09-24 13:38:20,332 - INFO - Batch 879/1250
2025-09-24 13:38:20,394 - INFO - Batch 880/1250
2025-09-24 13:38:20,461 - INFO - Batch 881/1250
2025-09-24 13:38:20,524 - INFO - Batch 882/1250
2025-09-24 13:38:20,586 - INFO - Batch 883/1250
2025-09-24 13:38:20,648 - INFO - Batch 884/1250
2025-09-24 13:38:20,715 - INFO - Batch 885/1250
2025-09-24 13:38:20,779 - INFO - Batch 886/1250
2025-09-24 13:38:20,843 - INFO - Batch 887/1250
2025-09-24 13:38:20,908 - INFO - Batch 888/1250
2025-09-24 13:38:20,972 - INFO - Batch 889/1250
2025-09-24 13:38:21,037 - INFO - Batch 890/1250
2025-09-24 13:38:21,099 - INFO - Batch 891/1250
2025-09-24 13:38:21,163 - INFO - Batch 892/1250
2025-09-24 13:38:21,225 - INFO - Batch 893/1250
2025-09-24 13:38:21,292 - INFO - Batch 894/1250
2025-09-24 13:38:21,353 - INFO - Batch 895/1250
2025-09-24 13:38:21,417 - INFO - Batch 896/1250
2025-09-24 13:38:21,486 - INFO - Batch 897/1250
2025-09-24 13:38:21,550 - INFO - Batch 898/1250
2025-09-24 13:38:21,610 - INFO - Batch 899/1250
2025-09-24 13:38:21,673 - INFO - Batch 900/1250
2025-09-24 13:38:21,740 - INFO - Batch 901/1250
2025-09-24 13:38:21,800 - INFO - Batch 902/1250
2025-09-24 13:38:21,862 - INFO - Batch 903/1250
2025-09-24 13:38:21,928 - INFO - Batch 904/1250
2025-09-24 13:38:21,992 - INFO - Batch 905/1250
2025-09-24 13:38:22,054 - INFO - Batch 906/1250
2025-09-24 13:38:22,112 - INFO - Batch 907/1250
2025-09-24 13:38:22,182 - INFO - Batch 908/1250
2025-09-24 13:38:22,248 - INFO - Batch 909/1250
2025-09-24 13:38:22,314 - INFO - Batch 910/1250
2025-09-24 13:38:22,377 - INFO - Batch 911/1250
2025-09-24 13:38:22,437 - INFO - Batch 912/1250
2025-09-24 13:38:22,501 - INFO - Batch 913/1250
2025-09-24 13:38:22,566 - INFO - Batch 914/1250
2025-09-24 13:38:22,627 - INFO - Batch 915/1250
2025-09-24 13:38:22,687 - INFO - Batch 916/1250
2025-09-24 13:38:22,751 - INFO - Batch 917/1250
2025-09-24 13:38:22,813 - INFO - Batch 918/1250
2025-09-24 13:38:22,875 - INFO - Batch 919/1250
2025-09-24 13:38:22,942 - INFO - Batch 920/1250
2025-09-24 13:38:23,004 - INFO - Batch 921/1250
2025-09-24 13:38:23,069 - INFO - Batch 922/1250
2025-09-24 13:38:23,134 - INFO - Batch 923/1250
2025-09-24 13:38:23,198 - INFO - Batch 924/1250
2025-09-24 13:38:23,269 - INFO - Batch 925/1250
2025-09-24 13:38:23,338 - INFO - Batch 926/1250
2025-09-24 13:38:23,402 - INFO - Batch 927/1250
2025-09-24 13:38:23,467 - INFO - Batch 928/1250
2025-09-24 13:38:23,529 - INFO - Batch 929/1250
2025-09-24 13:38:23,598 - INFO - Batch 930/1250
2025-09-24 13:38:23,667 - INFO - Batch 931/1250
2025-09-24 13:38:23,739 - INFO - Batch 932/1250
2025-09-24 13:38:23,819 - INFO - Batch 933/1250
2025-09-24 13:38:23,883 - INFO - Batch 934/1250
2025-09-24 13:38:23,950 - INFO - Batch 935/1250
2025-09-24 13:38:24,010 - INFO - Batch 936/1250
2025-09-24 13:38:24,073 - INFO - Batch 937/1250
2025-09-24 13:38:24,137 - INFO - Batch 938/1250
2025-09-24 13:38:24,206 - INFO - Batch 939/1250
2025-09-24 13:38:24,271 - INFO - Batch 940/1250
2025-09-24 13:38:24,335 - INFO - Batch 941/1250
2025-09-24 13:38:24,396 - INFO - Batch 942/1250
2025-09-24 13:38:24,460 - INFO - Batch 943/1250
2025-09-24 13:38:24,519 - INFO - Batch 944/1250
2025-09-24 13:38:24,582 - INFO - Batch 945/1250
2025-09-24 13:38:24,647 - INFO - Batch 946/1250
2025-09-24 13:38:24,709 - INFO - Batch 947/1250
2025-09-24 13:38:24,772 - INFO - Batch 948/1250
2025-09-24 13:38:24,835 - INFO - Batch 949/1250
2025-09-24 13:38:24,901 - INFO - Batch 950/1250
2025-09-24 13:38:24,966 - INFO - Batch 951/1250
2025-09-24 13:38:25,027 - INFO - Batch 952/1250
2025-09-24 13:38:25,091 - INFO - Batch 953/1250
2025-09-24 13:38:25,153 - INFO - Batch 954/1250
2025-09-24 13:38:25,216 - INFO - Batch 955/1250
2025-09-24 13:38:25,277 - INFO - Batch 956/1250
2025-09-24 13:38:25,338 - INFO - Batch 957/1250
2025-09-24 13:38:25,402 - INFO - Batch 958/1250
2025-09-24 13:38:25,466 - INFO - Batch 959/1250
2025-09-24 13:38:25,530 - INFO - Batch 960/1250
2025-09-24 13:38:25,593 - INFO - Batch 961/1250
2025-09-24 13:38:25,656 - INFO - Batch 962/1250
2025-09-24 13:38:25,725 - INFO - Batch 963/1250
2025-09-24 13:38:25,787 - INFO - Batch 964/1250
2025-09-24 13:38:25,855 - INFO - Batch 965/1250
2025-09-24 13:38:25,919 - INFO - Batch 966/1250
2025-09-24 13:38:25,982 - INFO - Batch 967/1250
2025-09-24 13:38:26,040 - INFO - Batch 968/1250
2025-09-24 13:38:26,107 - INFO - Batch 969/1250
2025-09-24 13:38:26,176 - INFO - Batch 970/1250
2025-09-24 13:38:26,242 - INFO - Batch 971/1250
2025-09-24 13:38:26,303 - INFO - Batch 972/1250
2025-09-24 13:38:26,370 - INFO - Batch 973/1250
2025-09-24 13:38:26,429 - INFO - Batch 974/1250
2025-09-24 13:38:26,494 - INFO - Batch 975/1250
2025-09-24 13:38:26,556 - INFO - Batch 976/1250
2025-09-24 13:38:26,619 - INFO - Batch 977/1250
2025-09-24 13:38:26,687 - INFO - Batch 978/1250
2025-09-24 13:38:26,746 - INFO - Batch 979/1250
2025-09-24 13:38:26,809 - INFO - Batch 980/1250
2025-09-24 13:38:26,869 - INFO - Batch 981/1250
2025-09-24 13:38:26,930 - INFO - Batch 982/1250
2025-09-24 13:38:26,993 - INFO - Batch 983/1250
2025-09-24 13:38:27,059 - INFO - Batch 984/1250
2025-09-24 13:38:27,123 - INFO - Batch 985/1250
2025-09-24 13:38:27,188 - INFO - Batch 986/1250
2025-09-24 13:38:27,252 - INFO - Batch 987/1250
2025-09-24 13:38:27,315 - INFO - Batch 988/1250
2025-09-24 13:38:27,380 - INFO - Batch 989/1250
2025-09-24 13:38:27,442 - INFO - Batch 990/1250
2025-09-24 13:38:27,504 - INFO - Batch 991/1250
2025-09-24 13:38:27,569 - INFO - Batch 992/1250
2025-09-24 13:38:27,632 - INFO - Batch 993/1250
2025-09-24 13:38:27,702 - INFO - Batch 994/1250
2025-09-24 13:38:27,764 - INFO - Batch 995/1250
2025-09-24 13:38:27,829 - INFO - Batch 996/1250
2025-09-24 13:38:27,895 - INFO - Batch 997/1250
2025-09-24 13:38:27,961 - INFO - Batch 998/1250
2025-09-24 13:38:28,029 - INFO - Batch 999/1250
2025-09-24 13:38:28,092 - INFO - Batch 1000/1250
2025-09-24 13:38:28,156 - INFO - Batch 1001/1250
2025-09-24 13:38:28,217 - INFO - Batch 1002/1250
2025-09-24 13:38:28,284 - INFO - Batch 1003/1250
2025-09-24 13:38:28,343 - INFO - Batch 1004/1250
2025-09-24 13:38:28,406 - INFO - Batch 1005/1250
2025-09-24 13:38:28,467 - INFO - Batch 1006/1250
2025-09-24 13:38:28,533 - INFO - Batch 1007/1250
2025-09-24 13:38:28,597 - INFO - Batch 1008/1250
2025-09-24 13:38:28,664 - INFO - Batch 1009/1250
2025-09-24 13:38:28,730 - INFO - Batch 1010/1250
2025-09-24 13:38:28,789 - INFO - Batch 1011/1250
2025-09-24 13:38:28,852 - INFO - Batch 1012/1250
2025-09-24 13:38:28,912 - INFO - Batch 1013/1250
2025-09-24 13:38:28,977 - INFO - Batch 1014/1250
2025-09-24 13:38:29,039 - INFO - Batch 1015/1250
2025-09-24 13:38:29,107 - INFO - Batch 1016/1250
2025-09-24 13:38:29,172 - INFO - Batch 1017/1250
2025-09-24 13:38:29,241 - INFO - Batch 1018/1250
2025-09-24 13:38:29,304 - INFO - Batch 1019/1250
2025-09-24 13:38:29,364 - INFO - Batch 1020/1250
2025-09-24 13:38:29,425 - INFO - Batch 1021/1250
2025-09-24 13:38:29,489 - INFO - Batch 1022/1250
2025-09-24 13:38:29,553 - INFO - Batch 1023/1250
2025-09-24 13:38:29,615 - INFO - Batch 1024/1250
2025-09-24 13:38:29,737 - INFO - Batch 1025/1250
2025-09-24 13:38:29,805 - INFO - Batch 1026/1250
2025-09-24 13:38:29,868 - INFO - Batch 1027/1250
2025-09-24 13:38:29,929 - INFO - Batch 1028/1250
2025-09-24 13:38:29,993 - INFO - Batch 1029/1250
2025-09-24 13:38:30,056 - INFO - Batch 1030/1250
2025-09-24 13:38:30,119 - INFO - Batch 1031/1250
2025-09-24 13:38:30,183 - INFO - Batch 1032/1250
2025-09-24 13:38:30,254 - INFO - Batch 1033/1250
2025-09-24 13:38:30,318 - INFO - Batch 1034/1250
2025-09-24 13:38:30,381 - INFO - Batch 1035/1250
2025-09-24 13:38:30,447 - INFO - Batch 1036/1250
2025-09-24 13:38:30,513 - INFO - Batch 1037/1250
2025-09-24 13:38:30,642 - INFO - Batch 1038/1250
2025-09-24 13:38:30,715 - INFO - Batch 1039/1250
2025-09-24 13:38:30,782 - INFO - Batch 1040/1250
2025-09-24 13:38:30,845 - INFO - Batch 1041/1250
2025-09-24 13:38:30,906 - INFO - Batch 1042/1250
2025-09-24 13:38:30,968 - INFO - Batch 1043/1250
2025-09-24 13:38:31,030 - INFO - Batch 1044/1250
2025-09-24 13:38:31,096 - INFO - Batch 1045/1250
2025-09-24 13:38:31,158 - INFO - Batch 1046/1250
2025-09-24 13:38:31,217 - INFO - Batch 1047/1250
2025-09-24 13:38:31,281 - INFO - Batch 1048/1250
2025-09-24 13:38:31,344 - INFO - Batch 1049/1250
2025-09-24 13:38:31,405 - INFO - Batch 1050/1250
2025-09-24 13:38:31,464 - INFO - Batch 1051/1250
2025-09-24 13:38:31,532 - INFO - Batch 1052/1250
2025-09-24 13:38:31,598 - INFO - Batch 1053/1250
2025-09-24 13:38:31,662 - INFO - Batch 1054/1250
2025-09-24 13:38:31,731 - INFO - Batch 1055/1250
2025-09-24 13:38:31,794 - INFO - Batch 1056/1250
2025-09-24 13:38:31,854 - INFO - Batch 1057/1250
2025-09-24 13:38:31,920 - INFO - Batch 1058/1250
2025-09-24 13:38:31,985 - INFO - Batch 1059/1250
2025-09-24 13:38:32,047 - INFO - Batch 1060/1250
2025-09-24 13:38:32,108 - INFO - Batch 1061/1250
2025-09-24 13:38:32,169 - INFO - Batch 1062/1250
2025-09-24 13:38:32,232 - INFO - Batch 1063/1250
2025-09-24 13:38:32,296 - INFO - Batch 1064/1250
2025-09-24 13:38:32,357 - INFO - Batch 1065/1250
2025-09-24 13:38:32,422 - INFO - Batch 1066/1250
2025-09-24 13:38:32,488 - INFO - Batch 1067/1250
2025-09-24 13:38:32,552 - INFO - Batch 1068/1250
2025-09-24 13:38:32,617 - INFO - Batch 1069/1250
2025-09-24 13:38:32,679 - INFO - Batch 1070/1250
2025-09-24 13:38:32,749 - INFO - Batch 1071/1250
2025-09-24 13:38:32,811 - INFO - Batch 1072/1250
2025-09-24 13:38:32,875 - INFO - Batch 1073/1250
2025-09-24 13:38:32,936 - INFO - Batch 1074/1250
2025-09-24 13:38:32,995 - INFO - Batch 1075/1250
2025-09-24 13:38:33,061 - INFO - Batch 1076/1250
2025-09-24 13:38:33,126 - INFO - Batch 1077/1250
2025-09-24 13:38:33,189 - INFO - Batch 1078/1250
2025-09-24 13:38:33,249 - INFO - Batch 1079/1250
2025-09-24 13:38:33,315 - INFO - Batch 1080/1250
2025-09-24 13:38:33,377 - INFO - Batch 1081/1250
2025-09-24 13:38:33,437 - INFO - Batch 1082/1250
2025-09-24 13:38:33,503 - INFO - Batch 1083/1250
2025-09-24 13:38:33,569 - INFO - Batch 1084/1250
2025-09-24 13:38:33,628 - INFO - Batch 1085/1250
2025-09-24 13:38:33,708 - INFO - Batch 1086/1250
2025-09-24 13:38:33,780 - INFO - Batch 1087/1250
2025-09-24 13:38:33,842 - INFO - Batch 1088/1250
2025-09-24 13:38:33,905 - INFO - Batch 1089/1250
2025-09-24 13:38:33,963 - INFO - Batch 1090/1250
2025-09-24 13:38:34,025 - INFO - Batch 1091/1250
2025-09-24 13:38:34,085 - INFO - Batch 1092/1250
2025-09-24 13:38:34,149 - INFO - Batch 1093/1250
2025-09-24 13:38:34,212 - INFO - Batch 1094/1250
2025-09-24 13:38:34,285 - INFO - Batch 1095/1250
2025-09-24 13:38:34,348 - INFO - Batch 1096/1250
2025-09-24 13:38:34,412 - INFO - Batch 1097/1250
2025-09-24 13:38:34,477 - INFO - Batch 1098/1250
2025-09-24 13:38:34,537 - INFO - Batch 1099/1250
2025-09-24 13:38:34,607 - INFO - Batch 1100/1250
2025-09-24 13:38:34,674 - INFO - Batch 1101/1250
2025-09-24 13:38:34,738 - INFO - Batch 1102/1250
2025-09-24 13:38:34,800 - INFO - Batch 1103/1250
2025-09-24 13:38:34,863 - INFO - Batch 1104/1250
2025-09-24 13:38:34,932 - INFO - Batch 1105/1250
2025-09-24 13:38:34,997 - INFO - Batch 1106/1250
2025-09-24 13:38:35,062 - INFO - Batch 1107/1250
2025-09-24 13:38:35,125 - INFO - Batch 1108/1250
2025-09-24 13:38:35,189 - INFO - Batch 1109/1250
2025-09-24 13:38:35,256 - INFO - Batch 1110/1250
2025-09-24 13:38:35,318 - INFO - Batch 1111/1250
2025-09-24 13:38:35,382 - INFO - Batch 1112/1250
2025-09-24 13:38:35,444 - INFO - Batch 1113/1250
2025-09-24 13:38:35,510 - INFO - Batch 1114/1250
2025-09-24 13:38:35,570 - INFO - Batch 1115/1250
2025-09-24 13:38:35,634 - INFO - Batch 1116/1250
2025-09-24 13:38:35,698 - INFO - Batch 1117/1250
2025-09-24 13:38:35,760 - INFO - Batch 1118/1250
2025-09-24 13:38:35,823 - INFO - Batch 1119/1250
2025-09-24 13:38:35,882 - INFO - Batch 1120/1250
2025-09-24 13:38:35,948 - INFO - Batch 1121/1250
2025-09-24 13:38:36,013 - INFO - Batch 1122/1250
2025-09-24 13:38:36,077 - INFO - Batch 1123/1250
2025-09-24 13:38:36,142 - INFO - Batch 1124/1250
2025-09-24 13:38:36,202 - INFO - Batch 1125/1250
2025-09-24 13:38:36,264 - INFO - Batch 1126/1250
2025-09-24 13:38:36,324 - INFO - Batch 1127/1250
2025-09-24 13:38:36,385 - INFO - Batch 1128/1250
2025-09-24 13:38:36,453 - INFO - Batch 1129/1250
2025-09-24 13:38:36,515 - INFO - Batch 1130/1250
2025-09-24 13:38:36,578 - INFO - Batch 1131/1250
2025-09-24 13:38:36,644 - INFO - Batch 1132/1250
2025-09-24 13:38:36,706 - INFO - Batch 1133/1250
2025-09-24 13:38:36,768 - INFO - Batch 1134/1250
2025-09-24 13:38:36,831 - INFO - Batch 1135/1250
2025-09-24 13:38:36,898 - INFO - Batch 1136/1250
2025-09-24 13:38:36,959 - INFO - Batch 1137/1250
2025-09-24 13:38:37,022 - INFO - Batch 1138/1250
2025-09-24 13:38:37,085 - INFO - Batch 1139/1250
2025-09-24 13:38:37,152 - INFO - Batch 1140/1250
2025-09-24 13:38:37,217 - INFO - Batch 1141/1250
2025-09-24 13:38:37,281 - INFO - Batch 1142/1250
2025-09-24 13:38:37,343 - INFO - Batch 1143/1250
2025-09-24 13:38:37,405 - INFO - Batch 1144/1250
2025-09-24 13:38:37,469 - INFO - Batch 1145/1250
2025-09-24 13:38:37,534 - INFO - Batch 1146/1250
2025-09-24 13:38:37,596 - INFO - Batch 1147/1250
2025-09-24 13:38:37,658 - INFO - Batch 1148/1250
2025-09-24 13:38:37,722 - INFO - Batch 1149/1250
2025-09-24 13:38:37,786 - INFO - Batch 1150/1250
2025-09-24 13:38:37,851 - INFO - Batch 1151/1250
2025-09-24 13:38:37,916 - INFO - Batch 1152/1250
2025-09-24 13:38:37,984 - INFO - Batch 1153/1250
2025-09-24 13:38:38,042 - INFO - Batch 1154/1250
2025-09-24 13:38:38,105 - INFO - Batch 1155/1250
2025-09-24 13:38:38,168 - INFO - Batch 1156/1250
2025-09-24 13:38:38,241 - INFO - Batch 1157/1250
2025-09-24 13:38:38,306 - INFO - Batch 1158/1250
2025-09-24 13:38:38,370 - INFO - Batch 1159/1250
2025-09-24 13:38:38,440 - INFO - Batch 1160/1250
2025-09-24 13:38:38,503 - INFO - Batch 1161/1250
2025-09-24 13:38:38,567 - INFO - Batch 1162/1250
2025-09-24 13:38:38,635 - INFO - Batch 1163/1250
2025-09-24 13:38:38,699 - INFO - Batch 1164/1250
2025-09-24 13:38:38,771 - INFO - Batch 1165/1250
2025-09-24 13:38:38,845 - INFO - Batch 1166/1250
2025-09-24 13:38:38,929 - INFO - Batch 1167/1250
2025-09-24 13:38:39,013 - INFO - Batch 1168/1250
2025-09-24 13:38:39,093 - INFO - Batch 1169/1250
2025-09-24 13:38:39,178 - INFO - Batch 1170/1250
2025-09-24 13:38:39,252 - INFO - Batch 1171/1250
2025-09-24 13:38:39,323 - INFO - Batch 1172/1250
2025-09-24 13:38:39,410 - INFO - Batch 1173/1250
2025-09-24 13:38:39,529 - INFO - Batch 1174/1250
2025-09-24 13:38:39,608 - INFO - Batch 1175/1250
2025-09-24 13:38:39,683 - INFO - Batch 1176/1250
2025-09-24 13:38:39,758 - INFO - Batch 1177/1250
2025-09-24 13:38:39,833 - INFO - Batch 1178/1250
2025-09-24 13:38:39,907 - INFO - Batch 1179/1250
2025-09-24 13:38:39,979 - INFO - Batch 1180/1250
2025-09-24 13:38:40,050 - INFO - Batch 1181/1250
2025-09-24 13:38:40,123 - INFO - Batch 1182/1250
2025-09-24 13:38:40,194 - INFO - Batch 1183/1250
2025-09-24 13:38:40,268 - INFO - Batch 1184/1250
2025-09-24 13:38:40,341 - INFO - Batch 1185/1250
2025-09-24 13:38:40,413 - INFO - Batch 1186/1250
2025-09-24 13:38:40,488 - INFO - Batch 1187/1250
2025-09-24 13:38:40,561 - INFO - Batch 1188/1250
2025-09-24 13:38:40,633 - INFO - Batch 1189/1250
2025-09-24 13:38:40,706 - INFO - Batch 1190/1250
2025-09-24 13:38:40,776 - INFO - Batch 1191/1250
2025-09-24 13:38:40,850 - INFO - Batch 1192/1250
2025-09-24 13:38:40,933 - INFO - Batch 1193/1250
2025-09-24 13:38:41,007 - INFO - Batch 1194/1250
2025-09-24 13:38:41,079 - INFO - Batch 1195/1250
2025-09-24 13:38:41,150 - INFO - Batch 1196/1250
2025-09-24 13:38:41,217 - INFO - Batch 1197/1250
2025-09-24 13:38:41,290 - INFO - Batch 1198/1250
2025-09-24 13:38:41,364 - INFO - Batch 1199/1250
2025-09-24 13:38:41,431 - INFO - Batch 1200/1250
2025-09-24 13:38:41,496 - INFO - Batch 1201/1250
2025-09-24 13:38:41,562 - INFO - Batch 1202/1250
2025-09-24 13:38:41,626 - INFO - Batch 1203/1250
2025-09-24 13:38:41,691 - INFO - Batch 1204/1250
2025-09-24 13:38:41,760 - INFO - Batch 1205/1250
2025-09-24 13:38:41,821 - INFO - Batch 1206/1250
2025-09-24 13:38:41,886 - INFO - Batch 1207/1250
2025-09-24 13:38:41,954 - INFO - Batch 1208/1250
2025-09-24 13:38:42,036 - INFO - Batch 1209/1250
2025-09-24 13:38:42,104 - INFO - Batch 1210/1250
2025-09-24 13:38:42,165 - INFO - Batch 1211/1250
2025-09-24 13:38:42,232 - INFO - Batch 1212/1250
2025-09-24 13:38:42,295 - INFO - Batch 1213/1250
2025-09-24 13:38:42,359 - INFO - Batch 1214/1250
2025-09-24 13:38:42,422 - INFO - Batch 1215/1250
2025-09-24 13:38:42,486 - INFO - Batch 1216/1250
2025-09-24 13:38:42,550 - INFO - Batch 1217/1250
2025-09-24 13:38:42,615 - INFO - Batch 1218/1250
2025-09-24 13:38:42,678 - INFO - Batch 1219/1250
2025-09-24 13:38:42,741 - INFO - Batch 1220/1250
2025-09-24 13:38:42,809 - INFO - Batch 1221/1250
2025-09-24 13:38:42,871 - INFO - Batch 1222/1250
2025-09-24 13:38:42,932 - INFO - Batch 1223/1250
2025-09-24 13:38:42,994 - INFO - Batch 1224/1250
2025-09-24 13:38:43,057 - INFO - Batch 1225/1250
2025-09-24 13:38:43,116 - INFO - Batch 1226/1250
2025-09-24 13:38:43,176 - INFO - Batch 1227/1250
2025-09-24 13:38:43,236 - INFO - Batch 1228/1250
2025-09-24 13:38:43,296 - INFO - Batch 1229/1250
2025-09-24 13:38:43,362 - INFO - Batch 1230/1250
2025-09-24 13:38:43,424 - INFO - Batch 1231/1250
2025-09-24 13:38:43,489 - INFO - Batch 1232/1250
2025-09-24 13:38:43,557 - INFO - Batch 1233/1250
2025-09-24 13:38:43,623 - INFO - Batch 1234/1250
2025-09-24 13:38:43,687 - INFO - Batch 1235/1250
2025-09-24 13:38:43,748 - INFO - Batch 1236/1250
2025-09-24 13:38:43,813 - INFO - Batch 1237/1250
2025-09-24 13:38:43,875 - INFO - Batch 1238/1250
2025-09-24 13:38:43,936 - INFO - Batch 1239/1250
2025-09-24 13:38:43,995 - INFO - Batch 1240/1250
2025-09-24 13:38:44,060 - INFO - Batch 1241/1250
2025-09-24 13:38:44,124 - INFO - Batch 1242/1250
2025-09-24 13:38:44,187 - INFO - Batch 1243/1250
2025-09-24 13:38:44,252 - INFO - Batch 1244/1250
2025-09-24 13:38:44,315 - INFO - Batch 1245/1250
2025-09-24 13:38:44,378 - INFO - Batch 1246/1250
2025-09-24 13:38:44,441 - INFO - Batch 1247/1250
2025-09-24 13:38:44,503 - INFO - Batch 1248/1250
2025-09-24 13:38:44,566 - INFO - Batch 1249/1250
2025-09-24 13:38:44,634 - INFO - Batch 1250/1250
2025-09-24 13:38:44,696 - INFO - Took 81.66 seconds
2025-09-24 13:38:44,699 - INFO - Generated embeddings with dimensions torch.Size([10000, 512])
Embeddings generated successfully!
Embedding shape: torch.Size([10000, 512])
Embedding dimensions: 512

Prepare Data for Machine Learning

We’ll prepare the data for downstream machine learning tasks. In this example, we’ll predict V gene family usage from the embeddings.

[65]:
# Prepare labels for prediction task
# Example: Predict V gene family
target_column = 'v_call_family'
y_labels = heavy_sample[target_column].values
subjects = heavy_sample['subject'].values

# Remove samples with missing labels
valid_mask = pd.notna(y_labels)
X_embeddings = X_embeddings[valid_mask]
y_labels = y_labels[valid_mask]
subjects = subjects[valid_mask]

print(f"Data after removing missing labels:")
print(f"Samples: {len(y_labels)}")
print(f"Features: {X_embeddings.shape[1]}")
print(f"Unique subjects: {len(np.unique(subjects))}")

# Check class distribution
class_counts = Counter(y_labels)
print(f"\nClass distribution:")
for class_name, count in class_counts.most_common():
    print(f"  {class_name}: {count}")
Data after removing missing labels:
Samples: 10000
Features: 512
Unique subjects: 73

Class distribution:
  IGHV3: 4755
  IGHV4: 2271
  IGHV1: 1968
  IGHV5: 450
  IGHV2: 421
  IGHV6: 87
  IGHV7: 46
  IGHV4/OR15: 1
  IGHV3/OR16: 1
[66]:
# Filter classes with sufficient samples
MIN_CLASS_SIZE = 200  # Minimum samples per class
MAX_CLASS_SIZE = 2000  # Maximum samples per class for balanced training

# Keep only classes with sufficient samples
valid_classes = [cls for cls, count in class_counts.items() if count >= MIN_CLASS_SIZE]
valid_mask = np.isin(y_labels, valid_classes)

X_filtered = X_embeddings[valid_mask]
y_filtered = y_labels[valid_mask]
subjects_filtered = subjects[valid_mask]

print(f"After filtering classes with < {MIN_CLASS_SIZE} samples:")
print(f"Samples: {len(y_filtered)}")
print(f"Classes: {len(valid_classes)}")
print(f"Valid classes: {valid_classes}")
After filtering classes with < 200 samples:
Samples: 9865
Classes: 5
Valid classes: ['IGHV3', 'IGHV4', 'IGHV5', 'IGHV1', 'IGHV2']
[68]:
# Subsample large classes for balanced training
def subsample_classes(X, y, subjects, max_size=MAX_CLASS_SIZE, random_state=42):
    """Subsample classes to have at most max_size samples each"""
    np.random.seed(random_state)

    indices_to_keep = []
    for class_name in np.unique(y):
        class_indices = np.where(y == class_name)[0]
        if len(class_indices) <= max_size:
            indices_to_keep.extend(class_indices)
        else:
            # Randomly sample max_size indices
            sampled_indices = np.random.choice(class_indices, size=max_size, replace=False)
            indices_to_keep.extend(sampled_indices)

    indices_to_keep = np.array(indices_to_keep)
    return X[indices_to_keep], y[indices_to_keep], subjects[indices_to_keep]

# Apply subsampling
X_final, y_final, subjects_final = subsample_classes(X_filtered, y_filtered, subjects_filtered)

print(f"Final dataset after subsampling:")
print(f"Samples: {len(y_final)}")
print(f"Features: {X_final.shape[1]}")
print(f"Classes: {len(np.unique(y_final))}")

# Final class distribution
final_class_counts = Counter(y_final)
print(f"\nFinal class distribution:")
for class_name, count in final_class_counts.most_common():
    print(f"  {class_name}: {count}")
Final dataset after subsampling:
Samples: 6839
Features: 512
Classes: 5

Final class distribution:
  IGHV3: 2000
  IGHV4: 2000
  IGHV1: 1968
  IGHV5: 450
  IGHV2: 421

Machine Learning Pipeline

We’ll implement a robust machine learning pipeline using nested cross-validation to evaluate the predictive power of our embeddings.

[69]:
# Set up nested cross-validation
n_splits_outer = 5
n_splits_inner = 3

# Use StratifiedGroupKFold to ensure subjects don't appear in both train and test
outer_cv = StratifiedGroupKFold(n_splits=n_splits_outer, shuffle=True, random_state=42)
inner_cv = StratifiedGroupKFold(n_splits=n_splits_inner, shuffle=True, random_state=43)

# Hyperparameter grid for SVM
param_grid = {
    "C": [0.01, 0.1, 1, 10, 100]
}

print(f"Setting up nested cross-validation:")
print(f"Outer folds: {n_splits_outer}")
print(f"Inner folds: {n_splits_inner}")
print(f"Hyperparameter grid: {param_grid}")
Setting up nested cross-validation:
Outer folds: 5
Inner folds: 3
Hyperparameter grid: {'C': [0.01, 0.1, 1, 10, 100]}
[70]:
# Run nested cross-validation
print("Running nested cross-validation...")
print("This may take a few minutes depending on dataset size and computational resources.")

# Initialize results storage
cv_results = {
    'fold': [],
    'f1_score': [],
    'mcc_score': [],
    'accuracy': [],
    'best_C': []
}

# Perform nested cross-validation
fold_idx = 1
for train_idx, test_idx in outer_cv.split(X_final, y_final, subjects_final):
    print(f"\n--- Outer Fold {fold_idx} ---")

    # Split data
    X_train, X_test = X_final[train_idx], X_final[test_idx]
    y_train, y_test = y_final[train_idx], y_final[test_idx]
    subjects_train = subjects_final[train_idx]

    print(f"Train size: {len(X_train)}, Test size: {len(X_test)}")

    # Inner cross-validation for hyperparameter tuning
    svm_model = SVC(kernel="rbf", class_weight="balanced", random_state=42)

    grid_search = GridSearchCV(
        estimator=svm_model,
        param_grid=param_grid,
        cv=inner_cv,
        scoring="f1_weighted",
        n_jobs=-1
    )

    # Fit grid search
    grid_search.fit(X_train, y_train, groups=subjects_train)

    # Get best model and make predictions
    best_model = grid_search.best_estimator_
    y_pred = best_model.predict(X_test)

    # Calculate metrics
    f1 = f1_score(y_test, y_pred, average="weighted")
    mcc = matthews_corrcoef(y_test, y_pred)
    acc = accuracy_score(y_test, y_pred)

    # Store results
    cv_results['fold'].append(fold_idx)
    cv_results['f1_score'].append(f1)
    cv_results['mcc_score'].append(mcc)
    cv_results['accuracy'].append(acc)
    cv_results['best_C'].append(grid_search.best_params_['C'])

    print(f"Best C: {grid_search.best_params_['C']}")
    print(f"F1 Score: {f1:.4f}")
    print(f"MCC Score: {mcc:.4f}")
    print(f"Accuracy: {acc:.4f}")

    fold_idx += 1

print("\nNested cross-validation completed!")
Running nested cross-validation...
This may take a few minutes depending on dataset size and computational resources.

--- Outer Fold 1 ---
Train size: 6211, Test size: 628
Best C: 10
F1 Score: 1.0000
MCC Score: 1.0000
Accuracy: 1.0000

--- Outer Fold 2 ---
Train size: 5501, Test size: 1338
Best C: 10
F1 Score: 0.9978
MCC Score: 0.9970
Accuracy: 0.9978

--- Outer Fold 3 ---
Train size: 5795, Test size: 1044
Best C: 1
F1 Score: 0.9990
MCC Score: 0.9987
Accuracy: 0.9990

--- Outer Fold 4 ---
Train size: 3993, Test size: 2846
Best C: 0.1
F1 Score: 0.9961
MCC Score: 0.9947
Accuracy: 0.9961

--- Outer Fold 5 ---
Train size: 5856, Test size: 983
Best C: 0.1
F1 Score: 0.9980
MCC Score: 0.9972
Accuracy: 0.9980

Nested cross-validation completed!

Results Analysis

Let’s analyze the performance of our model and visualize the results.

[71]:
# Convert results to DataFrame
results_df = pd.DataFrame(cv_results)

# Calculate summary statistics
print("Cross-Validation Results Summary:")
print("=" * 40)

for metric in ['f1_score', 'mcc_score', 'accuracy']:
    mean_score = results_df[metric].mean()
    std_score = results_df[metric].std()
    print(f"{metric.upper()}: {mean_score:.4f} ± {std_score:.4f}")

print(f"\nBest hyperparameters (C values): {results_df['best_C'].tolist()}")
print(f"Most common C value: {Counter(results_df['best_C']).most_common(1)[0][0]}")

# Display detailed results
print("\nDetailed Results by Fold:")
print(results_df.round(4))
Cross-Validation Results Summary:
========================================
F1_SCORE: 0.9982 ± 0.0015
MCC_SCORE: 0.9975 ± 0.0020
ACCURACY: 0.9982 ± 0.0015

Best hyperparameters (C values): [10.0, 10.0, 1.0, 0.1, 0.1]
Most common C value: 10.0

Detailed Results by Fold:
   fold  f1_score  mcc_score  accuracy  best_C
0     1    1.0000     1.0000    1.0000    10.0
1     2    0.9978     0.9970    0.9978    10.0
2     3    0.9990     0.9987    0.9990     1.0
3     4    0.9961     0.9947    0.9961     0.1
4     5    0.9980     0.9972    0.9980     0.1
[72]:
# Visualize results
fig, axes = plt.subplots(1, 3, figsize=(15, 5))

metrics = ['f1_score', 'mcc_score', 'accuracy']
metric_names = ['F1 Score', 'MCC Score', 'Accuracy']

for i, (metric, name) in enumerate(zip(metrics, metric_names)):
    axes[i].bar(results_df['fold'], results_df[metric], alpha=0.7, color=f'C{i}')
    axes[i].axhline(y=results_df[metric].mean(), color='red', linestyle='--',
                   label=f'Mean: {results_df[metric].mean():.3f}')
    axes[i].set_xlabel('Fold')
    axes[i].set_ylabel(name)
    axes[i].set_title(f'{name} by Fold')
    axes[i].legend()
    axes[i].set_ylim(0, 1)

plt.tight_layout()
plt.show()
../_images/tutorials_ML_tutorial_22_0.png

Model Comparison with Random Baseline

To validate that our embeddings contain meaningful information, let’s compare against a random baseline.

[76]:
# Create random baseline by shuffling embeddings
print("Running random baseline comparison...")

# Shuffle the embeddings while keeping labels intact
# np.random.seed(42)
X_random = X_final.copy()
# Shuffle both rows and columns to completely randomize
X_random = X_random[np.random.permutation(X_random.shape[0])]
X_random = X_random[:, np.random.permutation(X_random.shape[1])]

# Run the same cross-validation with random embeddings
random_results = {
    'fold': [],
    'f1_score': [],
    'mcc_score': [],
    'accuracy': []
}

fold_idx = 1
for train_idx, test_idx in outer_cv.split(X_random, y_final, subjects_final):
    print(f"Random baseline - Fold {fold_idx}")

    X_train, X_test = X_random[train_idx], X_random[test_idx]
    y_train, y_test = y_final[train_idx], y_final[test_idx]
    subjects_train = subjects_final[train_idx]

    # Use simple SVM with default parameters for speed
    svm_model = SVC(kernel="rbf", class_weight="balanced", C=1.0, random_state=42)
    svm_model.fit(X_train, y_train)
    y_pred = svm_model.predict(X_test)

    # Calculate metrics
    f1 = f1_score(y_test, y_pred, average="weighted")
    mcc = matthews_corrcoef(y_test, y_pred)
    acc = accuracy_score(y_test, y_pred)

    random_results['fold'].append(fold_idx)
    random_results['f1_score'].append(f1)
    random_results['mcc_score'].append(mcc)
    random_results['accuracy'].append(acc)

    fold_idx += 1

random_df = pd.DataFrame(random_results)
print("Random baseline completed!")
Running random baseline comparison...
Random baseline - Fold 1
Random baseline - Fold 2
Random baseline - Fold 3
Random baseline - Fold 4
Random baseline - Fold 5
Random baseline completed!
[77]:
# Compare results
print("Performance Comparison: Amulety Embeddings vs Random Baseline")
print("=" * 60)

comparison_data = []
for metric in ['f1_score', 'mcc_score', 'accuracy']:
    amulety_mean = results_df[metric].mean()
    amulety_std = results_df[metric].std()
    random_mean = random_df[metric].mean()
    random_std = random_df[metric].std()
    improvement = ((amulety_mean - random_mean) / random_mean) * 100

    comparison_data.append({
        'Metric': metric.upper(),
        'Amulety': f"{amulety_mean:.4f} ± {amulety_std:.4f}",
        'Random': f"{random_mean:.4f} ± {random_std:.4f}",
        'Improvement': f"{improvement:.1f}%"
    })

    print(f"{metric.upper()}:")
    print(f"  Amulety Embeddings: {amulety_mean:.4f} ± {amulety_std:.4f}")
    print(f"  Random Baseline:    {random_mean:.4f} ± {random_std:.4f}")
    print(f"  Improvement:        {improvement:.1f}%")
    print()

comparison_df = pd.DataFrame(comparison_data)
print("Summary Table:")
print(comparison_df.to_string(index=False))
Performance Comparison: Amulety Embeddings vs Random Baseline
============================================================
F1_SCORE:
  Amulety Embeddings: 0.9982 ± 0.0015
  Random Baseline:    0.1981 ± 0.0061
  Improvement:        404.0%

MCC_SCORE:
  Amulety Embeddings: 0.9975 ± 0.0020
  Random Baseline:    0.0019 ± 0.0119
  Improvement:        51836.2%

ACCURACY:
  Amulety Embeddings: 0.9982 ± 0.0015
  Random Baseline:    0.1783 ± 0.0093
  Improvement:        459.9%

Summary Table:
   Metric         Amulety          Random Improvement
 F1_SCORE 0.9982 ± 0.0015 0.1981 ± 0.0061      404.0%
MCC_SCORE 0.9975 ± 0.0020 0.0019 ± 0.0119    51836.2%
 ACCURACY 0.9982 ± 0.0015 0.1783 ± 0.0093      459.9%

Visualization of Results

[79]:
# Create comparison visualization
fig, ax = plt.subplots(1, 1, figsize=(10, 6))

metrics = ['f1_score', 'mcc_score', 'accuracy']
metric_names = ['F1 Score', 'MCC Score', 'Accuracy']

x = np.arange(len(metrics))
width = 0.35

amulety_means = [results_df[metric].mean() for metric in metrics]
amulety_stds = [results_df[metric].std() for metric in metrics]
random_means = [random_df[metric].mean() for metric in metrics]
random_stds = [random_df[metric].std() for metric in metrics]

bars1 = ax.bar(x - width/2, amulety_means, width, yerr=amulety_stds,
               label='Amulety Embeddings', alpha=0.8, capsize=5)
bars2 = ax.bar(x + width/2, random_means, width, yerr=random_stds,
               label='Random Baseline', alpha=0.8, capsize=5)

ax.set_xlabel('Metrics')
ax.set_ylabel('Score')
# ax.set_title('Performance Comparison: Amulety Embeddings vs Random Baseline')
ax.set_xticks(x)
ax.set_xticklabels(metric_names)
ax.legend()
ax.set_ylim(0, 1)

# Add value labels on bars
def add_value_labels(bars, values, stds):
    for bar, val, std in zip(bars, values, stds):
        height = bar.get_height()
        ax.text(bar.get_x() + bar.get_width()/2., height + std + 0.01,
                f'{val:.3f}', ha='center', va='bottom', fontsize=9)

add_value_labels(bars1, amulety_means, amulety_stds)
add_value_labels(bars2, random_means, random_stds)

plt.tight_layout()
plt.show()
../_images/tutorials_ML_tutorial_27_0.png
[ ]:
# Save results for future reference
results_df.to_csv('ml_cv_results.csv', index=False)
random_df.to_csv('random_baseline_results.csv', index=False)
comparison_df.to_csv('performance_comparison.csv', index=False)