141 lines
4.8 KiB
Bash
Executable File
141 lines
4.8 KiB
Bash
Executable File
#!/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/<A> --run-b results/<B>"
|