#!/usr/bin/env bash # Тюнинг поверх полной серии scripts/run_all_experiments.sh. # Не повторяет E0–E16: только гиперпараметры, состав признаков, веса, k LSA. # # Запуск из каталога lab1: # bash scripts/run_tuning_experiments.sh # # Быстрый черновик: # REPEATS=1 bash scripts/run_tuning_experiments.sh set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" cd "${PROJECT_ROOT}" PYTHON="${PYTHON:-python}" REPEATS="${REPEATS:-3}" SEED="${SEED:-42}" PRESET="${PRESET:-stylometry_pos_lsa}" LOG_DIR="${PROJECT_ROOT}/results/logs" mkdir -p "${LOG_DIR}" RUN_ID="${RUN_ID:-$(date +%Y%m%d_%H%M%S)}" LOG_FILE="${LOG_DIR}/tune_${RUN_ID}.log" exec > >(tee -a "${LOG_FILE}") 2>&1 step() { echo echo "============================================================" echo "== $*" echo "============================================================" } run() { echo echo ">>> $*" "$@" } echo "Тюнинг: $(date)" echo "Интерпретатор: ${PYTHON}" echo "Повторы: ${REPEATS}, seed: ${SEED}, пресет: ${PRESET}" echo "Лог: ${LOG_FILE}" step "T1. Logreg: C" for c in 0.03 0.1 0.3 1 3 10; do run "${PYTHON}" -m stylometry.cli run \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" \ --model-params "{\"C\": ${c}}" done step "T2. Linear SVM: C" for c in 0.03 0.1 0.3 1 3 10; do run "${PYTHON}" -m stylometry.cli run \ --preset "${PRESET}" --model linear_svc \ --repeats "${REPEATS}" --seed "${SEED}" \ --model-params "{\"C\": ${c}}" done step "T3. Logreg без балансировки классов" run "${PYTHON}" -m stylometry.cli run \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" \ --model-params '{"class_weight": null}' step "T4. Без vocabulary и readability" run "${PYTHON}" -m stylometry.cli run \ --config configs/tune_no_vocab_readability.toml \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" step "T5. Без vocabulary, readability и length" run "${PYTHON}" -m stylometry.cli run \ --config configs/tune_no_vocab_readability_length.toml \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" step "T6. Char/POS n-граммы" run "${PYTHON}" -m stylometry.cli run \ --config configs/tune_char_narrow.toml \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" run "${PYTHON}" -m stylometry.cli run \ --config configs/tune_char_wide.toml \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" step "T7. Веса блоков" run "${PYTHON}" -m stylometry.cli run \ --config configs/tune_block_weights.toml \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" step "T8. LSA k=150 и k=300 (в полной серии были 50/100/200)" run "${PYTHON}" -m stylometry.cli run \ --config configs/tune_lsa_k150.toml \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" run "${PYTHON}" -m stylometry.cli run \ --config configs/tune_lsa_k300.toml \ --preset "${PRESET}" --model logreg \ --repeats "${REPEATS}" --seed "${SEED}" run "${PYTHON}" -m stylometry.cli lsa-sweep \ --variants word,content,fw,char,pos \ --components 150,300 \ --model logreg --repeats 1 --seed "${SEED}" step "T9. Случайный лес: глубина и лист" for depth in 10 20 30; do for leaf in 2 3 5; do run "${PYTHON}" -m stylometry.cli run \ --preset "${PRESET}" --model random_forest \ --repeats "${REPEATS}" --seed "${SEED}" \ --model-params "{\"max_depth\": ${depth}, \"min_samples_leaf\": ${leaf}}" done done run "${PYTHON}" -m stylometry.cli run \ --preset "${PRESET}" --model random_forest \ --repeats "${REPEATS}" --seed "${SEED}" \ --model-params '{"max_depth": 20, "min_samples_leaf": 3, "max_features": 0.1}' step "T10. Extra trees (не было в benchmark полной серии)" run "${PYTHON}" -m stylometry.cli run \ --preset "${PRESET}" --model extra_trees \ --repeats "${REPEATS}" --seed "${SEED}" \ --model-params '{"max_depth": 20, "min_samples_leaf": 3}' step "T11. Дельта: 50 и 1000 MFW (100/200/500 уже в полной серии)" run "${PYTHON}" -m stylometry.cli delta \ --features 50,1000 --metrics manhattan,cosine \ --repeats 2 --seed "${SEED}" step "Готово" echo "Конец тюнинга: $(date)" echo "Лог: ${LOG_FILE}" echo echo "Сравнить два каталога:" echo " python -m stylometry.cli compare --run-a results/ --run-b results/"