Compare commits
4 Commits
opencode_t
...
cursor_tes
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79f51105fd | ||
|
|
84ae1c2408 | ||
|
|
b00e3c964e | ||
|
|
c131815fc7 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -10,3 +10,4 @@ lab1/data/processed/
|
|||||||
lab1/features/
|
lab1/features/
|
||||||
lab1/results/*
|
lab1/results/*
|
||||||
!lab1/results/README.md
|
!lab1/results/README.md
|
||||||
|
|
||||||
|
|||||||
@@ -1,636 +0,0 @@
|
|||||||
# Follow-up эксперименты
|
|
||||||
|
|
||||||
Документ продолжает `EXPERIMENTS.md`. Здесь зафиксировано, что показали
|
|
||||||
предварительные прогоны в `results/`, какие вопросы остались открытыми и какая
|
|
||||||
серия экспериментов их закрывает. Запуск серии — `scripts/run_followup_experiments.sh`,
|
|
||||||
сводка — `scripts/analyze_followup.py`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. Что показали текущие прогоны
|
|
||||||
|
|
||||||
### 1.1. Важная методическая поправка
|
|
||||||
|
|
||||||
В `run_metadata.json`, `benchmark/summary.csv`, `ablation.csv`,
|
|
||||||
`lsa_sweep.csv`, `delta_sweep.csv` и `length_bins.csv` основные числа часто
|
|
||||||
берутся из **repeat 0**, а не как среднее по повторам. Например, у основного
|
|
||||||
запуска `stylometry_pos_lsa/logreg` `run_metadata.metrics.macro_f1 = 0.1798`,
|
|
||||||
но среднее по пяти повторам — `0.1785 ± 0.0060`, а по 25 фолдам —
|
|
||||||
`0.1755 ± 0.0189`. Разница между repeat 0 и средним может быть больше, чем
|
|
||||||
эффект, который мы пытаемся измерить.
|
|
||||||
|
|
||||||
Поэтому в таблице ниже числа пересчитаны по `pooled_metrics.csv` (среднее по
|
|
||||||
повторам). Новый скрипт `scripts/analyze_followup.py` делает то же самое для
|
|
||||||
всех follow-up запусков.
|
|
||||||
|
|
||||||
### 1.2. Сводка результатов
|
|
||||||
|
|
||||||
| Постановка | Macro-F1, mean ± std | Повторов | Комментарий |
|
|
||||||
|---|---:|---:|---|
|
|
||||||
| `random_forest` по умолчанию | **0.2180 ± 0.0053** | 3 | лучший наблюдавшийся результат |
|
|
||||||
| `random_forest`, depth 30, leaf 1 | 0.2007 ± 0.0040 | 3 | ручная сетка не проверяла `max_depth=None` |
|
|
||||||
| `linear_svc`, C = 0.3 | 0.1878 ± 0.0052 | 3 | |
|
|
||||||
| `linear_svc`, C = 1 | 0.1871 ± 0.0048 | 3 | |
|
|
||||||
| `logreg`, nested CV | 0.1827 | 1 outer | настройка внутри фолдов |
|
|
||||||
| `stylometry_pos` / `logreg` | 0.1815 ± 0.0054 | 5 | без LSA |
|
|
||||||
| `stylometry_pos_lsa` / `logreg` | 0.1785 ± 0.0060 | 5 | LSA не улучшает |
|
|
||||||
| `logreg`, C = 10 | 0.1843 ± 0.0048 | 3 | |
|
|
||||||
| `lsa_content` / `logreg` | 0.1324 ± 0.0011 | 3 | тема даёт сигнал, но меньше полного набора |
|
|
||||||
| `lsa_char` / `logreg` | 0.1127 ± 0.0007 | 3 | |
|
|
||||||
| `stylometry` (только ручные) | 0.1051 ± 0.0038 | 5 | |
|
|
||||||
| `lsa_word` / `logreg` | 0.0943 ± 0.0020 | 3 | |
|
|
||||||
| `fw` / `logreg` | 0.0598 ± 0.0039 | 3 | |
|
|
||||||
| `lsa_pos` / `logreg` | 0.0478 ± 0.0012 | 3 | |
|
|
||||||
| `length` / `logreg` | 0.0354 ± 0.0032 | 5 | |
|
|
||||||
| `char` / `multinomial_nb` | 0.0274 ± 0.0018 | 3 | |
|
|
||||||
| `pos` / `multinomial_nb` | 0.0203 ± 0.0012 | 3 | |
|
|
||||||
| `length` / `dummy` | 0.0038 | 1 | |
|
|
||||||
|
|
||||||
Случайный уровень для 34 классов — около 0.029 по macro-F1. Почти все
|
|
||||||
осмысленные модели выше него, но разброс между повторами и seed-ами
|
|
||||||
сопоставим с разницей между многими конфигурациями.
|
|
||||||
|
|
||||||
### 1.3. Что уже можно утверждать
|
|
||||||
|
|
||||||
1. **Символьные и POS n-граммы — основной сигнал.** Переход от `stylometry`
|
|
||||||
(0.105) к `stylometry_pos` (0.182) даёт около +0.077 macro-F1. Это больше,
|
|
||||||
чем даёт любой LSA-блок.
|
|
||||||
2. **LSA в текущем виде не оправдан.** `stylometry_pos` (0.1815) и
|
|
||||||
`stylometry_pos_lsa` (0.1785) статистически неразличимы: McNemar
|
|
||||||
`p = 0.86`, bootstrap-разница `+0.0021 [-0.0108, +0.0157]`. LSA стоит
|
|
||||||
либо убрать, либо пересобрать (другие варианты, число компонент, веса).
|
|
||||||
3. **Random forest по умолчанию лучше линейных моделей.** 0.2180 против
|
|
||||||
0.1815–0.1878. При этом ручная сетка `max_depth ∈ {10, 20, 30}` не
|
|
||||||
проверяла `max_depth=None`, поэтому «лучшая» точка сетки (0.2007) хуже
|
|
||||||
дефолта. Нужна сетка вокруг дефолта: `max_depth=None`, `min_samples_leaf`,
|
|
||||||
`max_features`, `n_estimators`, `class_weight`.
|
|
||||||
4. **Абляция намекает на шумные группы.** При 2 повторах удаление
|
|
||||||
`function_words` (+0.0041), `pos` (+0.0026), `lexical` (+0.0020) не
|
|
||||||
ухудшало результат. Это в пределах шума, но достаточно, чтобы проверить
|
|
||||||
«худые» наборы на 5 повторах.
|
|
||||||
5. **Качество зависит от длины.** Для основного запуска (repeat 0):
|
|
||||||
31+ слов — 0.2055, 21–30 — 0.1781, 11–15 — 0.1385. Гипотеза H4
|
|
||||||
поддерживается для длинных реплик; группа 0–5 слов (n = 42) имеет слишком
|
|
||||||
широкий интервал.
|
|
||||||
6. **Ошибки группируются.** Частые пары: Abigail↔Haley, Emily↔Leah/Penny,
|
|
||||||
Sam↔Sebastian/Alex, Vincent↔Jas. Это согласуется с возрастными и
|
|
||||||
гендерными подгруппами, но не доказывает, что модель обязана их путать.
|
|
||||||
7. **Класс-уровень неоднороден.** Худшие F1 (repeat 0): Kent 0.00,
|
|
||||||
Marnie 0.035, Jodi 0.075, Penny 0.091, Maru 0.093. Лучшие: Willy 0.393,
|
|
||||||
Evelyn 0.367, Vincent 0.333. Редкие классы (Mister Qi — 15 реплик,
|
|
||||||
Sandy — 21, Dwarf — 23, Wizard — 24) дают широкие интервалы.
|
|
||||||
8. **Верификация и кластеризация слабые.** ROC-AUC = 0.630, EER = 0.412,
|
|
||||||
TAR@FAR=1% = 0.035, top-1 = 0.133. Кластеризация: ARI = 0, NMI ≈ 0.31–0.35.
|
|
||||||
Это ограничивает интерпретацию: 34-классовая задача различает персонажей
|
|
||||||
лишь частично, и «идеальных» групп нет.
|
|
||||||
9. **Near-duplicates почти нет.** При cosine ≥ 0.9 по char 3–5 всего 3 пары,
|
|
||||||
при ≥ 0.95 — одна, и все они внутри одного персонажа. Утечки между
|
|
||||||
классами через почти-дубли не видно; `StratifiedGroupKFold` не обязателен,
|
|
||||||
но проверка включена в follow-up как диагностика.
|
|
||||||
|
|
||||||
Follow-up пересмотрел пункты 2, 3 и 5: LSA оказался полезен в варианте
|
|
||||||
`content` и при k = 300–400, ExtraTrees обошёл random forest, а зависимость
|
|
||||||
качества от длины реплики оказалась немонотонной. Подробности и числа — в §7.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Открытые вопросы и гипотезы follow-up
|
|
||||||
|
|
||||||
| Обозначение | Гипотеза | Как проверяем |
|
|
||||||
|---|---|---|
|
|
||||||
| F-H1 | Настроенный random forest устойчиво лучше линейных моделей на ≥ 0.02 macro-F1 | F1, F2, F7; парные сравнения по повторам |
|
|
||||||
| F-H2 | LSA-блок не улучшает `stylometry_pos`; content-LSA отражает тему, а не стиль | F3; `stylometry_pos` vs `+content` vs `+pos` vs `+word/pos` |
|
|
||||||
| F-H3 | «Худые» наборы без `function_words`, `pos`, `vocabulary`, `readability` не хуже полного | F4; абляция на 5 повторах + lean-конфиги |
|
|
||||||
| F-H4 | Настройка `min_df`, `max_features`, `ngram_range` для char/POS даёт ≥ 0.01 | F5; сетка на 3 повторах, финалисты на 5 |
|
|
||||||
| F-H5 | `class_weight="balanced"` повышает macro-F1, но снижает accuracy; компромисс нужно измерить | F6; balanced vs none для logreg/SVC/RF |
|
|
||||||
| F-H6 | Ранжирование моделей устойчиво к seed | F7; seeds 7, 2024, 1337 |
|
|
||||||
| F-H7 | Ошибки концентрируются внутри возрастных/гендерных групп | F8; subgroup-report и анализ confusions |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Матрица экспериментов
|
|
||||||
|
|
||||||
Все запуски идут с `folds=5`. Опорный seed — 42. Если не указано иное,
|
|
||||||
повторность 5. Полный список команд и параметров — в
|
|
||||||
`scripts/run_followup_experiments.sh`; ниже — назначение стадий.
|
|
||||||
|
|
||||||
### F0. Воспроизведение опорных результатов
|
|
||||||
|
|
||||||
| Label | Что запускается | Повторов | Зачем |
|
|
||||||
|---|---|---:|---|
|
|
||||||
| `ref_logreg` | `stylometry_pos_lsa` + logreg | 5 | опорная точка 0.1785 |
|
|
||||||
| `ref_nested_logreg` | то же, `--nested` | 1 outer | честная оценка с настройкой C |
|
|
||||||
| `ref_no_lsa` | `stylometry_pos` + logreg | 5 | вклад LSA |
|
|
||||||
| `ref_stylometry` | `stylometry` + logreg | 5 | вклад n-грамм |
|
|
||||||
|
|
||||||
### F1. Сравнение моделей
|
|
||||||
|
|
||||||
| Label | Модель | Повторов |
|
|
||||||
|---|---|---:|
|
|
||||||
| `model_rf_default` | random forest по умолчанию | 5 |
|
|
||||||
| `model_et_default` | extra trees по умолчанию | 5 |
|
|
||||||
| `model_svc_default` | linear SVC, C=1 | 5 |
|
|
||||||
| `model_knn_default` | kNN | 3 |
|
|
||||||
| `model_rf_nested`, `model_et_nested`, `model_svc_nested` | те же с `--nested` | 1 outer |
|
|
||||||
|
|
||||||
### F2. Сетка вокруг random forest
|
|
||||||
|
|
||||||
Сетка строится от дефолта, потому что именно дефолт показал лучший результат.
|
|
||||||
|
|
||||||
- `max_depth ∈ {None, 30, 40}`, `min_samples_leaf ∈ {1, 2, 3}`;
|
|
||||||
- `max_features ∈ {sqrt, 0.05, 0.1}`, `n_estimators ∈ {400, 800}`;
|
|
||||||
- `class_weight ∈ {balanced_subsample (default), balanced, none}`;
|
|
||||||
- extra trees: `max_depth ∈ {None, 30}`, `min_samples_leaf ∈ {1, 2}`.
|
|
||||||
|
|
||||||
Повторность 3. Лучшая точка сетки выбирается автоматически по среднему pooled
|
|
||||||
macro-F1, затем перезапускается на `REPEATS_MAIN` повторах как
|
|
||||||
`rf_grid_best_5` и сравнивается с `model_rf_default` парно. Выбор точки по
|
|
||||||
тестовым метрикам остаётся разведочным: честная оценка — только по
|
|
||||||
`final_rf_nested`.
|
|
||||||
|
|
||||||
### F3. LSA: тема против стиля
|
|
||||||
|
|
||||||
| Label | Конфигурация | Повторов |
|
|
||||||
|---|---|---:|
|
|
||||||
| `lsa_sweep` | варианты content/char/word/pos/fw, k ∈ {100, 200, 300, 400} | 3 |
|
|
||||||
| `lsa_content_k300`, `lsa_content_k400` | LSA content отдельно | 5 |
|
|
||||||
| `lsa_char_k300`, `lsa_pos_k300` | LSA char/pos отдельно | 5 |
|
|
||||||
| `stylometry_pos_content300` | stylometry_pos + content-LSA(k=300) | 5 |
|
|
||||||
| `stylometry_pos_pos300` | stylometry_pos + POS-LSA(k=300) | 5 |
|
|
||||||
| `stylometry_pos_lsa_k300` | stylometry_pos + word/pos-LSA(k=300) | 5 |
|
|
||||||
|
|
||||||
Ключевое сравнение — `stylometry_pos_content300` vs `ref_no_lsa`. Если
|
|
||||||
content-LSA не даёт прироста, LSA-блок можно исключить из финальной модели.
|
|
||||||
Если даёт, это скорее тематический сигнал, и его нужно обсуждать отдельно,
|
|
||||||
а не выдавать за «стиль».
|
|
||||||
|
|
||||||
### F4. Абляция и lean-наборы
|
|
||||||
|
|
||||||
| Label | Что исключено |
|
|
||||||
|---|---|
|
|
||||||
| `ablate_full` | по одной группе, 5 повторов |
|
|
||||||
| `groups_lean1` | `function_words`, `pos` |
|
|
||||||
| `groups_lean2` | `function_words`, `pos`, `vocabulary`, `readability` |
|
|
||||||
| `groups_lean2_content300` | то же + content-LSA(k=300) |
|
|
||||||
| `groups_lean1_rf`, `groups_lean2_rf` | лучшие lean-наборы с random forest |
|
|
||||||
|
|
||||||
### F5. Символьные и POS n-граммы
|
|
||||||
|
|
||||||
- char: `min_df ∈ {2, 5}` (общий параметр для всех TF-IDF/LSA-блоков, не
|
|
||||||
только для char), `char_max_features ∈ {5000, 10000}`,
|
|
||||||
`ngram_range ∈ {(2,4), (3,5)}` при базовых `(2,5)`;
|
|
||||||
- POS: `pos_ngram_range ∈ {(1,2), (1,4)}`, `pos_max_features ∈ {500, 1000}`.
|
|
||||||
|
|
||||||
Сетка на logreg, 3 повтора. Два лучших варианта проверяются с random forest
|
|
||||||
на 5 повторах (`min_df2_rf`, `char_max10000_rf`).
|
|
||||||
|
|
||||||
### F6. Балансировка классов
|
|
||||||
|
|
||||||
`class_weight="balanced"` (по умолчанию) против `None` для logreg, linear SVC
|
|
||||||
и random forest; для RF дополнительно `"balanced"` вместо
|
|
||||||
`"balanced_subsample"`. 5 повторов. Смотреть не только macro-F1, но и
|
|
||||||
accuracy, balanced accuracy и F1 по редким классам.
|
|
||||||
|
|
||||||
### F7. Устойчивость к seed
|
|
||||||
|
|
||||||
`ref_logreg` и `model_rf_default` с seed ∈ {7, 2024, 1337} (seed 42 уже есть в
|
|
||||||
F0/F1). Для RF дополнительно меняется `random_state`. 5 повторов. Если
|
|
||||||
преимущество RF сохраняется в 3/3 дополнительных seed-ах, вывод устойчив.
|
|
||||||
|
|
||||||
### F8. Финальная модель и отчёты
|
|
||||||
|
|
||||||
- `final_rf`: random forest, 10 повторов;
|
|
||||||
- `final_rf_nested`: nested CV для честной оценки;
|
|
||||||
- `length-report`, `subgroup-report` по gender/age_group/species;
|
|
||||||
- `compare` с `ref_logreg` и `ref_no_lsa`;
|
|
||||||
- `verify` для `stylometry_pos_lsa` с seed 42/7/2024;
|
|
||||||
- `delta` по cosine для 500/1000/2000 признаков;
|
|
||||||
- `cluster` для k = 3, 5, 8.
|
|
||||||
|
|
||||||
### F9. Контроли
|
|
||||||
|
|
||||||
- `control_length_logreg` и `control_length_dummy` — нижние границы в той же
|
|
||||||
схеме CV;
|
|
||||||
- near-duplicates по char cosine ≥ 0.8 сохраняются в
|
|
||||||
`results/followup/negative_control/near_duplicates.csv`;
|
|
||||||
- контроль перестановкой меток: та же модель и CV на перемешанных метках,
|
|
||||||
seeds 42/7/2024. Эмпирический chance-level должен быть около 0.02–0.03;
|
|
||||||
если он заметно выше, в пайплайне есть утечка или артефакт.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. Как считать результат
|
|
||||||
|
|
||||||
1. **Основная метрика** — среднее pooled macro-F1 по повторам, а не repeat 0.
|
|
||||||
Рядом указывать std, min/max и bootstrap-интервал (последний в текущем коде
|
|
||||||
считается по repeat 0 — это описательная оценка, не замена разбросу по
|
|
||||||
повторам).
|
|
||||||
2. **Парные сравнения** — по общим повторам: разница macro-F1, McNemar на
|
|
||||||
каждом повторе, bootstrap-разница. В `comparisons.csv` есть
|
|
||||||
`n_positive`, `mean_mcnemar_p`, `n_ci_excludes_zero`. Сравнение
|
|
||||||
корректно только при одинаковых разбиениях (тот же seed и число фолдов);
|
|
||||||
`analyze_followup.py` сопоставляет строки по `line_id` и берёт только общие
|
|
||||||
номера повторов.
|
|
||||||
3. **Правило решения (консервативное):** улучшение считаем убедительным,
|
|
||||||
если одновременно:
|
|
||||||
- средняя разница ≥ 0.01;
|
|
||||||
- разница положительна минимум в 4 из 5 повторов (или в 3 из 3, если
|
|
||||||
повторов 3);
|
|
||||||
- McNemar даёт p < 0.05 в большинстве повторов;
|
|
||||||
- bootstrap-интервал разницы не содержит ноль в большинстве повторов.
|
|
||||||
|
|
||||||
Если эффект меньше 0.01 или знак скачет, выбираем более простую модель.
|
|
||||||
4. **Множественные сравнения.** Для итоговых утверждений применять
|
|
||||||
Holm—Bonferroni к семейству парных p-value; в сводке сырые p-value.
|
|
||||||
5. **Не выбирать признаки/гиперпараметры по тестовым метрикам.** Сетка F2/F5 —
|
|
||||||
разведочная; финальные числа берутся из nested CV или из конфигурации,
|
|
||||||
выбранной до просмотра теста.
|
|
||||||
6. **Вторичные метрики:** accuracy, balanced accuracy, top-3/top-5,
|
|
||||||
per-class F1, length bins, subgroup F1, confusions. Macro-F1 — главная, но
|
|
||||||
не единственная.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. Запуск
|
|
||||||
|
|
||||||
Из каталога `lab1`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Полная follow-up серия (около 4–4.5 часов на 12 ядрах)
|
|
||||||
PYTHON=.venv/bin/python bash scripts/run_followup_experiments.sh
|
|
||||||
|
|
||||||
# Быстрая проверка пайплайна: 1 повтор, без сетки и seed-робастности
|
|
||||||
QUICK=1 PYTHON=.venv/bin/python bash scripts/run_followup_experiments.sh
|
|
||||||
|
|
||||||
# Без тяжёлой сетки и seed-ов, но с финальной моделью
|
|
||||||
RUN_GRID=0 RUN_SEEDS=0 PYTHON=.venv/bin/python bash scripts/run_followup_experiments.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Переменные:
|
|
||||||
|
|
||||||
| Переменная | По умолчанию | Значение |
|
|
||||||
|---|---:|---|
|
|
||||||
| `PYTHON` | `python` | интерпретатор с зависимостями |
|
|
||||||
| `FOLLOWUP_DIR` | `results/followup` | куда складывать результаты (удобно для дымового теста) |
|
|
||||||
| `RUN_ID` | текущее время | суффикс имени лога |
|
|
||||||
| `QUICK` | 0 | 1 — все повторы 1, без сетки и seed-ов |
|
|
||||||
| `REPEATS_MAIN` | 5 | опорные запуски и финалисты |
|
|
||||||
| `REPEATS_GRID` | 3 | сетка RF/ET, kNN, delta |
|
|
||||||
| `REPEATS_SWEEP` | 3 | LSA-sweep |
|
|
||||||
| `REPEATS_NGRAM` | 3 | сетка n-грамм |
|
|
||||||
| `REPEATS_FINAL` | 10 | финальный RF |
|
|
||||||
| `RUN_GRID` | 1 | стадия F2 |
|
|
||||||
| `RUN_SEEDS` | 1 | стадия F7 |
|
|
||||||
| `RUN_FINAL` | 1 | стадия F8 |
|
|
||||||
| `RUN_CONTROLS` | 1 | стадия F9 |
|
|
||||||
| `SKIP_TESTS` | 0 | 1 — не запускать pytest |
|
|
||||||
| `FORCE` | 0 | 1 — перезаписать существующие label-каталоги |
|
|
||||||
| `SEED` | 42 | опорный seed |
|
|
||||||
|
|
||||||
Результаты:
|
|
||||||
|
|
||||||
```text
|
|
||||||
results/followup/
|
|
||||||
ref_logreg/ # один каталог на эксперимент
|
|
||||||
run_metadata.json
|
|
||||||
pooled_metrics.csv
|
|
||||||
per_class_report.csv
|
|
||||||
...
|
|
||||||
command.txt # точная команда
|
|
||||||
configs/ # сгенерированные TOML
|
|
||||||
comparisons/
|
|
||||||
negative_control/
|
|
||||||
summary.csv
|
|
||||||
summary.md
|
|
||||||
comparisons.csv
|
|
||||||
comparisons.md
|
|
||||||
manifest.tsv
|
|
||||||
results/logs/run_followup_<timestamp>.log
|
|
||||||
```
|
|
||||||
|
|
||||||
Сводка пересчитывается отдельно:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
.venv/bin/python scripts/analyze_followup.py \
|
|
||||||
--followup-dir results/followup \
|
|
||||||
--pairs final_rf:ref_logreg final_rf:ref_no_lsa model_rf_default:ref_logreg
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5.1. Проверка пайплайна
|
|
||||||
|
|
||||||
Серия прогнана целиком в дымовом режиме (1 повтор, 1 seed, временный
|
|
||||||
`FOLLOWUP_DIR`, 80 минут): все стадии отработали, `summary.csv` собрал 60
|
|
||||||
запусков с pooled-метриками, `comparisons.md` и JSON по парам сформированы,
|
|
||||||
`pytest` — 33 теста. Контроль
|
|
||||||
перестановкой меток дал macro-F1 0.0270–0.0282 (среднее 0.0276) при ожидаемом
|
|
||||||
случайном уровне ≈ 0.029 — признаков утечки не видно.
|
|
||||||
|
|
||||||
Числа дымового прогона в отчёт не идут (1 повтор), но два сигнала стоит
|
|
||||||
проверить в основной серии: `extra_trees` и `char_max_features=10000` на
|
|
||||||
одном разбиении обошли RF, а `stylometry_pos + content`-LSA(k=300) — прежний
|
|
||||||
`stylometry_pos + word/pos`-LSA(k=100). Именно это и проверяют F2, F3 и F5
|
|
||||||
на 3–5 повторах.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. Время
|
|
||||||
|
|
||||||
Полная серия измерена на этой машине (12 ядер, sklearn 1.9.1): старт
|
|
||||||
25.10.2026 21:08:25 MSK, финиш 26.10.2026 01:19:52 MSK, итого
|
|
||||||
**4 ч 11 мин**. Это меньше первоначальной оценки 5–7 часов, которая была
|
|
||||||
получена линейным пересчётом дымового прогона и не учитывала, что заметная
|
|
||||||
часть времени — фиксированные затраты (загрузка корпуса, построение
|
|
||||||
признаков, отчёты), а не повторная CV.
|
|
||||||
|
|
||||||
| Стадия | Время (замер) |
|
|
||||||
|---|---:|
|
|
||||||
| F0: окружение, pytest, опорные запуски | 13 мин |
|
|
||||||
| F1: сравнение моделей + nested | 13 мин |
|
|
||||||
| F2: сетка RF/ET + F2.1 | 72 мин |
|
|
||||||
| F3: LSA-sweep + подтверждения | 33 мин |
|
|
||||||
| F4: абляция + lean-наборы | 43 мин |
|
|
||||||
| F5: символьные и POS n-граммы | 19 мин |
|
|
||||||
| F6: class_weight | 10 мин |
|
|
||||||
| F7: устойчивость к seed | 17 мин |
|
|
||||||
| F8: финал, verify, delta, cluster | 10 мин |
|
|
||||||
| F9: контроли, near-duplicates, перестановка, сводка | 20 мин |
|
|
||||||
|
|
||||||
`QUICK=1` на этой машине занял около **80 минут** (1 повтор, без сетки
|
|
||||||
RF/ET и seed-робастности, но со sweep, финалом и отчётами). Время зависит
|
|
||||||
от числа потоков sklearn и от стоимости LSA; на 12 ядрах `n_jobs=-1`
|
|
||||||
у GridSearchCV конкурирует с остальными стадиями.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. Результаты полной серии
|
|
||||||
|
|
||||||
Серия прошла 25.10.2026 21:08:25 — 26.10.2026 01:19:52 MSK (4 ч 11 мин,
|
|
||||||
12 ядер). В `results/followup/` лежат 66 запусков; после серии отдельно
|
|
||||||
добавлены два nested-запуска для финалистов (`char_max10000_rf_nested`,
|
|
||||||
`groups_lean2_content300_nested`). Всего в `summary.csv` 68 строк.
|
|
||||||
Сводка — `summary.csv` / `summary.md`, парные сравнения —
|
|
||||||
`comparisons.csv` / `comparisons.md`, лог —
|
|
||||||
`results/logs/run_followup_20261025_210825.log`.
|
|
||||||
|
|
||||||
### 7.1. Ранжирование
|
|
||||||
|
|
||||||
`Δ` — разница с `ref_logreg` (0.1785 по 5 повторам). У nested-запусков
|
|
||||||
в колонке «повторов» стоит 1: это одна вложенная CV из 5 outer-фолдов,
|
|
||||||
а метрика посчитана по pooled OOF-предсказаниям, поэтому std по повторам
|
|
||||||
для них не определён.
|
|
||||||
|
|
||||||
| Label | Модель | Повторов | Macro-F1, mean ± std | Δ | Accuracy | Balanced acc. |
|
|
||||||
|---|---|---:|---:|---:|---:|---:|
|
|
||||||
| `char_max10000_rf` | random_forest | 5 | **0.2583 ± 0.0066** | +0.0798 | 0.2391 | 0.2473 |
|
|
||||||
| `char_max10000_rf_nested` | random_forest | 1 (5 folds) | **0.2579** | +0.0794 | 0.2394 | 0.2521 |
|
|
||||||
| `groups_lean2_content300_nested` | logreg | 1 (5 folds) | **0.2572** | +0.0788 | 0.2369 | 0.2587 |
|
|
||||||
| `model_et_default` | extra_trees | 5 | **0.2551 ± 0.0073** | +0.0767 | 0.2387 | 0.2418 |
|
|
||||||
| `et_dNone_l2` | extra_trees | 3 | **0.2538 ± 0.0089** | +0.0753 | 0.2416 | 0.2609 |
|
|
||||||
| `groups_lean2_content300` | logreg | 5 | **0.2510 ± 0.0040** | +0.0725 | 0.2379 | 0.2644 |
|
|
||||||
| `model_et_nested` | extra_trees | 1 (5 folds) | **0.2486** | +0.0701 | 0.2344 | 0.2478 |
|
|
||||||
| `stylometry_pos_content300` | logreg | 5 | **0.2485 ± 0.0042** | +0.0700 | 0.2337 | 0.2574 |
|
|
||||||
| `rf_grid_best_5` | random_forest | 5 | **0.2294 ± 0.0082** | +0.0509 | 0.2253 | 0.2317 |
|
|
||||||
| `model_rf_default` | random_forest | 5 | **0.2213 ± 0.0065** | +0.0428 | 0.2108 | 0.2114 |
|
|
||||||
| `final_rf` | random_forest | 10 | **0.2216 ± 0.0062** | +0.0431 | 0.2094 | 0.2112 |
|
|
||||||
| `final_rf_nested` | random_forest | 1 (5 folds) | **0.2163** | +0.0378 | 0.2055 | 0.2102 |
|
|
||||||
| `model_svc_default` | linear_svc | 5 | **0.1880 ± 0.0067** | +0.0096 | 0.1840 | 0.1869 |
|
|
||||||
| `ref_no_lsa` | logreg | 5 | **0.1815 ± 0.0054** | +0.0031 | 0.1708 | 0.1988 |
|
|
||||||
| `ref_logreg` | logreg | 5 | **0.1785 ± 0.0060** | 0.0000 | 0.1679 | 0.1874 |
|
|
||||||
| `classweight_logreg_none` | logreg | 5 | **0.1496 ± 0.0077** | −0.0289 | 0.1655 | 0.1367 |
|
|
||||||
| `ref_stylometry` | logreg | 5 | **0.1051 ± 0.0038** | −0.0733 | 0.1012 | 0.1023 |
|
|
||||||
| `control_length_logreg` | logreg | 5 | **0.0354 ± 0.0032** | −0.1430 | 0.0395 | 0.0585 |
|
|
||||||
| `control_length_dummy` | dummy | 1 | **0.0038** | −0.1747 | 0.0693 | 0.0294 |
|
|
||||||
|
|
||||||
Случайный уровень для 34 классов ≈ 0.029; контроль перестановкой меток дал
|
|
||||||
0.0276. Почти все осмысленные конфигурации выше него, но не все различия
|
|
||||||
между ними значимы.
|
|
||||||
|
|
||||||
Главные наблюдения:
|
|
||||||
|
|
||||||
1. **Лучшие результаты — деревья с расширенным char-словарём и ExtraTrees.**
|
|
||||||
`char_max10000_rf` (0.2583) и `model_et_default` (0.2551) идут впереди
|
|
||||||
дефолтного RF (0.2213) на +0.033…+0.037. Nested-оценки подтверждают
|
|
||||||
масштаб: 0.2579 для char-RF и 0.2486 для ET. Разница между этими двумя
|
|
||||||
лидерами мала (≈ +0.003; см. 7.3), поэтому выбирать между ними нужно
|
|
||||||
по простоте и устойчивости, а не по третьему знаку.
|
|
||||||
2. **Лучший logreg — `groups_lean2_content300`** (0.2510; nested 0.2572).
|
|
||||||
Он не уступает деревьям, но выигрывает за счёт `content`-LSA, а не за счёт
|
|
||||||
«стилевых» признаков. Это важно для интерпретации (см. 7.2 и 7.5).
|
|
||||||
3. **Сетка вокруг RF почти ничего не дала.** `rf_grid_best_5` = 0.2294,
|
|
||||||
то есть +0.008 к дефолту, и это в пределах шума. Основной прирост дал
|
|
||||||
не `max_depth`/`min_samples_leaf`, а `char_max_features=10000`.
|
|
||||||
4. **LSA нельзя оценивать одной точкой.** word+pos LSA при k=100 был
|
|
||||||
нейтрален, `content`-LSA при k=300–400 — сильный, POS-LSA — вредный.
|
|
||||||
Зависимость от k монотонная: content 100 → 0.133, 200 → 0.180,
|
|
||||||
300 → 0.198, 400 → 0.213 (sweep, 3 повтора).
|
|
||||||
5. **`class_weight` критичен для logreg.** Без балансировки macro-F1 падает
|
|
||||||
на 0.029, а accuracy почти не меняется. Для деревьев эффект < 0.005
|
|
||||||
и не значим.
|
|
||||||
6. **Разброс по seed мал, разброс по фолдам — нет.** У RF std по повторам
|
|
||||||
0.003–0.008; у nested logreg отдельные фолды дают 0.219–0.290. Поэтому
|
|
||||||
одна nested-оценка точнее по среднему, но не даёт интервала по повторам.
|
|
||||||
Nested-оценка `groups_lean2_content300` (0.2572) даже выше среднего по
|
|
||||||
5 повторам (0.2510) — это не прирост от настройки `C`, а следствие
|
|
||||||
конкретного разбиения; сравнивать нужно средние по повторам, а nested
|
|
||||||
использовать как оценку без оптимизма по гиперпараметрам.
|
|
||||||
|
|
||||||
### 7.2. Проверка гипотез F-H1…F-H7
|
|
||||||
|
|
||||||
| Гипотеза | Вердикт | Главные числа |
|
|
||||||
|---|---|---|
|
|
||||||
| F-H1: настроенный RF устойчиво лучше линейных моделей на ≥ 0.02 | **Подтверждена** | RF vs logreg: +0.0428 (5/5, p = 0.0006); ET vs logreg: +0.0767; nested: RF +0.0336, ET +0.0659; seed-разброс 0.221–0.222 против 0.178–0.181 |
|
|
||||||
| F-H2: LSA не улучшает `stylometry_pos`; content-LSA — тема, не стиль | **Пересмотрена** | word+pos k=100: +0.0031 (3/5, p = 0.63); content k=300: **+0.0669** (5/5, p < 0.0001); POS-LSA k=300: −0.0130; `content` k=400 отдельно: 0.2114, выше полного logreg 0.1785 |
|
|
||||||
| F-H3: lean-наборы без `function_words`, `pos`, `vocabulary`, `readability` не хуже полного | **Подтверждена (эффект ≈ 0)** | lean1 +0.0059, lean2 +0.0023 (p = 0.30/0.46); lean+RF +0.004…+0.006 (p = 0.52/0.58); выигрыша нет, но и потери нет |
|
|
||||||
| F-H4: настройка `min_df`, `max_features`, `ngram_range` даёт ≥ 0.01 | **Частично** | `min_df`, char/POS n-граммы, `pos_max_features` — все < 0.005 и не значимы; `char_max_features=10000`: logreg +0.0070 (p = 0.051), RF **+0.0369** (5/5, p = 0.0032) |
|
|
||||||
| F-H5: balanced class weights повышают macro-F1 ценой accuracy | **Частично** | logreg balanced vs none: +0.0289 macro-F1, accuracy 0.1679 vs 0.1655 (цены по accuracy нет), balanced accuracy 0.187 vs 0.137; SVC: −0.003; RF: −0.001…−0.004, но balanced accuracy 0.242 vs 0.211 |
|
|
||||||
| F-H6: ранжирование моделей устойчиво к seed | **Подтверждена** | для seed 7 / 2024 / 1337: RF 0.2221 / 0.2206 / 0.2210, logreg 0.1779 / 0.1805 / 0.1800; разрыв 0.040–0.044 во всех seed |
|
|
||||||
| F-H7: ошибки концентрируются внутри возрастных/гендерных групп | **Не подтверждена** | F1 по подгруппам различается (elder 0.33, child 0.28, adult 0.19, teen 0.16), но доля ошибок внутри своей группы ≈ случайной: gender 0.449 против 0.472, age 0.384 против 0.360; ошибки стягиваются в hub-классы (Abigail) |
|
|
||||||
|
|
||||||
**F-H2 — главный пересмотр.** Исходный вывод «LSA не оправдан» был верен
|
|
||||||
только для конфигурации по умолчанию: `word`+`pos`, k=100. При k=300–400
|
|
||||||
и варианте `content` LSA даёт большой прирост, а одна `content`-LSA(k=400)
|
|
||||||
без ручных признаков обходит полный `stylometry_pos_lsa` с logreg. При этом
|
|
||||||
`content`-LSA строится по содержательным словам и их биграммам, то есть
|
|
||||||
кодирует лексику и тему (сезоны, работа, подарки, события), а не только
|
|
||||||
идиолект. Поэтому прирост нельзя записывать в «стиль»: это может быть
|
|
||||||
«о чём персонаж говорит» вместо «как он говорит». Прямого тематического
|
|
||||||
контроля в серии нет — это следующий обязательный эксперимент (7.6).
|
|
||||||
|
|
||||||
**F-H7 — не подтверждена в исходной формулировке.** Различия в F1 по
|
|
||||||
подгруппам есть, но они не означают, что модель путает персонажей внутри
|
|
||||||
группы чаще случайного. Фактически ошибки концентрируются не в демографии,
|
|
||||||
а в нескольких «hub»-классах: Abigail получает 23.3% всех предсказаний
|
|
||||||
(её истинная доля — 6.9%), precision 0.09, recall 0.30. Крупнейшие потоки
|
|
||||||
ошибок: Sebastian → Abigail (353 раза за 10 повторов), Haley → Abigail (328),
|
|
||||||
Alex → Abigail (280), Penny → Abigail (266). Это ближе к коллапсу редких
|
|
||||||
классов в один популярный, чем к возрастной путанице.
|
|
||||||
|
|
||||||
### 7.3. Парные сравнения
|
|
||||||
|
|
||||||
Правило решения из §4: улучшение убедительно, если Δ ≥ 0.01, знак
|
|
||||||
положителен минимум в 4/5 повторов, McNemar p < 0.05 в большинстве
|
|
||||||
повторов и bootstrap-интервал не содержит ноль. `mean_ci` — средний
|
|
||||||
интервал по повторам; `n_ci` — сколько повторов его не содержат.
|
|
||||||
|
|
||||||
| A vs B | Δ macro-F1 | Повторов в плюс | McNemar p | Bootstrap CI | CI ∌ 0 |
|
|
||||||
|---|---:|---:|---:|---:|---:|
|
|
||||||
| `model_et_default` vs `ref_logreg` | +0.0767 | 5/5 | < 0.0001 | [+0.0540, +0.0988] | 5/5 |
|
|
||||||
| `groups_lean2_content300_nested` vs `ref_nested_logreg` | +0.0745 | 1/1 | < 0.0001 | [+0.0531, +0.0954] | 1/1 |
|
|
||||||
| `groups_lean2_content300` vs `ref_logreg` | +0.0725 | 5/5 | < 0.0001 | [+0.0529, +0.0917] | 5/5 |
|
|
||||||
| `stylometry_pos_content300` vs `ref_logreg` | +0.0700 | 5/5 | < 0.0001 | [+0.0526, +0.0873] | 5/5 |
|
|
||||||
| `stylometry_pos_content300` vs `ref_no_lsa` | +0.0669 | 5/5 | < 0.0001 | [+0.0496, +0.0829] | 5/5 |
|
|
||||||
| `model_rf_default` vs `ref_logreg` | +0.0428 | 5/5 | 0.0006 | [+0.0199, +0.0652] | 5/5 |
|
|
||||||
| `char_max10000_rf_nested` vs `model_rf_nested` | +0.0416 | 1/1 | < 0.0001 | [+0.0256, +0.0578] | 1/1 |
|
|
||||||
| `char_max10000_rf` vs `model_rf_default` | +0.0369 | 5/5 | 0.0032 | [+0.0201, +0.0535] | 5/5 |
|
|
||||||
| `model_et_default` vs `model_rf_default` | +0.0338 | 5/5 | 0.0113 | [+0.0176, +0.0497] | 5/5 |
|
|
||||||
| `model_et_nested` vs `model_rf_nested` | +0.0323 | 1/1 | 0.0002 | [+0.0175, +0.0473] | 1/1 |
|
|
||||||
| `stylometry_pos_lsa_k300` vs `ref_logreg` | +0.0258 | 5/5 | < 0.0001 | [+0.0145, +0.0371] | 5/5 |
|
|
||||||
| `char_max10000_rf_nested` vs `model_et_nested` | +0.0093 | 1/1 | 0.5812 | [−0.0064, +0.0262] | 0/1 |
|
|
||||||
| `rf_grid_best_5` vs `model_rf_default` | +0.0081 | 4/5 | 0.2607 | [−0.0045, +0.0222] | 2/5 |
|
|
||||||
| `char_max10000_rf` vs `groups_lean2_content300` | +0.0073 | 5/5 | 0.6593 | [−0.0165, +0.0297] | 0/5 |
|
|
||||||
| `char_max10000` vs `ref_logreg` | +0.0070 | 3/3 | 0.0514 | [+0.0016, +0.0125] | 2/3 |
|
|
||||||
| `groups_lean2_content300_nested` vs `groups_lean2_content300` | +0.0044 | 1/1 | 0.8126 | [−0.0037, +0.0117] | 0/1 |
|
|
||||||
| `char_max10000_rf` vs `model_et_default` | +0.0031 | 3/5 | 0.5732 | [−0.0145, +0.0212] | 0/5 |
|
|
||||||
| `ref_no_lsa` vs `ref_logreg` | +0.0031 | 3/5 | 0.6317 | [−0.0100, +0.0167] | 0/5 |
|
|
||||||
| `groups_lean2_content300` vs `stylometry_pos_content300` | +0.0025 | 3/5 | 0.4839 | [−0.0115, +0.0171] | 0/5 |
|
|
||||||
| `char_max10000_rf_nested` vs `groups_lean2_content300_nested` | +0.0006 | 1/1 | 0.8440 | [−0.0208, +0.0226] | 0/1 |
|
|
||||||
| `stylometry_pos_pos300` vs `ref_no_lsa` | −0.0130 | 0/5 | 0.0671 | [−0.0246, −0.0017] | 3/5 |
|
|
||||||
| `classweight_logreg_none` vs `ref_logreg` | −0.0289 | 0/5 | 0.6541 | [−0.0462, −0.0112] | 5/5 |
|
|
||||||
| `control_length_logreg` vs `ref_logreg` | −0.1430 | 0/5 | < 0.0001 | [−0.1611, −0.1215] | 5/5 |
|
|
||||||
|
|
||||||
Полные 46 сравнений — в `results/followup/comparisons.csv` и
|
|
||||||
`comparisons.md`; в таблице выше оставлены те, на которые опираются выводы.
|
|
||||||
|
|
||||||
Что важно в этой таблице:
|
|
||||||
|
|
||||||
- Прирост `content`-LSA и lean+content — самый большой и устойчивый:
|
|
||||||
+0.067…+0.073, 5/5 повторов, p < 0.0001, интервал далеко от нуля.
|
|
||||||
- Деревья обходят logreg устойчиво: +0.043 (RF) и +0.077 (ET) относительно
|
|
||||||
`ref_logreg`, 5/5 повторов, p ≤ 0.0006. В nested-постановке разрыв
|
|
||||||
сохраняется: char-RF +0.042 относительно `model_rf_nested`, lean+content
|
|
||||||
+0.075 относительно `ref_nested_logreg` (оба p < 0.0001).
|
|
||||||
- **ET значимо лучше дефолтного RF**: +0.0338, 5/5, p = 0.011,
|
|
||||||
CI [+0.0176, +0.0497]. Это не шум, и именно ET, а не RF, стоит брать
|
|
||||||
за базу для деревьев.
|
|
||||||
- **Два лидера между собой неразличимы.** `char_max10000_rf` vs
|
|
||||||
`model_et_default`: +0.0031, 3/5, p = 0.57, CI накрывает ноль. В nested:
|
|
||||||
`char_max10000_rf_nested` vs `model_et_nested` +0.0093 (p = 0.58),
|
|
||||||
vs `groups_lean2_content300_nested` +0.0006 (p = 0.84). Выбирать между
|
|
||||||
char-RF, ET и lean+content по этим данным нельзя — разница меньше
|
|
||||||
неопределённости разбиения.
|
|
||||||
- `char_max10000_rf` vs дефолтный RF — редкий случай, когда настройка
|
|
||||||
одного параметра признаков даёт > 0.03 и подтверждается на всех повторах.
|
|
||||||
- Сетка `max_depth`/`min_samples_leaf` даёт лишь +0.0081 (4/5, p = 0.26,
|
|
||||||
CI содержит ноль), то есть подбор глубины деревьев почти бесполезен.
|
|
||||||
- Старый LSA(word+pos, k=100) действительно нейтрален (+0.0031, 3/5),
|
|
||||||
но тот же вариант при k=300 даёт +0.0258 (5/5, p < 0.0001). Значит,
|
|
||||||
вопрос не в «LSA вообще», а в числе компонент: при k=100 сигнал теряется.
|
|
||||||
POS-LSA при k=300 по-прежнему вредит (−0.0130, 0/5).
|
|
||||||
- `class_weight=none` для logreg хуже по macro-F1, хотя McNemar не значим:
|
|
||||||
обе модели часто ошибаются, но balanced-версия лучше вытягивает редкие
|
|
||||||
классы. Это видно по balanced accuracy (0.187 против 0.137).
|
|
||||||
|
|
||||||
Сырые p-value не поправлены на множественность (46 пар). Эффекты
|
|
||||||
+0.04…+0.07 с p < 0.001 переживут Holm—Bonferroni; пограничные
|
|
||||||
(+0.003…+0.009) — нет, и их не стоит интерпретировать как выигрыш.
|
|
||||||
|
|
||||||
### 7.4. Диагностика финальной модели (`final_rf`, 10 повторов)
|
|
||||||
|
|
||||||
- **Длина реплики.** Зависимость немонотонная: 0–5 слов — 0.081 (n = 42),
|
|
||||||
6–10 — 0.173, 11–15 — 0.182, 16–20 — 0.194, 21–30 — **0.231**,
|
|
||||||
31+ — 0.168. Прежний вывод «чем длиннее, тем лучше» не подтвердился:
|
|
||||||
после 30 слов качество падает, вероятно из-за накопления тематических
|
|
||||||
и синтаксических различий.
|
|
||||||
- **Подгруппы.** Elder 0.331, child 0.280, adult 0.190, teen 0.164;
|
|
||||||
gender: male 0.205, female 0.190, unknown 0.229; species: monster 0.269,
|
|
||||||
human 0.201, unknown 0.035. Это F1 внутри группы, а не качество
|
|
||||||
предсказания группы.
|
|
||||||
- **Классы.** Средний F1 по 10 повторам: медиана 0.193, минимум 0.020
|
|
||||||
(Wizard), максимум 0.550 (Evelyn). Худшие: Wizard 0.020, Penny 0.056,
|
|
||||||
Jodi 0.069, Maru 0.075, Mister Qi 0.081; лучшие: Evelyn 0.550, Willy 0.494,
|
|
||||||
Pam 0.493, Pierre 0.470, Vincent 0.397. Семь классов имеют F1 < 0.1.
|
|
||||||
- **Hub-классы.** 23.3% предсказаний — Abigail при истинной доле 6.9%;
|
|
||||||
Alex — 12.3% при 6.0%. Abigail: precision 0.09, recall 0.30, F1 0.14.
|
|
||||||
Это главный источник ошибок и главный резерв для калибровки prior/
|
|
||||||
порогов.
|
|
||||||
- **Верификация.** ROC-AUC 0.630–0.633, EER 0.412–0.415, TAR@FAR=1%
|
|
||||||
0.035–0.038, top-1 0.133–0.141 для seed 42/7/2024. Выше случайного
|
|
||||||
(1/34 = 0.029), но практически бесполезно для open-set сценария.
|
|
||||||
- **Кластеризация.** ARI = 0 для k = 3/5/8 (и agglomerative, и k-means);
|
|
||||||
NMI 0.14–0.53. Персонажи не образуют устойчивых кластеров в этом
|
|
||||||
признаковом пространстве.
|
|
||||||
- **Delta (MFW, cosine).** 2000 признаков — 0.2426, 1000 — 0.2299,
|
|
||||||
500 — 0.1604 (3 повтора). Больше признаков лучше; потолок не найден.
|
|
||||||
- **Near-duplicates.** 13 пар с cosine ≥ 0.8, 3 ≥ 0.9, 1 ≥ 0.95; все —
|
|
||||||
внутри одного персонажа, межклассовых почти-дублей нет. Утечки через
|
|
||||||
дубли не видно.
|
|
||||||
- **Контроль перестановкой.** Macro-F1 0.0270 / 0.0274 / 0.0282 для seed
|
|
||||||
42/7/2024 (среднее 0.0276) при случайном уровне ≈ 0.029. Пайплайн
|
|
||||||
не подглядывает в метки.
|
|
||||||
- **Нижние границы.** Length+logreg 0.0354, dummy 0.0038. Основной результат
|
|
||||||
(0.22–0.26) далеко от обеих границ.
|
|
||||||
|
|
||||||
### 7.5. Что это меняет в выводах
|
|
||||||
|
|
||||||
1. **«Финальная» модель в текущем виде — не лучшая.** `final_rf` — это
|
|
||||||
дефолтный random forest (0.2216), тогда как ExtraTrees (0.2551) и
|
|
||||||
RF с `char_max_features=10000` (0.2583) заметно лучше. В отчёте стоит
|
|
||||||
либо переименовать `final_rf` в `baseline_rf`, либо заменить финальную
|
|
||||||
модель на ET/char-RF и пересчитать отчёты.
|
|
||||||
2. **Главный сигнал — лексика, а не «стиль».** Сильнее всего работают
|
|
||||||
`content`-LSA (тема/лексика) и char-ngram-словарь. Ручные стилометрические
|
|
||||||
признаки дают лишь 0.105. Формулировка «модель различает идиолект»
|
|
||||||
слишком сильная; корректнее — «модель различает персонажей по
|
|
||||||
лексико-тематическому профилю и символьным n-граммам».
|
|
||||||
3. **Вложенная CV подтверждает лидеров, но не закрывает выбор признаков.**
|
|
||||||
Nested-оценки (0.2579 / 0.2486 / 0.2572) честнее по гиперпараметрам,
|
|
||||||
но `char_max_features=10000` и `content`-LSA(k=300) выбирались на тех же
|
|
||||||
данных. Для строгого вывода нужна внешняя валидация или вложенный выбор
|
|
||||||
признаков.
|
|
||||||
4. **Основная неопределённость — не seed, а разбиение и признаки.**
|
|
||||||
Разброс по seed ≤ 0.008, а по фолдам nested logreg — до 0.07. Поэтому
|
|
||||||
одна цифра без интервала вводит в заблуждение; нужно указывать mean ± std
|
|
||||||
по повторам и отдельно fold-разброс.
|
|
||||||
5. **Ошибки — это hub-коллапс, а не демографическая путаница.**
|
|
||||||
Калибровка prior/порогов и работа с редкими классами дадут больше, чем
|
|
||||||
дальнейший подбор глубины деревьев.
|
|
||||||
|
|
||||||
### 7.6. Следующие эксперименты
|
|
||||||
|
|
||||||
1. **Nested CV с выбором признаков внутри внешнего цикла.** Сейчас nested
|
|
||||||
крутит только `C`/`max_depth`/`min_samples_leaf`; `char_max_features`
|
|
||||||
и `k` LSA фиксированы. Нужен внешний цикл, в котором выбираются и они,
|
|
||||||
либо отдельный held-out набор для выбора признаков.
|
|
||||||
2. **`content`-LSA k=400/500 + lean2.** Sweep показывает монотонный рост
|
|
||||||
до k=400; стоит проверить k=400 и 500 с `groups_lean2_content*` и
|
|
||||||
`stylometry_pos_content*`, желательно сразу с nested-оценкой.
|
|
||||||
3. **Тематический контроль.** Проверить, сохраняется ли прирост
|
|
||||||
`content`-LSA, если: (а) сбалансировать реплики по темам/сезонам,
|
|
||||||
(б) удалить тематические слова, (в) обучить adversarial-классификатор
|
|
||||||
темы и убрать её компоненту. Без этого нельзя утверждать, что модель
|
|
||||||
ловит стиль, а не «о чём говорят».
|
|
||||||
4. **Калибровка hub-классов.** Prior correction, temperature scaling или
|
|
||||||
пороги на OOF для Abigail/Alex; оптимизировать macro-F1 декодированием,
|
|
||||||
а не только обучением. Смотреть precision/recall по редким классам.
|
|
||||||
5. **Отчёты и статистика.** Заменить `final_rf` на реального лидера,
|
|
||||||
добавить Holm—Bonferroni для семейства парных сравнений, считать
|
|
||||||
иерархические интервалы (повтор × фолд), а не только repeat-0 bootstrap.
|
|
||||||
6. **Внешняя валидация.** Другой корпус, другая игра или хотя бы разбиение
|
|
||||||
по сценам/диалогам, а не по отдельным репликам. Только оно покажет,
|
|
||||||
переносится ли лексико-тематический сигнал за пределы этого корпуса.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. Ограничения
|
|
||||||
|
|
||||||
- Корпус 2005 реплик, 34 класса, минимум 15 реплик на класс. Доверительные
|
|
||||||
интервалы по редким персонажам останутся широкими даже при 10 повторах.
|
|
||||||
- Повторная CV с одними и теми же 2005 репликами не заменяет внешнюю
|
|
||||||
валидацию на новом корпусе.
|
|
||||||
- `content`-LSA может отражать тему (сезоны, подарки, работа), а не идиолект.
|
|
||||||
Поэтому его вклад нельзя интерпретировать как «стиль» без отдельного
|
|
||||||
контроля (например, обучения на тематически сбалансированных подвыборках).
|
|
||||||
- `verify` и `cluster` не имеют параметра `repeats`; для них меняется только
|
|
||||||
seed/разбиение, поэтому выводы по ним слабее, чем по CV.
|
|
||||||
- При интерпретации subgroup-метрик нужно помнить, что это F1 внутри группы
|
|
||||||
персонажей, а не качество предсказания самой группы.
|
|
||||||
407
lab1/TUNING_EXPERIMENTS.md
Normal file
407
lab1/TUNING_EXPERIMENTS.md
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
# Серия настройки (T1–T11)
|
||||||
|
|
||||||
|
Документ описывает **дополнительные** эксперименты поверх полной серии
|
||||||
|
`scripts/run_all_experiments.sh`. Они не заменяют протокол E0–E16 из
|
||||||
|
`EXPERIMENTS.md` и не повторяют его запуски с теми же параметрами.
|
||||||
|
|
||||||
|
Полная серия измеряет качество на **значениях по умолчанию**. Эта серия
|
||||||
|
проверяет, меняется ли macro-F1, если изменить регуляризацию, состав
|
||||||
|
признаков, n-граммы, веса блоков, число компонент LSA или гиперпараметры
|
||||||
|
деревьев.
|
||||||
|
|
||||||
|
Справочник «где в коде лежит параметр» — `TUNING.md`. Здесь — что запускать,
|
||||||
|
зачем и как интерпретировать.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Зачем эта серия
|
||||||
|
|
||||||
|
Исследовательский вопрос тот же: различимы ли 34 персонажа по одной реплике.
|
||||||
|
Базовый ответ даёт `stylometry_pos_lsa` + `logreg` из полной серии.
|
||||||
|
|
||||||
|
Дополнительно нужно понять:
|
||||||
|
|
||||||
|
- не слишком ли слабая или сильная регуляризация при 2005 объектах и 34 классах;
|
||||||
|
- не вредят ли нестабильные группы (`vocabulary`, `readability`) и признаки длины;
|
||||||
|
- не переобучаются ли широкие символьные n-граммы;
|
||||||
|
- не давит ли один блок признаков на остальные после L2-нормировки;
|
||||||
|
- не лучше ли другое число компонент LSA, чем `k=100`;
|
||||||
|
- не лучше ли более мелкие деревья, чем лес без ограничения глубины;
|
||||||
|
- даёт ли дельта Барроуза что-то на краях диапазона MFW (50 и 1000 слов).
|
||||||
|
|
||||||
|
Главная метрика по-прежнему **macro-F1** с бутстрэп-интервалом. Разница в
|
||||||
|
1–2 процентных пункта часто шум: сравнивайте запуски через `compare`
|
||||||
|
(Мак-Немар и бутстрэп-разница), а не «на глаз» по одному числу.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Что нельзя путать с полной серией
|
||||||
|
|
||||||
|
| Полная серия (`run_all_experiments.sh`) | Эта серия |
|
||||||
|
|---|---|
|
||||||
|
| Базовые пресеты, абляции leave-one-out, LSA 50/100/200, benchmark моделей, nested CV | Перебор **внутри** лучшего пресета |
|
||||||
|
| Logreg/SVM с `C=1`, `class_weight="balanced"` | Другие `C`, отключение весов классов |
|
||||||
|
| Char `[2,5]` / 5000, POS `[1,3]` / 500, `min_df=3` | Узкие и широкие n-граммы |
|
||||||
|
| Равные веса блоков | Заданные веса |
|
||||||
|
| Дельта 100/200/500 MFW | Дельта 50 и 1000 MFW |
|
||||||
|
| Extra trees нет | Один контролируемый запуск extra trees |
|
||||||
|
|
||||||
|
Не запускайте эту серию вместо E0–E16. Сначала нужна база: каталог
|
||||||
|
`results/stylometry_pos_lsa_logreg_<timestamp>/` с 5 повторами (или хотя бы 3).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Как запускать
|
||||||
|
|
||||||
|
Все команды — из каталога `lab1`. Схема CV та же, что в протоколе:
|
||||||
|
5 блоков, seed `42`. Для черновика достаточно 1 повтора, для отчёта — 3
|
||||||
|
(лучшие 1–2 конфигурации потом перепроверьте с 5).
|
||||||
|
|
||||||
|
### 3.1. Вся серия скриптом
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd lab1
|
||||||
|
bash scripts/run_tuning_experiments.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Быстрый прогон:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
REPEATS=1 bash scripts/run_tuning_experiments.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Другой интерпретатор:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
PYTHON=../.venv/bin/python bash scripts/run_tuning_experiments.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Лог: `results/logs/tune_<timestamp>.log`.
|
||||||
|
Каждый `run` создаёт **новый** каталог `results/<preset>_<model>_<timestamp>/`.
|
||||||
|
У двух запусков с одним пресетом имена отличаются только меткой времени;
|
||||||
|
какой это был вариант, смотрите в `run_metadata.json` (`model_params`,
|
||||||
|
`feature_config`).
|
||||||
|
|
||||||
|
### 3.2. Один эксперимент вручную
|
||||||
|
|
||||||
|
Конфиги лежат в `configs/tune_*.toml`. Каждый файл — **одна** точка перебора
|
||||||
|
признаков. Модель и пресет задаются в команде, не в имени файла.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run \
|
||||||
|
--config configs/tune_no_vocab_readability.toml \
|
||||||
|
--preset stylometry_pos_lsa \
|
||||||
|
--model logreg \
|
||||||
|
--repeats 3 \
|
||||||
|
--seed 42
|
||||||
|
```
|
||||||
|
|
||||||
|
Параметры классификатора toml не требуют — их передаёт `--model-params`.
|
||||||
|
|
||||||
|
### 3.3. Сравнение с базой
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli compare \
|
||||||
|
--run-a results/stylometry_pos_lsa_logreg_<база> \
|
||||||
|
--run-b results/stylometry_pos_lsa_logreg_<тюнинг>
|
||||||
|
```
|
||||||
|
|
||||||
|
Оба запуска должны иметь одинаковые `--folds` и `--seed`. Иначе парное
|
||||||
|
сравнение некорректно.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Конфиги признаков
|
||||||
|
|
||||||
|
Файлы не «включают серию целиком»: каждый подменяет только указанные поля
|
||||||
|
`FeatureConfig`. Остальное берётся из пресета `stylometry_pos_lsa`.
|
||||||
|
|
||||||
|
| Файл | Что меняет |
|
||||||
|
|---|---|
|
||||||
|
| `configs/tune_no_vocab_readability.toml` | группы без `vocabulary` и `readability` |
|
||||||
|
| `configs/tune_no_vocab_readability_length.toml` | ещё без `length` |
|
||||||
|
| `configs/tune_char_narrow.toml` | char `[2,4]`, 3000 признаков, POS 500, `min_df=5` |
|
||||||
|
| `configs/tune_char_wide.toml` | char `[2,6]`, 8000, POS `[1,4]` / 800, `min_df=2` |
|
||||||
|
| `configs/tune_block_weights.toml` | веса `stylo/char/pos/lsa_word/lsa_pos` |
|
||||||
|
| `configs/tune_lsa_k150.toml` | `lsa_components = 150` |
|
||||||
|
| `configs/tune_lsa_k300.toml` | `lsa_components = 300` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Эксперименты
|
||||||
|
|
||||||
|
Базовый пресет везде `stylometry_pos_lsa`, если не сказано иное.
|
||||||
|
Ориентир для сравнения — pooled macro-F1 базового logreg из полной серии.
|
||||||
|
|
||||||
|
### T1. Логистическая регрессия: `C`
|
||||||
|
|
||||||
|
**Зачем.** `C` — обратная сила L2-регуляризации. На широком признаковом
|
||||||
|
пространстве (ручные признаки + n-граммы + LSA) модель с `C=1` может
|
||||||
|
переобучаться или, наоборот, быть слишком простой. Нужно найти диапазон,
|
||||||
|
а не одно «магическое» число.
|
||||||
|
|
||||||
|
**Что меняется.** `C ∈ {0.03, 0.1, 0.3, 1, 3, 10}`. Остальное как в базе
|
||||||
|
(`class_weight="balanced"`). Значение `C=1` совпадает с полной серией;
|
||||||
|
его можно не гонять, если база уже есть.
|
||||||
|
|
||||||
|
**Как запускать.**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
for c in 0.03 0.1 0.3 1 3 10; do
|
||||||
|
python -m stylometry.cli run --preset stylometry_pos_lsa --model logreg \
|
||||||
|
--repeats 3 --seed 42 --model-params "{\"C\": $c}"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
**Как читать.** Меньше `C` — проще модель. Если macro-F1 растёт при уменьшении
|
||||||
|
`C`, база переобучалась. Если растёт только при `C ≥ 3`, регуляризации в базе
|
||||||
|
было слишком много. Смотрите также log loss: он показывает калибровку, не
|
||||||
|
только точность меток.
|
||||||
|
|
||||||
|
### T2. Линейный SVM: `C`
|
||||||
|
|
||||||
|
**Зачем.** Та же логика, другой критерий (зазор вместо логистической потери).
|
||||||
|
SVM в полной серии тоже шёл с `C=1`. Если лучший `C` у SVM и logreg близки,
|
||||||
|
вывод про регуляризацию устойчив.
|
||||||
|
|
||||||
|
**Как запускать.**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
for c in 0.03 0.1 0.3 1 3 10; do
|
||||||
|
python -m stylometry.cli run --preset stylometry_pos_lsa --model linear_svc \
|
||||||
|
--repeats 3 --seed 42 --model-params "{\"C\": $c}"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ограничение.** У `linear_svc` нет вероятностей: log loss не считается,
|
||||||
|
top-k строится по решающей функции.
|
||||||
|
|
||||||
|
### T3. Logreg без балансировки классов
|
||||||
|
|
||||||
|
**Зачем.** В корпусе 15–139 реплик на персонажа. `class_weight="balanced"`
|
||||||
|
почти наверняка нужен, но это надо показать: иначе macro-F1 может казаться
|
||||||
|
низким «из-за модели», хотя виноват сдвиг к частым классам (Abigail и т.д.).
|
||||||
|
|
||||||
|
**Как запускать.**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run --preset stylometry_pos_lsa --model logreg \
|
||||||
|
--repeats 3 --seed 42 --model-params '{"class_weight": null}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Как читать.** Если accuracy почти не падает, а macro-F1 и balanced accuracy
|
||||||
|
падают, модель без весов игнорирует редких персонажей. Это аргумент в пользу
|
||||||
|
macro-F1 как основной метрики.
|
||||||
|
|
||||||
|
### T4. Без `vocabulary` и `readability`
|
||||||
|
|
||||||
|
**Зачем.** На репликах ~19 слов TTR, индексы Honore/Yule и формулы читаемости
|
||||||
|
нестабильны (`FEATURES.md`, гипотеза H2). Полная серия делает leave-one-out
|
||||||
|
(`ablate`): удаляет **по одной** группе. Здесь обе шумные группы снимаются
|
||||||
|
сразу — ближе к тому, как собирали бы «очищенный» основной набор.
|
||||||
|
|
||||||
|
**Конфиг.** `configs/tune_no_vocab_readability.toml`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run --config configs/tune_no_vocab_readability.toml \
|
||||||
|
--preset stylometry_pos_lsa --model logreg --repeats 3 --seed 42
|
||||||
|
```
|
||||||
|
|
||||||
|
**Как читать.** Рост или отсутствие падения macro-F1 значит, что эти группы
|
||||||
|
не несут устойчивого сигнала (или мешают). Сильное падение — в протоколе их
|
||||||
|
нельзя вычёркивать без оговорки.
|
||||||
|
|
||||||
|
### T5. Ещё без `length`
|
||||||
|
|
||||||
|
**Зачем.** Гипотеза H4: длинные реплики классифицируются лучше. Если качество
|
||||||
|
не падает после удаления length-признаков, различимость персонажей не сводится
|
||||||
|
к «кто говорит длиннее». Если падает — часть результата объясняется длиной,
|
||||||
|
это нужно явно написать в отчёте.
|
||||||
|
|
||||||
|
**Конфиг.** `configs/tune_no_vocab_readability_length.toml`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run --config configs/tune_no_vocab_readability_length.toml \
|
||||||
|
--preset stylometry_pos_lsa --model logreg --repeats 3 --seed 42
|
||||||
|
```
|
||||||
|
|
||||||
|
Имеет смысл сопоставить с `length-report` по базовому запуску.
|
||||||
|
|
||||||
|
### T6. Символьные и POS n-граммы: узкие vs широкие
|
||||||
|
|
||||||
|
**Зачем.** В полной серии фиксированы char 2–5 / 5000 и POS 1–3 / 500.
|
||||||
|
Узкий вариант (короче n-граммы, выше `min_df`) проверяет переобучение на
|
||||||
|
редких орфографических шаблонах. Широкий (2–6, больше признаков, `min_df=2`)
|
||||||
|
проверяет, не теряем ли морфологию и пунктуационные привычки.
|
||||||
|
|
||||||
|
**Конфиги.** `tune_char_narrow.toml`, `tune_char_wide.toml`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run --config configs/tune_char_narrow.toml \
|
||||||
|
--preset stylometry_pos_lsa --model logreg --repeats 3 --seed 42
|
||||||
|
|
||||||
|
python -m stylometry.cli run --config configs/tune_char_wide.toml \
|
||||||
|
--preset stylometry_pos_lsa --model logreg --repeats 3 --seed 42
|
||||||
|
```
|
||||||
|
|
||||||
|
**Как читать.** Если wide лучше на обучении блоков, но pooled macro-F1 не выше
|
||||||
|
базы (или хуже на редких классах) — переобучение. Если narrow не хуже базы —
|
||||||
|
лишняя размерность не нужна.
|
||||||
|
|
||||||
|
### T7. Веса блоков
|
||||||
|
|
||||||
|
**Зачем.** После L2-нормировки каждый блок имеет единичную норму и конкурирует
|
||||||
|
наравне, даже если один из них шумный. В базе веса равны. Здесь ослабляются
|
||||||
|
char и особенно `lsa_word` (тематический риск, гипотеза H3), POS и стилометрия
|
||||||
|
остаются сильнее.
|
||||||
|
|
||||||
|
**Конфиг.** `configs/tune_block_weights.toml`
|
||||||
|
|
||||||
|
```text
|
||||||
|
stylo = 1.0
|
||||||
|
char = 0.5
|
||||||
|
pos = 0.7
|
||||||
|
lsa_word = 0.3
|
||||||
|
lsa_pos = 0.5
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run --config configs/tune_block_weights.toml \
|
||||||
|
--preset stylometry_pos_lsa --model logreg --repeats 3 --seed 42
|
||||||
|
```
|
||||||
|
|
||||||
|
**Как читать.** Веса — такой же гиперпараметр, как `C`. Один удачный набор не
|
||||||
|
доказывает оптимум. Если macro-F1 вырос и `lsa_word` при этом ослаблен, это
|
||||||
|
дополнительный довод, что тема мешала стилю.
|
||||||
|
|
||||||
|
### T8. Число компонент LSA: 150 и 300
|
||||||
|
|
||||||
|
**Зачем.** В полной серии `lsa-sweep` смотрит `k ∈ {50, 100, 200}` по
|
||||||
|
**отдельным** вариантам LSA. В основном пресете всегда `k=100` сразу для
|
||||||
|
`word` и `pos`. Здесь проверяется, помогает ли больше компонент **в
|
||||||
|
объединённом** наборе, плюс недостающие точки 150 и 300 в переборе вариантов.
|
||||||
|
|
||||||
|
**Конфиги.** `tune_lsa_k150.toml`, `tune_lsa_k300.toml`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run --config configs/tune_lsa_k150.toml \
|
||||||
|
--preset stylometry_pos_lsa --model logreg --repeats 3 --seed 42
|
||||||
|
|
||||||
|
python -m stylometry.cli run --config configs/tune_lsa_k300.toml \
|
||||||
|
--preset stylometry_pos_lsa --model logreg --repeats 3 --seed 42
|
||||||
|
|
||||||
|
python -m stylometry.cli lsa-sweep \
|
||||||
|
--variants word,content,fw,char,pos \
|
||||||
|
--components 150,300 \
|
||||||
|
--model logreg --repeats 1 --seed 42
|
||||||
|
```
|
||||||
|
|
||||||
|
**Как читать.** Рост `k` без роста macro-F1 — лишние компоненты ловят шум.
|
||||||
|
Сравнивайте `word`/`content` с `pos`/`fw`: если выигрыш только у word-LSA,
|
||||||
|
это снова тема, а не стиль.
|
||||||
|
|
||||||
|
### T9. Случайный лес: глубина и лист
|
||||||
|
|
||||||
|
**Зачем.** В `benchmark` лес идёт с дефолтами (`n_estimators=400`,
|
||||||
|
`max_depth=None`, `min_samples_leaf=1`). На 2005×34 такая модель легко
|
||||||
|
запоминает обучающие блоки. Сначала ограничивают глубину и увеличивают лист,
|
||||||
|
а не число деревьев.
|
||||||
|
|
||||||
|
**Как запускать.**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
for depth in 10 20 30; do
|
||||||
|
for leaf in 2 3 5; do
|
||||||
|
python -m stylometry.cli run --preset stylometry_pos_lsa --model random_forest \
|
||||||
|
--repeats 3 --seed 42 \
|
||||||
|
--model-params "{\"max_depth\": $depth, \"min_samples_leaf\": $leaf}"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
python -m stylometry.cli run --preset stylometry_pos_lsa --model random_forest \
|
||||||
|
--repeats 3 --seed 42 \
|
||||||
|
--model-params '{"max_depth": 20, "min_samples_leaf": 3, "max_features": 0.1}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Как читать.** Если мелкие деревья не хуже (или лучше) дефолтного леса из
|
||||||
|
benchmark, сложность в базе была лишней. Сравнивайте с logreg, а не только
|
||||||
|
друг с другом: лес может выигрывать accuracy и проигрывать macro-F1.
|
||||||
|
|
||||||
|
### T10. Сверхслучайные деревья
|
||||||
|
|
||||||
|
**Зачем.** Extra trees не входили в `benchmark` полной серии. Случайные пороги
|
||||||
|
обычно снижают дисперсию относительно RF. Один контролируемый запуск
|
||||||
|
(не полный перебор) проверяет, есть ли смысл включать модель в сравнение.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run --preset stylometry_pos_lsa --model extra_trees \
|
||||||
|
--repeats 3 --seed 42 \
|
||||||
|
--model-params '{"max_depth": 20, "min_samples_leaf": 3}'
|
||||||
|
```
|
||||||
|
|
||||||
|
Если результат заметно хуже logreg, модель достаточно упомянуть как проверку,
|
||||||
|
не раздувая сетку.
|
||||||
|
|
||||||
|
### T11. Дельта Барроуза: 50 и 1000 MFW
|
||||||
|
|
||||||
|
**Зачем.** Классическая стилометрия на самых частотных словах. Полная серия
|
||||||
|
уже смотрит 100/200/500. Края диапазона: 50 слов — очень компактный профиль,
|
||||||
|
1000 — больше лексики и больше темы. На коротких репликах дельта обычно
|
||||||
|
слабее ML; это независимая нижняя граница, не конкурент основному пресету.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli delta \
|
||||||
|
--features 50,1000 --metrics manhattan,cosine --repeats 2 --seed 42
|
||||||
|
```
|
||||||
|
|
||||||
|
`zscore` в CLI не переключается (в коде по умолчанию включён), поэтому его
|
||||||
|
здесь нет.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Рекомендуемый порядок, если запускаете вручную
|
||||||
|
|
||||||
|
Не гоните все циклы сразу, если времени мало. Порядок совпадает с `TUNING.md`:
|
||||||
|
|
||||||
|
1. T4, T5 — состав групп (дешево и часто полезно).
|
||||||
|
2. T6 — n-граммы.
|
||||||
|
3. T8 — `k` LSA в объединённом наборе.
|
||||||
|
4. T7 — веса, если после T4–T6 остался шумный блок.
|
||||||
|
5. T1, затем T2 — `C`.
|
||||||
|
6. T3 — один раз, для отчёта про дисбаланс.
|
||||||
|
7. T9, T10 — только если линейные модели уже сняты.
|
||||||
|
8. T11 — короткая классическая проверка.
|
||||||
|
|
||||||
|
После отбора 1–2 лучших конфигураций:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m stylometry.cli run --preset stylometry_pos_lsa --model logreg \
|
||||||
|
--repeats 5 --seed 42 --nested
|
||||||
|
```
|
||||||
|
|
||||||
|
Вложенная CV с расширенной сеткой честнее, чем выбор `C` по тем же OOF,
|
||||||
|
что потом публикуете. Узкая сетка `{0.1, 1, 10}` уже есть в полной серии;
|
||||||
|
имеет смысл `--nested` только если T1 сдвинул разумный диапазон (например,
|
||||||
|
к `{0.03, 0.1, 0.3}`). Для этого нужно изменить `PARAM_GRIDS` в
|
||||||
|
`stylometry/pipelines.py` — это уже правка кода, не конфиг.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Как фиксировать и чего не делать
|
||||||
|
|
||||||
|
Для каждого запуска сохраняются стандартные файлы: `run_metadata.json`,
|
||||||
|
`pooled_metrics.csv`, `bootstrap_ci.json`, `per_class_report.csv`,
|
||||||
|
матрица ошибок. Перед сравнением откройте `run_metadata.json` и убедитесь,
|
||||||
|
что отличаются только задуманные поля.
|
||||||
|
|
||||||
|
Нельзя:
|
||||||
|
|
||||||
|
- выбирать победителя по тестовой выборке вне CV;
|
||||||
|
- менять `--folds` или `--seed` «чтобы стало лучше»;
|
||||||
|
- сравнивать `QUICK=1` / `REPEATS=1` с финальными 5 повторами как равные;
|
||||||
|
- объявлять улучшение без интервала и `compare`;
|
||||||
|
- подменять macro-F1 долей правильных ответов.
|
||||||
|
|
||||||
|
Ограничения корпуса те же, что в `EXPERIMENTS.md`: короткие реплики, один
|
||||||
|
автор, ручная фильтрация, дисбаланс 15–139. Настройка модели эти ограничения
|
||||||
|
не снимает.
|
||||||
13
lab1/configs/tune_block_weights.toml
Normal file
13
lab1/configs/tune_block_weights.toml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Ослабить потенциально шумные блоки после L2-нормировки.
|
||||||
|
|
||||||
|
[cv]
|
||||||
|
folds = 5
|
||||||
|
repeats = 3
|
||||||
|
seed = 42
|
||||||
|
|
||||||
|
[features.block_weights]
|
||||||
|
stylo = 1.0
|
||||||
|
char = 0.5
|
||||||
|
pos = 0.7
|
||||||
|
lsa_word = 0.3
|
||||||
|
lsa_pos = 0.5
|
||||||
13
lab1/configs/tune_char_narrow.toml
Normal file
13
lab1/configs/tune_char_narrow.toml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Более короткие char n-граммы, меньше признаков, строже min_df.
|
||||||
|
|
||||||
|
[cv]
|
||||||
|
folds = 5
|
||||||
|
repeats = 3
|
||||||
|
seed = 42
|
||||||
|
|
||||||
|
[features]
|
||||||
|
char_ngram_range = [2, 4]
|
||||||
|
char_max_features = 3000
|
||||||
|
pos_ngram_range = [1, 3]
|
||||||
|
pos_max_features = 500
|
||||||
|
min_df = 5
|
||||||
13
lab1/configs/tune_char_wide.toml
Normal file
13
lab1/configs/tune_char_wide.toml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Более длинные n-граммы и больше признаков: риск переобучения.
|
||||||
|
|
||||||
|
[cv]
|
||||||
|
folds = 5
|
||||||
|
repeats = 3
|
||||||
|
seed = 42
|
||||||
|
|
||||||
|
[features]
|
||||||
|
char_ngram_range = [2, 6]
|
||||||
|
char_max_features = 8000
|
||||||
|
pos_ngram_range = [1, 4]
|
||||||
|
pos_max_features = 800
|
||||||
|
min_df = 2
|
||||||
7
lab1/configs/tune_lsa_k150.toml
Normal file
7
lab1/configs/tune_lsa_k150.toml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[cv]
|
||||||
|
folds = 5
|
||||||
|
repeats = 3
|
||||||
|
seed = 42
|
||||||
|
|
||||||
|
[features]
|
||||||
|
lsa_components = 150
|
||||||
7
lab1/configs/tune_lsa_k300.toml
Normal file
7
lab1/configs/tune_lsa_k300.toml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[cv]
|
||||||
|
folds = 5
|
||||||
|
repeats = 3
|
||||||
|
seed = 42
|
||||||
|
|
||||||
|
[features]
|
||||||
|
lsa_components = 300
|
||||||
20
lab1/configs/tune_no_vocab_readability.toml
Normal file
20
lab1/configs/tune_no_vocab_readability.toml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Без нестабильных групп на коротких репликах.
|
||||||
|
# Остальные поля пресета (n-граммы, LSA) не переопределяются.
|
||||||
|
|
||||||
|
[cv]
|
||||||
|
folds = 5
|
||||||
|
repeats = 3
|
||||||
|
seed = 42
|
||||||
|
|
||||||
|
[features]
|
||||||
|
groups = [
|
||||||
|
"length",
|
||||||
|
"lexical",
|
||||||
|
"characters",
|
||||||
|
"punctuation",
|
||||||
|
"function_words",
|
||||||
|
"pronouns",
|
||||||
|
"pos",
|
||||||
|
"syntax",
|
||||||
|
"dialogue",
|
||||||
|
]
|
||||||
18
lab1/configs/tune_no_vocab_readability_length.toml
Normal file
18
lab1/configs/tune_no_vocab_readability_length.toml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# То же + без length: проверка, не объясняется ли сигнал длиной реплики.
|
||||||
|
|
||||||
|
[cv]
|
||||||
|
folds = 5
|
||||||
|
repeats = 3
|
||||||
|
seed = 42
|
||||||
|
|
||||||
|
[features]
|
||||||
|
groups = [
|
||||||
|
"lexical",
|
||||||
|
"characters",
|
||||||
|
"punctuation",
|
||||||
|
"function_words",
|
||||||
|
"pronouns",
|
||||||
|
"pos",
|
||||||
|
"syntax",
|
||||||
|
"dialogue",
|
||||||
|
]
|
||||||
@@ -1 +0,0 @@
|
|||||||
fac6cd6286209a20afa732dd8da257fe39208e00cdc8542e73496800ca0aff5e /home/folen/Homework/NLP/lab1/exports/nlp_lab1_results_20261025_173103.tar.gz
|
|
||||||
@@ -1,254 +0,0 @@
|
|||||||
Дата: Вс 25 окт 2026 17:31:03 MSK
|
|
||||||
Каталог: /home/folen/Homework/NLP/lab1
|
|
||||||
Интерпретатор: python
|
|
||||||
|
|
||||||
=== Проверка окружения ===
|
|
||||||
Python: 3.11.2 (/home/folen/Homework/NLP/.venv/bin/python)
|
|
||||||
Каталог проекта: /home/folen/Homework/NLP/lab1
|
|
||||||
Версии библиотек:
|
|
||||||
numpy: 2.4.6
|
|
||||||
pandas: 3.1.0
|
|
||||||
scipy: 1.17.1
|
|
||||||
sklearn: 1.9.1
|
|
||||||
nltk: 3.10.4
|
|
||||||
matplotlib: 3.11.2
|
|
||||||
Корпус:
|
|
||||||
файл: /home/folen/Homework/NLP/lab1/data/dialogues.csv
|
|
||||||
SHA-256: 8946f08159daddb9d89c9d323205d4a7fb4bc617d16e300ff6c7606cb05030f7
|
|
||||||
реплик: 2005
|
|
||||||
персонажей: 34
|
|
||||||
словоупотреблений: 38207
|
|
||||||
NLTK:
|
|
||||||
токенизатор: NLTK
|
|
||||||
POS-теггер: доступен
|
|
||||||
пример токенов: ['Oh', ',', 'that', "'s", 'right', '...', 'I', 'heard']
|
|
||||||
пример POS: ['INTJ', 'PUNCT', 'DET', 'AUX', 'ADJ', 'PUNCT', 'PRON', 'VERB']
|
|
||||||
|
|
||||||
Окружение готово.
|
|
||||||
{"versions": {"numpy": "2.4.6", "pandas": "3.1.0", "scipy": "1.17.1", "sklearn": "1.9.1", "nltk": "3.10.4", "matplotlib": "3.11.2"}, "n_lines": 2005}
|
|
||||||
|
|
||||||
Git commit: 10e2444d2342e2d02c94a06de884ad7bbee83bca
|
|
||||||
|
|
||||||
Содержимое results:
|
|
||||||
results/ablation_stylometry_pos_lsa_20261025_170116/ablation.csv
|
|
||||||
results/benchmark_stylometry_pos_lsa_20261025_165348/summary.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/bootstrap_ci.json
|
|
||||||
results/char_multinomial_nb_20261025_155832/confusion_matrix.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/confusion_matrix_normalized.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/fold_metrics.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/fold_summary.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/oof_predictions.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/per_class_report.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/pooled_metrics.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/run_metadata.json
|
|
||||||
results/char_multinomial_nb_20261025_155832/summary.md
|
|
||||||
results/char_multinomial_nb_20261025_155832/top_confusions.csv
|
|
||||||
results/clustering_stylometry_pos_lsa_20261025_172241/character_centroids.csv
|
|
||||||
results/clustering_stylometry_pos_lsa_20261025_172241/clustering_metrics.csv
|
|
||||||
results/delta_20261025_172113/delta_sweep.csv
|
|
||||||
results/fw_logreg_20261025_160058/bootstrap_ci.json
|
|
||||||
results/fw_logreg_20261025_160058/confusion_matrix.csv
|
|
||||||
results/fw_logreg_20261025_160058/confusion_matrix_normalized.csv
|
|
||||||
results/fw_logreg_20261025_160058/fold_metrics.csv
|
|
||||||
results/fw_logreg_20261025_160058/fold_summary.csv
|
|
||||||
results/fw_logreg_20261025_160058/oof_predictions.csv
|
|
||||||
results/fw_logreg_20261025_160058/per_class_report.csv
|
|
||||||
results/fw_logreg_20261025_160058/pooled_metrics.csv
|
|
||||||
results/fw_logreg_20261025_160058/run_metadata.json
|
|
||||||
results/fw_logreg_20261025_160058/summary.md
|
|
||||||
results/fw_logreg_20261025_160058/top_confusions.csv
|
|
||||||
results/length_dummy_20261025_155747/bootstrap_ci.json
|
|
||||||
results/length_dummy_20261025_155747/confusion_matrix.csv
|
|
||||||
results/length_dummy_20261025_155747/confusion_matrix_normalized.csv
|
|
||||||
results/length_dummy_20261025_155747/fold_metrics.csv
|
|
||||||
results/length_dummy_20261025_155747/fold_summary.csv
|
|
||||||
results/length_dummy_20261025_155747/oof_predictions.csv
|
|
||||||
results/length_dummy_20261025_155747/per_class_report.csv
|
|
||||||
results/length_dummy_20261025_155747/pooled_metrics.csv
|
|
||||||
results/length_dummy_20261025_155747/run_metadata.json
|
|
||||||
results/length_dummy_20261025_155747/summary.md
|
|
||||||
results/length_dummy_20261025_155747/top_confusions.csv
|
|
||||||
results/length_logreg_20261025_155719/bootstrap_ci.json
|
|
||||||
results/length_logreg_20261025_155719/confusion_matrix.csv
|
|
||||||
results/length_logreg_20261025_155719/confusion_matrix_normalized.csv
|
|
||||||
results/length_logreg_20261025_155719/fold_metrics.csv
|
|
||||||
results/length_logreg_20261025_155719/fold_summary.csv
|
|
||||||
results/length_logreg_20261025_155719/oof_predictions.csv
|
|
||||||
results/length_logreg_20261025_155719/per_class_report.csv
|
|
||||||
results/length_logreg_20261025_155719/pooled_metrics.csv
|
|
||||||
results/length_logreg_20261025_155719/run_metadata.json
|
|
||||||
results/length_logreg_20261025_155719/summary.md
|
|
||||||
results/length_logreg_20261025_155719/top_confusions.csv
|
|
||||||
results/length_logreg_20261025_155813/bootstrap_ci.json
|
|
||||||
results/length_logreg_20261025_155813/confusion_matrix.csv
|
|
||||||
results/length_logreg_20261025_155813/confusion_matrix_normalized.csv
|
|
||||||
results/length_logreg_20261025_155813/fold_metrics.csv
|
|
||||||
results/length_logreg_20261025_155813/fold_summary.csv
|
|
||||||
results/length_logreg_20261025_155813/oof_predictions.csv
|
|
||||||
results/length_logreg_20261025_155813/per_class_report.csv
|
|
||||||
results/length_logreg_20261025_155813/pooled_metrics.csv
|
|
||||||
results/length_logreg_20261025_155813/run_metadata.json
|
|
||||||
results/length_logreg_20261025_155813/summary.md
|
|
||||||
results/length_logreg_20261025_155813/top_confusions.csv
|
|
||||||
results/logs/run_all_20261025_150915.log
|
|
||||||
results/logs/run_all_20261025_151312.log
|
|
||||||
results/logs/run_all_20261025_152356.log
|
|
||||||
results/logs/run_all_20261025_155738.log
|
|
||||||
results/lsa_char_logreg_20261025_164836/bootstrap_ci.json
|
|
||||||
results/lsa_char_logreg_20261025_164836/confusion_matrix.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/fold_metrics.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/fold_summary.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/oof_predictions.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/per_class_report.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/pooled_metrics.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/run_metadata.json
|
|
||||||
results/lsa_char_logreg_20261025_164836/summary.md
|
|
||||||
results/lsa_char_logreg_20261025_164836/top_confusions.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/bootstrap_ci.json
|
|
||||||
results/lsa_content_logreg_20261025_164717/confusion_matrix.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/fold_metrics.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/fold_summary.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/oof_predictions.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/per_class_report.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/pooled_metrics.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/run_metadata.json
|
|
||||||
results/lsa_content_logreg_20261025_164717/summary.md
|
|
||||||
results/lsa_content_logreg_20261025_164717/top_confusions.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/bootstrap_ci.json
|
|
||||||
results/lsa_fw_logreg_20261025_164750/confusion_matrix.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/fold_metrics.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/fold_summary.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/oof_predictions.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/per_class_report.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/pooled_metrics.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/run_metadata.json
|
|
||||||
results/lsa_fw_logreg_20261025_164750/summary.md
|
|
||||||
results/lsa_fw_logreg_20261025_164750/top_confusions.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/bootstrap_ci.json
|
|
||||||
results/lsa_pos_logreg_20261025_164912/confusion_matrix.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/fold_metrics.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/fold_summary.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/oof_predictions.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/per_class_report.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/pooled_metrics.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/run_metadata.json
|
|
||||||
results/lsa_pos_logreg_20261025_164912/summary.md
|
|
||||||
results/lsa_pos_logreg_20261025_164912/top_confusions.csv
|
|
||||||
results/lsa_sweep_20261025_164924/lsa_sweep.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/bootstrap_ci.json
|
|
||||||
results/lsa_word2_logreg_20261025_164641/confusion_matrix.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/fold_metrics.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/fold_summary.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/oof_predictions.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/per_class_report.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/pooled_metrics.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/run_metadata.json
|
|
||||||
results/lsa_word2_logreg_20261025_164641/summary.md
|
|
||||||
results/lsa_word2_logreg_20261025_164641/top_confusions.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/bootstrap_ci.json
|
|
||||||
results/lsa_word_logreg_20261025_164608/confusion_matrix.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/fold_metrics.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/fold_summary.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/oof_predictions.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/per_class_report.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/pooled_metrics.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/run_metadata.json
|
|
||||||
results/lsa_word_logreg_20261025_164608/summary.md
|
|
||||||
results/lsa_word_logreg_20261025_164608/top_confusions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/best_params.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/bootstrap_ci.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/confusion_matrix.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/confusion_matrix_normalized.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/fold_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/fold_summary.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/oof_predictions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/per_class_report.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/pooled_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/run_metadata.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/summary.md
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/top_confusions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/best_params.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/bootstrap_ci.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/confusion_matrix.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/confusion_matrix_normalized.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/fold_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/fold_summary.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/oof_predictions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/per_class_report.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/pooled_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/run_metadata.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/summary.md
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/top_confusions.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/bootstrap_ci.json
|
|
||||||
results/pos_multinomial_nb_20261025_155848/confusion_matrix.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/confusion_matrix_normalized.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/fold_metrics.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/fold_summary.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/oof_predictions.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/per_class_report.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/pooled_metrics.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/run_metadata.json
|
|
||||||
results/pos_multinomial_nb_20261025_155848/summary.md
|
|
||||||
results/pos_multinomial_nb_20261025_155848/top_confusions.csv
|
|
||||||
results/README.md
|
|
||||||
results/stylometry_linear_svc_20261025_164018/bootstrap_ci.json
|
|
||||||
results/stylometry_linear_svc_20261025_164018/confusion_matrix.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/fold_metrics.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/fold_summary.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/oof_predictions.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/per_class_report.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/pooled_metrics.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/run_metadata.json
|
|
||||||
results/stylometry_linear_svc_20261025_164018/summary.md
|
|
||||||
results/stylometry_linear_svc_20261025_164018/top_confusions.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/bootstrap_ci.json
|
|
||||||
results/stylometry_logreg_20261025_160722/confusion_matrix.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/fold_metrics.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/fold_summary.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/oof_predictions.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/per_class_report.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/pooled_metrics.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/run_metadata.json
|
|
||||||
results/stylometry_logreg_20261025_160722/summary.md
|
|
||||||
results/stylometry_logreg_20261025_160722/top_confusions.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/fold_metrics.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/fold_summary.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/oof_predictions.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/per_class_report.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/run_metadata.json
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/summary.md
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/comparison_main_vs_pos.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/length_bins.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_age_group_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_age_group_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_gender_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_gender_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_species_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_species_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/top_confusions.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/fold_metrics.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/pair_scores.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/summary.json
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
866cbec84ad3c79cdf7cdee14a534d736894037f68af88e4629262a5821cbefb /home/folen/Homework/NLP/lab1/exports/nlp_lab1_results_20261025_192444.tar.gz
|
|
||||||
@@ -1,486 +0,0 @@
|
|||||||
Дата: Вс 25 окт 2026 19:24:44 MSK
|
|
||||||
Каталог: /home/folen/Homework/NLP/lab1
|
|
||||||
Интерпретатор: python
|
|
||||||
|
|
||||||
=== Проверка окружения ===
|
|
||||||
Python: 3.11.2 (/home/folen/Homework/NLP/.venv/bin/python)
|
|
||||||
Каталог проекта: /home/folen/Homework/NLP/lab1
|
|
||||||
Версии библиотек:
|
|
||||||
numpy: 2.4.6
|
|
||||||
pandas: 3.1.0
|
|
||||||
scipy: 1.17.1
|
|
||||||
sklearn: 1.9.1
|
|
||||||
nltk: 3.10.4
|
|
||||||
matplotlib: 3.11.2
|
|
||||||
Корпус:
|
|
||||||
файл: /home/folen/Homework/NLP/lab1/data/dialogues.csv
|
|
||||||
SHA-256: 8946f08159daddb9d89c9d323205d4a7fb4bc617d16e300ff6c7606cb05030f7
|
|
||||||
реплик: 2005
|
|
||||||
персонажей: 34
|
|
||||||
словоупотреблений: 38207
|
|
||||||
NLTK:
|
|
||||||
токенизатор: NLTK
|
|
||||||
POS-теггер: доступен
|
|
||||||
пример токенов: ['Oh', ',', 'that', "'s", 'right', '...', 'I', 'heard']
|
|
||||||
пример POS: ['INTJ', 'PUNCT', 'DET', 'AUX', 'ADJ', 'PUNCT', 'PRON', 'VERB']
|
|
||||||
|
|
||||||
Окружение готово.
|
|
||||||
{"versions": {"numpy": "2.4.6", "pandas": "3.1.0", "scipy": "1.17.1", "sklearn": "1.9.1", "nltk": "3.10.4", "matplotlib": "3.11.2"}, "n_lines": 2005}
|
|
||||||
|
|
||||||
Git commit: 5a4a19e0df4cae19348ac76d242afb451d8e6aa0
|
|
||||||
|
|
||||||
Содержимое results:
|
|
||||||
results/ablation_stylometry_pos_lsa_20261025_170116/ablation.csv
|
|
||||||
results/benchmark_stylometry_pos_lsa_20261025_165348/summary.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/bootstrap_ci.json
|
|
||||||
results/char_multinomial_nb_20261025_155832/confusion_matrix.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/confusion_matrix_normalized.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/fold_metrics.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/fold_summary.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/oof_predictions.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/per_class_report.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/pooled_metrics.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/run_metadata.json
|
|
||||||
results/char_multinomial_nb_20261025_155832/summary.md
|
|
||||||
results/char_multinomial_nb_20261025_155832/top_confusions.csv
|
|
||||||
results/clustering_stylometry_pos_lsa_20261025_172241/character_centroids.csv
|
|
||||||
results/clustering_stylometry_pos_lsa_20261025_172241/clustering_metrics.csv
|
|
||||||
results/delta_20261025_172113/delta_sweep.csv
|
|
||||||
results/fw_logreg_20261025_160058/bootstrap_ci.json
|
|
||||||
results/fw_logreg_20261025_160058/confusion_matrix.csv
|
|
||||||
results/fw_logreg_20261025_160058/confusion_matrix_normalized.csv
|
|
||||||
results/fw_logreg_20261025_160058/fold_metrics.csv
|
|
||||||
results/fw_logreg_20261025_160058/fold_summary.csv
|
|
||||||
results/fw_logreg_20261025_160058/oof_predictions.csv
|
|
||||||
results/fw_logreg_20261025_160058/per_class_report.csv
|
|
||||||
results/fw_logreg_20261025_160058/pooled_metrics.csv
|
|
||||||
results/fw_logreg_20261025_160058/run_metadata.json
|
|
||||||
results/fw_logreg_20261025_160058/summary.md
|
|
||||||
results/fw_logreg_20261025_160058/top_confusions.csv
|
|
||||||
results/length_dummy_20261025_155747/bootstrap_ci.json
|
|
||||||
results/length_dummy_20261025_155747/confusion_matrix.csv
|
|
||||||
results/length_dummy_20261025_155747/confusion_matrix_normalized.csv
|
|
||||||
results/length_dummy_20261025_155747/fold_metrics.csv
|
|
||||||
results/length_dummy_20261025_155747/fold_summary.csv
|
|
||||||
results/length_dummy_20261025_155747/oof_predictions.csv
|
|
||||||
results/length_dummy_20261025_155747/per_class_report.csv
|
|
||||||
results/length_dummy_20261025_155747/pooled_metrics.csv
|
|
||||||
results/length_dummy_20261025_155747/run_metadata.json
|
|
||||||
results/length_dummy_20261025_155747/summary.md
|
|
||||||
results/length_dummy_20261025_155747/top_confusions.csv
|
|
||||||
results/length_logreg_20261025_155719/bootstrap_ci.json
|
|
||||||
results/length_logreg_20261025_155719/confusion_matrix.csv
|
|
||||||
results/length_logreg_20261025_155719/confusion_matrix_normalized.csv
|
|
||||||
results/length_logreg_20261025_155719/fold_metrics.csv
|
|
||||||
results/length_logreg_20261025_155719/fold_summary.csv
|
|
||||||
results/length_logreg_20261025_155719/oof_predictions.csv
|
|
||||||
results/length_logreg_20261025_155719/per_class_report.csv
|
|
||||||
results/length_logreg_20261025_155719/pooled_metrics.csv
|
|
||||||
results/length_logreg_20261025_155719/run_metadata.json
|
|
||||||
results/length_logreg_20261025_155719/summary.md
|
|
||||||
results/length_logreg_20261025_155719/top_confusions.csv
|
|
||||||
results/length_logreg_20261025_155813/bootstrap_ci.json
|
|
||||||
results/length_logreg_20261025_155813/confusion_matrix.csv
|
|
||||||
results/length_logreg_20261025_155813/confusion_matrix_normalized.csv
|
|
||||||
results/length_logreg_20261025_155813/fold_metrics.csv
|
|
||||||
results/length_logreg_20261025_155813/fold_summary.csv
|
|
||||||
results/length_logreg_20261025_155813/oof_predictions.csv
|
|
||||||
results/length_logreg_20261025_155813/per_class_report.csv
|
|
||||||
results/length_logreg_20261025_155813/pooled_metrics.csv
|
|
||||||
results/length_logreg_20261025_155813/run_metadata.json
|
|
||||||
results/length_logreg_20261025_155813/summary.md
|
|
||||||
results/length_logreg_20261025_155813/top_confusions.csv
|
|
||||||
results/logs/run_all_20261025_150915.log
|
|
||||||
results/logs/run_all_20261025_151312.log
|
|
||||||
results/logs/run_all_20261025_152356.log
|
|
||||||
results/logs/run_all_20261025_155738.log
|
|
||||||
results/lsa_char_logreg_20261025_164836/bootstrap_ci.json
|
|
||||||
results/lsa_char_logreg_20261025_164836/confusion_matrix.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/fold_metrics.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/fold_summary.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/oof_predictions.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/per_class_report.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/pooled_metrics.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/run_metadata.json
|
|
||||||
results/lsa_char_logreg_20261025_164836/summary.md
|
|
||||||
results/lsa_char_logreg_20261025_164836/top_confusions.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/bootstrap_ci.json
|
|
||||||
results/lsa_content_logreg_20261025_164717/confusion_matrix.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/fold_metrics.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/fold_summary.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/oof_predictions.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/per_class_report.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/pooled_metrics.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/run_metadata.json
|
|
||||||
results/lsa_content_logreg_20261025_164717/summary.md
|
|
||||||
results/lsa_content_logreg_20261025_164717/top_confusions.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/bootstrap_ci.json
|
|
||||||
results/lsa_fw_logreg_20261025_164750/confusion_matrix.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/fold_metrics.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/fold_summary.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/oof_predictions.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/per_class_report.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/pooled_metrics.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/run_metadata.json
|
|
||||||
results/lsa_fw_logreg_20261025_164750/summary.md
|
|
||||||
results/lsa_fw_logreg_20261025_164750/top_confusions.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/bootstrap_ci.json
|
|
||||||
results/lsa_pos_logreg_20261025_164912/confusion_matrix.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/fold_metrics.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/fold_summary.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/oof_predictions.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/per_class_report.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/pooled_metrics.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/run_metadata.json
|
|
||||||
results/lsa_pos_logreg_20261025_164912/summary.md
|
|
||||||
results/lsa_pos_logreg_20261025_164912/top_confusions.csv
|
|
||||||
results/lsa_sweep_20261025_164924/lsa_sweep.csv
|
|
||||||
results/lsa_sweep_20261025_185049/lsa_sweep.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/bootstrap_ci.json
|
|
||||||
results/lsa_word2_logreg_20261025_164641/confusion_matrix.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/fold_metrics.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/fold_summary.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/oof_predictions.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/per_class_report.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/pooled_metrics.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/run_metadata.json
|
|
||||||
results/lsa_word2_logreg_20261025_164641/summary.md
|
|
||||||
results/lsa_word2_logreg_20261025_164641/top_confusions.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/bootstrap_ci.json
|
|
||||||
results/lsa_word_logreg_20261025_164608/confusion_matrix.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/fold_metrics.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/fold_summary.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/oof_predictions.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/per_class_report.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/pooled_metrics.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/run_metadata.json
|
|
||||||
results/lsa_word_logreg_20261025_164608/summary.md
|
|
||||||
results/lsa_word_logreg_20261025_164608/top_confusions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/best_params.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/bootstrap_ci.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/confusion_matrix.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/confusion_matrix_normalized.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/fold_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/fold_summary.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/oof_predictions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/per_class_report.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/pooled_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/run_metadata.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/summary.md
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/top_confusions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/best_params.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/bootstrap_ci.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/confusion_matrix.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/confusion_matrix_normalized.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/fold_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/fold_summary.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/oof_predictions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/per_class_report.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/pooled_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/run_metadata.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/summary.md
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/top_confusions.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/bootstrap_ci.json
|
|
||||||
results/pos_multinomial_nb_20261025_155848/confusion_matrix.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/confusion_matrix_normalized.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/fold_metrics.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/fold_summary.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/oof_predictions.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/per_class_report.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/pooled_metrics.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/run_metadata.json
|
|
||||||
results/pos_multinomial_nb_20261025_155848/summary.md
|
|
||||||
results/pos_multinomial_nb_20261025_155848/top_confusions.csv
|
|
||||||
results/README.md
|
|
||||||
results/stylometry_linear_svc_20261025_164018/bootstrap_ci.json
|
|
||||||
results/stylometry_linear_svc_20261025_164018/confusion_matrix.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/fold_metrics.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/fold_summary.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/oof_predictions.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/per_class_report.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/pooled_metrics.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/run_metadata.json
|
|
||||||
results/stylometry_linear_svc_20261025_164018/summary.md
|
|
||||||
results/stylometry_linear_svc_20261025_164018/top_confusions.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/bootstrap_ci.json
|
|
||||||
results/stylometry_logreg_20261025_160722/confusion_matrix.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/fold_metrics.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/fold_summary.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/oof_predictions.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/per_class_report.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/pooled_metrics.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/run_metadata.json
|
|
||||||
results/stylometry_logreg_20261025_160722/summary.md
|
|
||||||
results/stylometry_logreg_20261025_160722/top_confusions.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/fold_metrics.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/fold_summary.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/oof_predictions.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/per_class_report.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/run_metadata.json
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/summary.md
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/comparison_main_vs_pos.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/length_bins.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_age_group_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_age_group_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_gender_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_gender_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_species_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_species_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/top_confusions.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/fold_metrics.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/pair_scores.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/summary.json
|
|
||||||
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
5f48946e4ecf6b1888df5bd99796457b9f49dacffd4da835ce8b6ed69895e2c4 /home/folen/homework/NLP/lab1/exports/nlp_lab1_results_20261025_210212.tar.gz
|
||||||
389
lab1/exports/nlp_lab1_results_20261025_210212_manifest.txt
Normal file
389
lab1/exports/nlp_lab1_results_20261025_210212_manifest.txt
Normal file
@@ -0,0 +1,389 @@
|
|||||||
|
Дата: Вс 25 окт 2026 21:02:12 MSK
|
||||||
|
Каталог: /home/folen/homework/NLP/lab1
|
||||||
|
Интерпретатор: python
|
||||||
|
|
||||||
|
=== Проверка окружения ===
|
||||||
|
Python: 3.11.2 (/home/folen/homework/NLP/lab1/.venv/bin/python)
|
||||||
|
Каталог проекта: /home/folen/homework/NLP/lab1
|
||||||
|
Версии библиотек:
|
||||||
|
numpy: 2.4.6
|
||||||
|
pandas: 3.1.0
|
||||||
|
scipy: 1.17.1
|
||||||
|
sklearn: 1.9.1
|
||||||
|
nltk: 3.10.4
|
||||||
|
matplotlib: 3.11.2
|
||||||
|
Корпус:
|
||||||
|
файл: /home/folen/homework/NLP/lab1/data/dialogues.csv
|
||||||
|
SHA-256: 8946f08159daddb9d89c9d323205d4a7fb4bc617d16e300ff6c7606cb05030f7
|
||||||
|
реплик: 2005
|
||||||
|
персонажей: 34
|
||||||
|
словоупотреблений: 38207
|
||||||
|
NLTK:
|
||||||
|
токенизатор: NLTK
|
||||||
|
POS-теггер: доступен
|
||||||
|
пример токенов: ['Oh', ',', 'that', "'s", 'right', '...', 'I', 'heard']
|
||||||
|
пример POS: ['INTJ', 'PUNCT', 'DET', 'AUX', 'ADJ', 'PUNCT', 'PRON', 'VERB']
|
||||||
|
|
||||||
|
Окружение готово.
|
||||||
|
{"versions": {"numpy": "2.4.6", "pandas": "3.1.0", "scipy": "1.17.1", "sklearn": "1.9.1", "nltk": "3.10.4", "matplotlib": "3.11.2"}, "n_lines": 2005}
|
||||||
|
|
||||||
|
Git commit: c131815fc7b4c941d64d9ca7c7a00ea15df20df3
|
||||||
|
|
||||||
|
Содержимое results:
|
||||||
|
results/ablation_stylometry_pos_lsa_20261025_185002/ablation.csv
|
||||||
|
results/delta_20261025_201339/delta_sweep.csv
|
||||||
|
results/length_logreg_20261025_172732/bootstrap_ci.json
|
||||||
|
results/length_logreg_20261025_172732/confusion_matrix.csv
|
||||||
|
results/length_logreg_20261025_172732/confusion_matrix_normalized.csv
|
||||||
|
results/length_logreg_20261025_172732/fold_metrics.csv
|
||||||
|
results/length_logreg_20261025_172732/fold_summary.csv
|
||||||
|
results/length_logreg_20261025_172732/oof_predictions.csv
|
||||||
|
results/length_logreg_20261025_172732/per_class_report.csv
|
||||||
|
results/length_logreg_20261025_172732/pooled_metrics.csv
|
||||||
|
results/length_logreg_20261025_172732/run_metadata.json
|
||||||
|
results/length_logreg_20261025_172732/summary.md
|
||||||
|
results/length_logreg_20261025_172732/top_confusions.csv
|
||||||
|
results/logs/tune_20261025_191658.log
|
||||||
|
results/lsa_sweep_20261025_195217/lsa_sweep.csv
|
||||||
|
results/README.md
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/summary.md
|
||||||
|
results/stylometry_pos_lsa_extra_trees_20261025_201326/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/summary.md
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_192936/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/summary.md
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193051/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/summary.md
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193207/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/summary.md
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193328/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/summary.md
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193455/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/summary.md
|
||||||
|
results/stylometry_pos_lsa_linear_svc_20261025_193625/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191805/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_191938/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192116/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192311/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192535/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_192822/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_193844/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194037/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194222/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194415/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194613/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194802/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_194959/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/summary.md
|
||||||
|
results/stylometry_pos_lsa_logreg_20261025_195203/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195744/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_195906/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200028/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200155/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200320/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200445/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200617/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200748/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_200916/top_confusions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/bootstrap_ci.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/confusion_matrix.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/confusion_matrix_normalized.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/fold_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/fold_summary.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/oof_predictions.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/per_class_report.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/pooled_metrics.csv
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/run_metadata.json
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/summary.md
|
||||||
|
results/stylometry_pos_lsa_random_forest_20261025_201210/top_confusions.csv
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
f9566b75e0474a72271263bf203f892979e638750cddc980be9a69f690aaa884 /home/folen/Homework/NLP/lab1/exports/nlp_lab1_results_20261026_054117.tar.gz
|
|
||||||
@@ -1,493 +0,0 @@
|
|||||||
Дата: Пн 26 окт 2026 05:41:17 MSK
|
|
||||||
Каталог: /home/folen/Homework/NLP/lab1
|
|
||||||
Интерпретатор: python
|
|
||||||
|
|
||||||
=== Проверка окружения ===
|
|
||||||
Python: 3.11.2 (/home/folen/Homework/NLP/.venv/bin/python)
|
|
||||||
Каталог проекта: /home/folen/Homework/NLP/lab1
|
|
||||||
Версии библиотек:
|
|
||||||
numpy: 2.4.6
|
|
||||||
pandas: 3.1.0
|
|
||||||
scipy: 1.17.1
|
|
||||||
sklearn: 1.9.1
|
|
||||||
nltk: 3.10.4
|
|
||||||
matplotlib: 3.11.2
|
|
||||||
Корпус:
|
|
||||||
файл: /home/folen/Homework/NLP/lab1/data/dialogues.csv
|
|
||||||
SHA-256: 8946f08159daddb9d89c9d323205d4a7fb4bc617d16e300ff6c7606cb05030f7
|
|
||||||
реплик: 2005
|
|
||||||
персонажей: 34
|
|
||||||
словоупотреблений: 38207
|
|
||||||
NLTK:
|
|
||||||
токенизатор: NLTK
|
|
||||||
POS-теггер: доступен
|
|
||||||
пример токенов: ['Oh', ',', 'that', "'s", 'right', '...', 'I', 'heard']
|
|
||||||
пример POS: ['INTJ', 'PUNCT', 'DET', 'AUX', 'ADJ', 'PUNCT', 'PRON', 'VERB']
|
|
||||||
|
|
||||||
Окружение готово.
|
|
||||||
{"versions": {"numpy": "2.4.6", "pandas": "3.1.0", "scipy": "1.17.1", "sklearn": "1.9.1", "nltk": "3.10.4", "matplotlib": "3.11.2"}, "n_lines": 2005}
|
|
||||||
|
|
||||||
Git commit: 2c6bf4653adc6c356e4af205857dfdb0f144775b
|
|
||||||
|
|
||||||
Содержимое results:
|
|
||||||
results/ablation_stylometry_pos_lsa_20261025_170116/ablation.csv
|
|
||||||
results/benchmark_stylometry_pos_lsa_20261025_165348/summary.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/bootstrap_ci.json
|
|
||||||
results/char_multinomial_nb_20261025_155832/confusion_matrix.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/confusion_matrix_normalized.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/fold_metrics.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/fold_summary.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/oof_predictions.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/per_class_report.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/pooled_metrics.csv
|
|
||||||
results/char_multinomial_nb_20261025_155832/run_metadata.json
|
|
||||||
results/char_multinomial_nb_20261025_155832/summary.md
|
|
||||||
results/char_multinomial_nb_20261025_155832/top_confusions.csv
|
|
||||||
results/clustering_stylometry_pos_lsa_20261025_172241/character_centroids.csv
|
|
||||||
results/clustering_stylometry_pos_lsa_20261025_172241/clustering_metrics.csv
|
|
||||||
results/delta_20261025_172113/delta_sweep.csv
|
|
||||||
results/followup/comparisons.csv
|
|
||||||
results/followup/comparisons.md
|
|
||||||
results/followup/manifest.tsv
|
|
||||||
results/followup/summary.csv
|
|
||||||
results/followup/summary.md
|
|
||||||
results/fw_logreg_20261025_160058/bootstrap_ci.json
|
|
||||||
results/fw_logreg_20261025_160058/confusion_matrix.csv
|
|
||||||
results/fw_logreg_20261025_160058/confusion_matrix_normalized.csv
|
|
||||||
results/fw_logreg_20261025_160058/fold_metrics.csv
|
|
||||||
results/fw_logreg_20261025_160058/fold_summary.csv
|
|
||||||
results/fw_logreg_20261025_160058/oof_predictions.csv
|
|
||||||
results/fw_logreg_20261025_160058/per_class_report.csv
|
|
||||||
results/fw_logreg_20261025_160058/pooled_metrics.csv
|
|
||||||
results/fw_logreg_20261025_160058/run_metadata.json
|
|
||||||
results/fw_logreg_20261025_160058/summary.md
|
|
||||||
results/fw_logreg_20261025_160058/top_confusions.csv
|
|
||||||
results/length_dummy_20261025_155747/bootstrap_ci.json
|
|
||||||
results/length_dummy_20261025_155747/confusion_matrix.csv
|
|
||||||
results/length_dummy_20261025_155747/confusion_matrix_normalized.csv
|
|
||||||
results/length_dummy_20261025_155747/fold_metrics.csv
|
|
||||||
results/length_dummy_20261025_155747/fold_summary.csv
|
|
||||||
results/length_dummy_20261025_155747/oof_predictions.csv
|
|
||||||
results/length_dummy_20261025_155747/per_class_report.csv
|
|
||||||
results/length_dummy_20261025_155747/pooled_metrics.csv
|
|
||||||
results/length_dummy_20261025_155747/run_metadata.json
|
|
||||||
results/length_dummy_20261025_155747/summary.md
|
|
||||||
results/length_dummy_20261025_155747/top_confusions.csv
|
|
||||||
results/length_logreg_20261025_155719/bootstrap_ci.json
|
|
||||||
results/length_logreg_20261025_155719/confusion_matrix.csv
|
|
||||||
results/length_logreg_20261025_155719/confusion_matrix_normalized.csv
|
|
||||||
results/length_logreg_20261025_155719/fold_metrics.csv
|
|
||||||
results/length_logreg_20261025_155719/fold_summary.csv
|
|
||||||
results/length_logreg_20261025_155719/oof_predictions.csv
|
|
||||||
results/length_logreg_20261025_155719/per_class_report.csv
|
|
||||||
results/length_logreg_20261025_155719/pooled_metrics.csv
|
|
||||||
results/length_logreg_20261025_155719/run_metadata.json
|
|
||||||
results/length_logreg_20261025_155719/summary.md
|
|
||||||
results/length_logreg_20261025_155719/top_confusions.csv
|
|
||||||
results/length_logreg_20261025_155813/bootstrap_ci.json
|
|
||||||
results/length_logreg_20261025_155813/confusion_matrix.csv
|
|
||||||
results/length_logreg_20261025_155813/confusion_matrix_normalized.csv
|
|
||||||
results/length_logreg_20261025_155813/fold_metrics.csv
|
|
||||||
results/length_logreg_20261025_155813/fold_summary.csv
|
|
||||||
results/length_logreg_20261025_155813/oof_predictions.csv
|
|
||||||
results/length_logreg_20261025_155813/per_class_report.csv
|
|
||||||
results/length_logreg_20261025_155813/pooled_metrics.csv
|
|
||||||
results/length_logreg_20261025_155813/run_metadata.json
|
|
||||||
results/length_logreg_20261025_155813/summary.md
|
|
||||||
results/length_logreg_20261025_155813/top_confusions.csv
|
|
||||||
results/logs/run_all_20261025_150915.log
|
|
||||||
results/logs/run_all_20261025_151312.log
|
|
||||||
results/logs/run_all_20261025_152356.log
|
|
||||||
results/logs/run_all_20261025_155738.log
|
|
||||||
results/logs/run_followup_20261025_210825.log
|
|
||||||
results/logs/run_followup_smoke.log
|
|
||||||
results/lsa_char_logreg_20261025_164836/bootstrap_ci.json
|
|
||||||
results/lsa_char_logreg_20261025_164836/confusion_matrix.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/fold_metrics.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/fold_summary.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/oof_predictions.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/per_class_report.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/pooled_metrics.csv
|
|
||||||
results/lsa_char_logreg_20261025_164836/run_metadata.json
|
|
||||||
results/lsa_char_logreg_20261025_164836/summary.md
|
|
||||||
results/lsa_char_logreg_20261025_164836/top_confusions.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/bootstrap_ci.json
|
|
||||||
results/lsa_content_logreg_20261025_164717/confusion_matrix.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/fold_metrics.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/fold_summary.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/oof_predictions.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/per_class_report.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/pooled_metrics.csv
|
|
||||||
results/lsa_content_logreg_20261025_164717/run_metadata.json
|
|
||||||
results/lsa_content_logreg_20261025_164717/summary.md
|
|
||||||
results/lsa_content_logreg_20261025_164717/top_confusions.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/bootstrap_ci.json
|
|
||||||
results/lsa_fw_logreg_20261025_164750/confusion_matrix.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/fold_metrics.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/fold_summary.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/oof_predictions.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/per_class_report.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/pooled_metrics.csv
|
|
||||||
results/lsa_fw_logreg_20261025_164750/run_metadata.json
|
|
||||||
results/lsa_fw_logreg_20261025_164750/summary.md
|
|
||||||
results/lsa_fw_logreg_20261025_164750/top_confusions.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/bootstrap_ci.json
|
|
||||||
results/lsa_pos_logreg_20261025_164912/confusion_matrix.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/fold_metrics.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/fold_summary.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/oof_predictions.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/per_class_report.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/pooled_metrics.csv
|
|
||||||
results/lsa_pos_logreg_20261025_164912/run_metadata.json
|
|
||||||
results/lsa_pos_logreg_20261025_164912/summary.md
|
|
||||||
results/lsa_pos_logreg_20261025_164912/top_confusions.csv
|
|
||||||
results/lsa_sweep_20261025_164924/lsa_sweep.csv
|
|
||||||
results/lsa_sweep_20261025_185049/lsa_sweep.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/bootstrap_ci.json
|
|
||||||
results/lsa_word2_logreg_20261025_164641/confusion_matrix.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/fold_metrics.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/fold_summary.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/oof_predictions.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/per_class_report.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/pooled_metrics.csv
|
|
||||||
results/lsa_word2_logreg_20261025_164641/run_metadata.json
|
|
||||||
results/lsa_word2_logreg_20261025_164641/summary.md
|
|
||||||
results/lsa_word2_logreg_20261025_164641/top_confusions.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/bootstrap_ci.json
|
|
||||||
results/lsa_word_logreg_20261025_164608/confusion_matrix.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/confusion_matrix_normalized.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/fold_metrics.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/fold_summary.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/oof_predictions.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/per_class_report.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/pooled_metrics.csv
|
|
||||||
results/lsa_word_logreg_20261025_164608/run_metadata.json
|
|
||||||
results/lsa_word_logreg_20261025_164608/summary.md
|
|
||||||
results/lsa_word_logreg_20261025_164608/top_confusions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/best_params.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/bootstrap_ci.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/confusion_matrix.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/confusion_matrix_normalized.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/fold_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/fold_summary.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/oof_predictions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/per_class_report.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/pooled_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/run_metadata.json
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/summary.md
|
|
||||||
results/nested_stylometry_pos_lsa_linear_svc_20261025_172442/top_confusions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/best_params.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/bootstrap_ci.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/confusion_matrix.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/confusion_matrix_normalized.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/fold_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/fold_summary.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/oof_predictions.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/per_class_report.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/pooled_metrics.csv
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/run_metadata.json
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/summary.md
|
|
||||||
results/nested_stylometry_pos_lsa_logreg_20261025_172348/top_confusions.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/bootstrap_ci.json
|
|
||||||
results/pos_multinomial_nb_20261025_155848/confusion_matrix.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/confusion_matrix_normalized.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/fold_metrics.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/fold_summary.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/oof_predictions.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/per_class_report.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/pooled_metrics.csv
|
|
||||||
results/pos_multinomial_nb_20261025_155848/run_metadata.json
|
|
||||||
results/pos_multinomial_nb_20261025_155848/summary.md
|
|
||||||
results/pos_multinomial_nb_20261025_155848/top_confusions.csv
|
|
||||||
results/README.md
|
|
||||||
results/stylometry_linear_svc_20261025_164018/bootstrap_ci.json
|
|
||||||
results/stylometry_linear_svc_20261025_164018/confusion_matrix.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/fold_metrics.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/fold_summary.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/oof_predictions.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/per_class_report.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/pooled_metrics.csv
|
|
||||||
results/stylometry_linear_svc_20261025_164018/run_metadata.json
|
|
||||||
results/stylometry_linear_svc_20261025_164018/summary.md
|
|
||||||
results/stylometry_linear_svc_20261025_164018/top_confusions.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/bootstrap_ci.json
|
|
||||||
results/stylometry_logreg_20261025_160722/confusion_matrix.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/fold_metrics.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/fold_summary.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/oof_predictions.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/per_class_report.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/pooled_metrics.csv
|
|
||||||
results/stylometry_logreg_20261025_160722/run_metadata.json
|
|
||||||
results/stylometry_logreg_20261025_160722/summary.md
|
|
||||||
results/stylometry_logreg_20261025_160722/top_confusions.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/fold_metrics.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/fold_summary.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/oof_predictions.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/per_class_report.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/run_metadata.json
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/summary.md
|
|
||||||
results/stylometry_pos_logreg_20261025_164246/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184431/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184538/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184646/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184759/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_184916/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/summary.md
|
|
||||||
results/stylometry_pos_lsa_linear_svc_20261025_185037/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/comparison_main_vs_pos.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/length_bins.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_age_group_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_age_group_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_gender_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_gender_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_species_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/subgroup_species_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_164534/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183404/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183524/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183653/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_183839/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184052/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/summary.md
|
|
||||||
results/stylometry_pos_lsa_logreg_20261025_184325/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190013/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190125/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190237/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190354/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190510/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190626/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190749/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_190910/top_confusions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/bootstrap_ci.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/confusion_matrix.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/confusion_matrix_normalized.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/fold_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/fold_summary.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/oof_predictions.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/per_class_report.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/pooled_metrics.csv
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/run_metadata.json
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/summary.md
|
|
||||||
results/stylometry_pos_lsa_random_forest_20261025_191031/top_confusions.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/fold_metrics.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/pair_scores.csv
|
|
||||||
results/verification_stylometry_pos_lsa_20261025_172237/summary.json
|
|
||||||
@@ -1,336 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
"""Сводка follow-up экспериментов и парные сравнения по повторам.
|
|
||||||
|
|
||||||
Скрипт читает каталоги results/followup/<label>/, созданные
|
|
||||||
scripts/run_followup_experiments.sh, и формирует:
|
|
||||||
|
|
||||||
- summary.csv / summary.md — среднее macro-F1 по повторам, а не только repeat 0;
|
|
||||||
- comparisons.csv / comparisons.md — парные сравнения с McNemar и bootstrap;
|
|
||||||
- comparisons/<A>__vs__<B>.json — детали по каждому повтору.
|
|
||||||
|
|
||||||
Пример:
|
|
||||||
python scripts/analyze_followup.py \
|
|
||||||
--followup-dir results/followup \
|
|
||||||
--pairs final_rf:ref_logreg final_rf:ref_no_lsa
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
from pathlib import Path
|
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
|
||||||
sys.path.insert(0, str(PROJECT_ROOT))
|
|
||||||
|
|
||||||
from stylometry.evaluation import classification_metrics # noqa: E402
|
|
||||||
from stylometry.stats import bootstrap_difference, mcnemar_exact # noqa: E402
|
|
||||||
|
|
||||||
|
|
||||||
def _json_load(path: Path) -> dict[str, Any]:
|
|
||||||
return json.loads(path.read_text(encoding="utf-8"))
|
|
||||||
|
|
||||||
|
|
||||||
def _read_run(run_dir: Path) -> tuple[dict[str, Any], pd.DataFrame]:
|
|
||||||
metadata = _json_load(run_dir / "run_metadata.json")
|
|
||||||
pooled_path = run_dir / "pooled_metrics.csv"
|
|
||||||
if pooled_path.exists():
|
|
||||||
pooled = pd.read_csv(pooled_path)
|
|
||||||
else:
|
|
||||||
pooled = pd.DataFrame([metadata.get("metrics", {})])
|
|
||||||
return metadata, pooled
|
|
||||||
|
|
||||||
|
|
||||||
def _feature_summary(config: dict[str, Any]) -> str:
|
|
||||||
keys = (
|
|
||||||
"groups",
|
|
||||||
"lsa_variants",
|
|
||||||
"lsa_components",
|
|
||||||
"min_df",
|
|
||||||
"char_max_features",
|
|
||||||
"pos_max_features",
|
|
||||||
"char_ngram_range",
|
|
||||||
"pos_ngram_range",
|
|
||||||
"block_weights",
|
|
||||||
)
|
|
||||||
features = config.get("feature_config", {})
|
|
||||||
return json.dumps({key: features.get(key) for key in keys if key in features}, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
def build_summary(followup_dir: Path) -> pd.DataFrame:
|
|
||||||
rows: list[dict[str, Any]] = []
|
|
||||||
for run_dir in sorted(followup_dir.iterdir()):
|
|
||||||
if not run_dir.is_dir() or not (run_dir / "run_metadata.json").exists():
|
|
||||||
continue
|
|
||||||
metadata, pooled = _read_run(run_dir)
|
|
||||||
config = metadata.get("config", {})
|
|
||||||
bootstrap = metadata.get("bootstrap", {}).get("macro_f1", {})
|
|
||||||
macro = pd.to_numeric(pooled.get("macro_f1"), errors="coerce")
|
|
||||||
accuracy = pd.to_numeric(pooled.get("accuracy"), errors="coerce")
|
|
||||||
balanced = pd.to_numeric(pooled.get("balanced_accuracy"), errors="coerce")
|
|
||||||
top3 = pd.to_numeric(pooled.get("top3_accuracy"), errors="coerce")
|
|
||||||
command_path = run_dir / "command.txt"
|
|
||||||
rows.append(
|
|
||||||
{
|
|
||||||
"label": run_dir.name,
|
|
||||||
"preset": config.get("preset"),
|
|
||||||
"model": config.get("model"),
|
|
||||||
"folds": config.get("folds"),
|
|
||||||
"n_repeats": int(len(pooled)),
|
|
||||||
"n_samples": config.get("n_samples"),
|
|
||||||
"mean_macro_f1": float(macro.mean()),
|
|
||||||
"std_macro_f1": float(macro.std(ddof=1)) if len(macro) > 1 else 0.0,
|
|
||||||
"min_macro_f1": float(macro.min()),
|
|
||||||
"max_macro_f1": float(macro.max()),
|
|
||||||
"repeat0_macro_f1": float(macro.iloc[0]),
|
|
||||||
"mean_accuracy": float(accuracy.mean()),
|
|
||||||
"mean_balanced_accuracy": float(balanced.mean()),
|
|
||||||
"mean_top3_accuracy": float(top3.mean()),
|
|
||||||
"ci_lower_repeat0": bootstrap.get("lower"),
|
|
||||||
"ci_upper_repeat0": bootstrap.get("upper"),
|
|
||||||
"model_params": json.dumps(config.get("model_params", {}), ensure_ascii=False),
|
|
||||||
"feature_config": _feature_summary(config),
|
|
||||||
"command": command_path.read_text(encoding="utf-8").strip()
|
|
||||||
if command_path.exists()
|
|
||||||
else "",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
summary = pd.DataFrame(rows)
|
|
||||||
if summary.empty:
|
|
||||||
return summary
|
|
||||||
reference = summary.loc[summary["label"] == "ref_logreg", "mean_macro_f1"]
|
|
||||||
if not reference.empty:
|
|
||||||
summary["delta_vs_ref_logreg"] = summary["mean_macro_f1"] - float(reference.iloc[0])
|
|
||||||
else:
|
|
||||||
summary["delta_vs_ref_logreg"] = np.nan
|
|
||||||
summary = summary.sort_values("mean_macro_f1", ascending=False).reset_index(drop=True)
|
|
||||||
summary.insert(0, "rank", np.arange(1, len(summary) + 1))
|
|
||||||
return summary
|
|
||||||
|
|
||||||
|
|
||||||
def _compare_pair(
|
|
||||||
followup_dir: Path,
|
|
||||||
label_a: str,
|
|
||||||
label_b: str,
|
|
||||||
n_boot: int,
|
|
||||||
seed: int,
|
|
||||||
) -> tuple[dict[str, Any] | None, list[dict[str, Any]]]:
|
|
||||||
dir_a = followup_dir / label_a
|
|
||||||
dir_b = followup_dir / label_b
|
|
||||||
if not (dir_a / "oof_predictions.csv").exists() or not (dir_b / "oof_predictions.csv").exists():
|
|
||||||
print(f"[compare] пропуск {label_a} vs {label_b}: нет oof_predictions.csv")
|
|
||||||
return None, []
|
|
||||||
|
|
||||||
oof_a = pd.read_csv(dir_a / "oof_predictions.csv")
|
|
||||||
oof_b = pd.read_csv(dir_b / "oof_predictions.csv")
|
|
||||||
common_repeats = sorted(set(oof_a["repeat"].unique()) & set(oof_b["repeat"].unique()))
|
|
||||||
if not common_repeats:
|
|
||||||
print(f"[compare] пропуск {label_a} vs {label_b}: нет общих повторов")
|
|
||||||
return None, []
|
|
||||||
|
|
||||||
details: list[dict[str, Any]] = []
|
|
||||||
for repeat in common_repeats:
|
|
||||||
first = oof_a.loc[oof_a["repeat"] == repeat, ["line_id", "y_true", "y_pred"]]
|
|
||||||
second = oof_b.loc[oof_b["repeat"] == repeat, ["line_id", "y_true", "y_pred"]]
|
|
||||||
merged = first.merge(
|
|
||||||
second,
|
|
||||||
on=["line_id", "y_true"],
|
|
||||||
suffixes=("_a", "_b"),
|
|
||||||
how="inner",
|
|
||||||
)
|
|
||||||
if merged.empty:
|
|
||||||
continue
|
|
||||||
labels = sorted(merged["y_true"].unique())
|
|
||||||
metrics_a = classification_metrics(merged["y_true"], merged["y_pred_a"], labels=labels)
|
|
||||||
metrics_b = classification_metrics(merged["y_true"], merged["y_pred_b"], labels=labels)
|
|
||||||
mcnemar = mcnemar_exact(merged["y_true"], merged["y_pred_a"], merged["y_pred_b"])
|
|
||||||
difference = bootstrap_difference(
|
|
||||||
merged["y_true"],
|
|
||||||
merged["y_pred_a"],
|
|
||||||
merged["y_pred_b"],
|
|
||||||
metric="macro_f1",
|
|
||||||
labels=labels,
|
|
||||||
n_boot=n_boot,
|
|
||||||
seed=seed + int(repeat),
|
|
||||||
)
|
|
||||||
details.append(
|
|
||||||
{
|
|
||||||
"repeat": int(repeat),
|
|
||||||
"n_samples": int(len(merged)),
|
|
||||||
"macro_f1_a": metrics_a["macro_f1"],
|
|
||||||
"macro_f1_b": metrics_b["macro_f1"],
|
|
||||||
"macro_f1_diff": metrics_a["macro_f1"] - metrics_b["macro_f1"],
|
|
||||||
"accuracy_a": metrics_a["accuracy"],
|
|
||||||
"accuracy_b": metrics_b["accuracy"],
|
|
||||||
"accuracy_diff": metrics_a["accuracy"] - metrics_b["accuracy"],
|
|
||||||
"mcnemar_p": mcnemar["p_value"],
|
|
||||||
"mcnemar_b": mcnemar["b"],
|
|
||||||
"mcnemar_c": mcnemar["c"],
|
|
||||||
"bootstrap_mean_diff": difference["mean_difference"],
|
|
||||||
"bootstrap_lower": difference["lower"],
|
|
||||||
"bootstrap_upper": difference["upper"],
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if not details:
|
|
||||||
print(f"[compare] пропуск {label_a} vs {label_b}: не удалось сопоставить строки")
|
|
||||||
return None, []
|
|
||||||
|
|
||||||
diffs = np.asarray([row["macro_f1_diff"] for row in details], dtype=float)
|
|
||||||
p_values = np.asarray([row["mcnemar_p"] for row in details], dtype=float)
|
|
||||||
ci_lower = np.asarray([row["bootstrap_lower"] for row in details], dtype=float)
|
|
||||||
ci_upper = np.asarray([row["bootstrap_upper"] for row in details], dtype=float)
|
|
||||||
summary = {
|
|
||||||
"pair": f"{label_a} vs {label_b}",
|
|
||||||
"label_a": label_a,
|
|
||||||
"label_b": label_b,
|
|
||||||
"n_repeats": len(details),
|
|
||||||
"mean_macro_f1_a": float(np.mean([row["macro_f1_a"] for row in details])),
|
|
||||||
"mean_macro_f1_b": float(np.mean([row["macro_f1_b"] for row in details])),
|
|
||||||
"mean_diff": float(diffs.mean()),
|
|
||||||
"std_diff": float(diffs.std(ddof=1)) if len(diffs) > 1 else 0.0,
|
|
||||||
"min_diff": float(diffs.min()),
|
|
||||||
"max_diff": float(diffs.max()),
|
|
||||||
"n_positive": int((diffs > 0).sum()),
|
|
||||||
"n_negative": int((diffs < 0).sum()),
|
|
||||||
"mean_mcnemar_p": float(p_values.mean()),
|
|
||||||
"min_mcnemar_p": float(p_values.min()),
|
|
||||||
"mean_ci_lower": float(ci_lower.mean()),
|
|
||||||
"mean_ci_upper": float(ci_upper.mean()),
|
|
||||||
"n_ci_excludes_zero": int(((ci_lower > 0) | (ci_upper < 0)).sum()),
|
|
||||||
}
|
|
||||||
return summary, details
|
|
||||||
|
|
||||||
|
|
||||||
def _format_markdown(summary: pd.DataFrame) -> str:
|
|
||||||
columns = [
|
|
||||||
"rank",
|
|
||||||
"label",
|
|
||||||
"model",
|
|
||||||
"preset",
|
|
||||||
"n_repeats",
|
|
||||||
"mean_macro_f1",
|
|
||||||
"std_macro_f1",
|
|
||||||
"mean_accuracy",
|
|
||||||
"mean_top3_accuracy",
|
|
||||||
"delta_vs_ref_logreg",
|
|
||||||
]
|
|
||||||
table = summary[columns].copy()
|
|
||||||
return table.to_markdown(index=False, floatfmt=".4f")
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv: list[str] | None = None) -> int:
|
|
||||||
parser = argparse.ArgumentParser(description=__doc__)
|
|
||||||
parser.add_argument(
|
|
||||||
"--followup-dir",
|
|
||||||
default=str(PROJECT_ROOT / "results" / "followup"),
|
|
||||||
help="Каталог с подкаталогами запусков.",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--pairs",
|
|
||||||
nargs="*",
|
|
||||||
default=[],
|
|
||||||
help="Пары для сравнения в формате label_a:label_b.",
|
|
||||||
)
|
|
||||||
parser.add_argument("--n-boot", type=int, default=1000)
|
|
||||||
parser.add_argument("--seed", type=int, default=42)
|
|
||||||
args = parser.parse_args(argv)
|
|
||||||
|
|
||||||
followup_dir = Path(args.followup_dir)
|
|
||||||
if not followup_dir.exists():
|
|
||||||
raise FileNotFoundError(f"Нет каталога: {followup_dir}")
|
|
||||||
|
|
||||||
summary = build_summary(followup_dir)
|
|
||||||
if summary.empty:
|
|
||||||
print(f"[summary] в {followup_dir} нет запусков с run_metadata.json")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
summary_path = followup_dir / "summary.csv"
|
|
||||||
summary.to_csv(summary_path, index=False, encoding="utf-8-sig")
|
|
||||||
markdown = [
|
|
||||||
"# Follow-up: сводка запусков",
|
|
||||||
"",
|
|
||||||
"Среднее и стандартное отклонение посчитаны по pooled-метрикам каждого",
|
|
||||||
"повтора (`pooled_metrics.csv`), а не только по repeat 0.",
|
|
||||||
"",
|
|
||||||
_format_markdown(summary),
|
|
||||||
"",
|
|
||||||
]
|
|
||||||
(followup_dir / "summary.md").write_text("\n".join(markdown), encoding="utf-8")
|
|
||||||
print(f"[summary] {summary_path}")
|
|
||||||
print(
|
|
||||||
summary[
|
|
||||||
["rank", "label", "model", "n_repeats", "mean_macro_f1", "std_macro_f1"]
|
|
||||||
].to_string(index=False)
|
|
||||||
)
|
|
||||||
|
|
||||||
comparison_rows: list[dict[str, Any]] = []
|
|
||||||
comparisons_dir = followup_dir / "comparisons"
|
|
||||||
comparisons_dir.mkdir(exist_ok=True)
|
|
||||||
for pair in args.pairs:
|
|
||||||
if ":" not in pair:
|
|
||||||
print(f"[compare] некорректная пара: {pair}")
|
|
||||||
continue
|
|
||||||
label_a, label_b = pair.split(":", 1)
|
|
||||||
summary_row, details = _compare_pair(
|
|
||||||
followup_dir,
|
|
||||||
label_a.strip(),
|
|
||||||
label_b.strip(),
|
|
||||||
n_boot=args.n_boot,
|
|
||||||
seed=args.seed,
|
|
||||||
)
|
|
||||||
if summary_row is None:
|
|
||||||
continue
|
|
||||||
comparison_rows.append(summary_row)
|
|
||||||
payload = {"summary": summary_row, "details": details}
|
|
||||||
output = comparisons_dir / f"{label_a.strip()}__vs__{label_b.strip()}.json"
|
|
||||||
output.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
|
|
||||||
print(
|
|
||||||
f"[compare] {summary_row['pair']}: "
|
|
||||||
f"diff={summary_row['mean_diff']:+.4f}, "
|
|
||||||
f"{summary_row['n_positive']}/{summary_row['n_repeats']} повторов в плюс, "
|
|
||||||
f"mean McNemar p={summary_row['mean_mcnemar_p']:.4f}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if comparison_rows:
|
|
||||||
comparisons = pd.DataFrame(comparison_rows).sort_values("mean_diff", ascending=False)
|
|
||||||
comparisons.to_csv(followup_dir / "comparisons.csv", index=False, encoding="utf-8-sig")
|
|
||||||
columns = [
|
|
||||||
"pair",
|
|
||||||
"n_repeats",
|
|
||||||
"mean_macro_f1_a",
|
|
||||||
"mean_macro_f1_b",
|
|
||||||
"mean_diff",
|
|
||||||
"std_diff",
|
|
||||||
"n_positive",
|
|
||||||
"mean_mcnemar_p",
|
|
||||||
"mean_ci_lower",
|
|
||||||
"mean_ci_upper",
|
|
||||||
"n_ci_excludes_zero",
|
|
||||||
]
|
|
||||||
comparison_markdown = [
|
|
||||||
"# Follow-up: парные сравнения",
|
|
||||||
"",
|
|
||||||
"`mean_diff` — средняя разница macro-F1 (A − B) по общим повторам.",
|
|
||||||
"`n_positive` — сколько повторов дали положительную разницу.",
|
|
||||||
"`n_ci_excludes_zero` — сколько повторов имеют bootstrap-интервал,",
|
|
||||||
"не содержащий ноль (описательно, без поправки на множественность).",
|
|
||||||
"",
|
|
||||||
comparisons[columns].to_markdown(index=False, floatfmt=".4f"),
|
|
||||||
"",
|
|
||||||
]
|
|
||||||
(followup_dir / "comparisons.md").write_text(
|
|
||||||
"\n".join(comparison_markdown), encoding="utf-8"
|
|
||||||
)
|
|
||||||
print(f"[compare] {followup_dir / 'comparisons.csv'}")
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
raise SystemExit(main())
|
|
||||||
@@ -1,824 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Follow-up серия экспериментов по итогам предварительных прогонов.
|
|
||||||
#
|
|
||||||
# Запуск из каталога lab1:
|
|
||||||
# bash scripts/run_followup_experiments.sh
|
|
||||||
#
|
|
||||||
# С другим интерпретатором:
|
|
||||||
# PYTHON=../.venv/bin/python bash scripts/run_followup_experiments.sh
|
|
||||||
#
|
|
||||||
# Быстрая проверка (1 повтор, без сетки и seed-робастности):
|
|
||||||
# QUICK=1 bash scripts/run_followup_experiments.sh
|
|
||||||
#
|
|
||||||
# Только воспроизведение и финальная модель, без тяжёлых стадий:
|
|
||||||
# RUN_GRID=0 RUN_SEEDS=0 bash scripts/run_followup_experiments.sh
|
|
||||||
#
|
|
||||||
# Все результаты складываются в results/followup/<label>/, команды и
|
|
||||||
# сгенерированные конфиги сохраняются рядом. Общий лог:
|
|
||||||
# results/logs/run_followup_<timestamp>.log
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
||||||
cd "${PROJECT_ROOT}"
|
|
||||||
|
|
||||||
PYTHON="${PYTHON:-python}"
|
|
||||||
if [[ "${PYTHON}" == */* ]]; then
|
|
||||||
PYTHON_DIR="$(cd "$(dirname "${PYTHON}")" && pwd)"
|
|
||||||
PYTHON="${PYTHON_DIR}/$(basename "${PYTHON}")"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! "${PYTHON}" -c "import sklearn, pandas, nltk" >/dev/null 2>&1; then
|
|
||||||
echo "ОШИБКА: в интерпретаторе ${PYTHON} не установлены зависимости."
|
|
||||||
echo "Выполните: ${PYTHON} -m pip install -r requirements.txt"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
RESULTS_DIR="${PROJECT_ROOT}/results"
|
|
||||||
# FOLLOWUP_DIR можно переопределить, чтобы прогнать серию в отдельный каталог
|
|
||||||
# (например, для дымового теста) и не смешивать с основными результатами.
|
|
||||||
FOLLOWUP_DIR="${FOLLOWUP_DIR:-${RESULTS_DIR}/followup}"
|
|
||||||
CONFIG_DIR="${FOLLOWUP_DIR}/configs"
|
|
||||||
COMPARISON_DIR="${FOLLOWUP_DIR}/comparisons"
|
|
||||||
LOG_DIR="${RESULTS_DIR}/logs"
|
|
||||||
MANIFEST="${FOLLOWUP_DIR}/manifest.tsv"
|
|
||||||
|
|
||||||
REPEATS_MAIN="${REPEATS_MAIN:-5}"
|
|
||||||
REPEATS_GRID="${REPEATS_GRID:-3}"
|
|
||||||
REPEATS_SWEEP="${REPEATS_SWEEP:-3}"
|
|
||||||
REPEATS_NGRAM="${REPEATS_NGRAM:-3}"
|
|
||||||
REPEATS_FINAL="${REPEATS_FINAL:-10}"
|
|
||||||
RUN_GRID="${RUN_GRID:-1}"
|
|
||||||
RUN_SEEDS="${RUN_SEEDS:-1}"
|
|
||||||
RUN_FINAL="${RUN_FINAL:-1}"
|
|
||||||
RUN_CONTROLS="${RUN_CONTROLS:-1}"
|
|
||||||
SKIP_TESTS="${SKIP_TESTS:-0}"
|
|
||||||
FORCE="${FORCE:-0}"
|
|
||||||
SEED="${SEED:-42}"
|
|
||||||
|
|
||||||
if [[ "${QUICK:-0}" == "1" ]]; then
|
|
||||||
REPEATS_MAIN=1
|
|
||||||
REPEATS_GRID=1
|
|
||||||
REPEATS_SWEEP=1
|
|
||||||
REPEATS_NGRAM=1
|
|
||||||
REPEATS_FINAL=1
|
|
||||||
RUN_GRID=0
|
|
||||||
RUN_SEEDS=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "${FOLLOWUP_DIR}" "${CONFIG_DIR}" "${COMPARISON_DIR}" "${LOG_DIR}"
|
|
||||||
if [[ ! -f "${MANIFEST}" ]]; then
|
|
||||||
printf 'label\toriginal_dir\n' > "${MANIFEST}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
RUN_ID="${RUN_ID:-$(date +%Y%m%d_%H%M%S)}"
|
|
||||||
LOG_FILE="${LOG_DIR}/run_followup_${RUN_ID}.log"
|
|
||||||
exec > >(tee -a "${LOG_FILE}") 2>&1
|
|
||||||
|
|
||||||
step() {
|
|
||||||
echo
|
|
||||||
echo "============================================================"
|
|
||||||
echo "== $*"
|
|
||||||
echo "============================================================"
|
|
||||||
}
|
|
||||||
|
|
||||||
run() {
|
|
||||||
echo
|
|
||||||
echo ">>> $*"
|
|
||||||
"$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
write_config() {
|
|
||||||
local name="$1"
|
|
||||||
cat > "${CONFIG_DIR}/${name}.toml"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Запускает команду, находит созданный ею каталог в results/ и переносит его
|
|
||||||
# в results/followup/<label>. Так у каждого эксперимента появляется
|
|
||||||
# стабильное имя, а command.txt фиксирует точную команду.
|
|
||||||
run_labeled() {
|
|
||||||
local label="$1"
|
|
||||||
shift
|
|
||||||
local before after dir dest
|
|
||||||
before="$(mktemp)"
|
|
||||||
after="$(mktemp)"
|
|
||||||
find "${RESULTS_DIR}" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort > "${before}"
|
|
||||||
run "$@"
|
|
||||||
find "${RESULTS_DIR}" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort > "${after}"
|
|
||||||
dir="$(comm -13 "${before}" "${after}" | head -n 1)"
|
|
||||||
rm -f "${before}" "${after}"
|
|
||||||
if [[ -z "${dir}" ]]; then
|
|
||||||
echo "ОШИБКА: команда не создала каталог результатов (${label})" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
dest="${FOLLOWUP_DIR}/${label}"
|
|
||||||
if [[ -e "${dest}" ]]; then
|
|
||||||
if [[ "${FORCE}" == "1" ]]; then
|
|
||||||
rm -rf "${dest}"
|
|
||||||
else
|
|
||||||
echo "ОШИБКА: ${dest} уже существует. Задайте FORCE=1 или удалите каталог." >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
mv "${RESULTS_DIR}/${dir}" "${dest}"
|
|
||||||
printf '%q ' "$@" > "${dest}/command.txt"
|
|
||||||
printf '\n' >> "${dest}/command.txt"
|
|
||||||
printf '%s\t%s\n' "${label}" "${dir}" >> "${MANIFEST}"
|
|
||||||
echo "[followup] ${label} -> ${dest}"
|
|
||||||
}
|
|
||||||
|
|
||||||
latest_dir() {
|
|
||||||
local prefix="$1"
|
|
||||||
ls -1dt "${RESULTS_DIR}/${prefix}"_* 2>/dev/null | head -n 1 || true
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "Начало follow-up серии: $(date)"
|
|
||||||
echo "Интерпретатор: ${PYTHON}"
|
|
||||||
echo "Повторы: main=${REPEATS_MAIN}, grid=${REPEATS_GRID}, sweep=${REPEATS_SWEEP}, ngram=${REPEATS_NGRAM}, final=${REPEATS_FINAL}"
|
|
||||||
echo "Тяжёлые стадии: grid=${RUN_GRID}, seeds=${RUN_SEEDS}, final=${RUN_FINAL}, controls=${RUN_CONTROLS}"
|
|
||||||
echo "Каталог результатов: ${FOLLOWUP_DIR}"
|
|
||||||
echo "Лог: ${LOG_FILE}"
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# Конфиги признакового пространства. CLI не умеет менять lsa_components,
|
|
||||||
# min_df, n-gram ranges и groups, поэтому параметры задаются через TOML.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
step "0. Генерация конфигов"
|
|
||||||
|
|
||||||
write_config lsa_content_k300 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "lsa_content"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
lsa_components = 300
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config lsa_content_k400 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "lsa_content"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
lsa_components = 400
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config lsa_char_k300 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "lsa_char"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
lsa_components = 300
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config lsa_pos_k300 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "lsa_pos"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
lsa_components = 300
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config stylometry_pos_content300 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
lsa_variants = ["content"]
|
|
||||||
lsa_components = 300
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config stylometry_pos_pos300 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
lsa_variants = ["pos"]
|
|
||||||
lsa_components = 300
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config stylometry_pos_lsa_k300 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
lsa_variants = ["word", "pos"]
|
|
||||||
lsa_components = 300
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config groups_lean1 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
groups = ["length", "lexical", "vocabulary", "characters", "punctuation", "pronouns", "syntax", "readability", "dialogue"]
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config groups_lean2 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
groups = ["length", "lexical", "characters", "punctuation", "pronouns", "syntax", "dialogue"]
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config groups_lean2_content300 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
groups = ["length", "lexical", "characters", "punctuation", "pronouns", "syntax", "dialogue"]
|
|
||||||
lsa_variants = ["content"]
|
|
||||||
lsa_components = 300
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config min_df2 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
min_df = 2
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config min_df5 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
min_df = 5
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config char_max10000 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
char_max_features = 10000
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config char_ngram_2_4 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
char_ngram_range = [2, 4]
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config char_ngram_3_5 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
char_ngram_range = [3, 5]
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config pos_ngram_1_2 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
pos_ngram_range = [1, 2]
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config pos_ngram_1_4 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
pos_ngram_range = [1, 4]
|
|
||||||
EOF
|
|
||||||
|
|
||||||
write_config pos_max1000 <<'EOF'
|
|
||||||
[experiment]
|
|
||||||
preset = "stylometry_pos_lsa"
|
|
||||||
model = "logreg"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
pos_max_features = 1000
|
|
||||||
EOF
|
|
||||||
|
|
||||||
echo "Сгенерировано конфигов: $(find "${CONFIG_DIR}" -name '*.toml' | wc -l)"
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F0. Проверка окружения и воспроизведение опорных результатов.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
step "F0. Проверка окружения и опорные запуски"
|
|
||||||
|
|
||||||
run "${PYTHON}" scripts/check_environment.py
|
|
||||||
if [[ "${SKIP_TESTS}" != "1" ]]; then
|
|
||||||
run "${PYTHON}" -m pytest -q
|
|
||||||
fi
|
|
||||||
|
|
||||||
run_labeled ref_logreg \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled ref_nested_logreg \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model logreg --folds 5 --nested --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled ref_no_lsa \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled ref_stylometry \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F1. Сравнение моделей на одном признаковом пространстве, 5 повторов.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
step "F1. Сравнение моделей (5 повторов + nested)"
|
|
||||||
|
|
||||||
run_labeled model_rf_default \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled model_et_default \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model extra_trees --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled model_svc_default \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model linear_svc --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled model_knn_default \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model knn --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled model_rf_nested \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --nested --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled model_et_nested \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model extra_trees --folds 5 --nested --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled model_svc_nested \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model linear_svc --folds 5 --nested --seed "${SEED}"
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F2. Сетка вокруг лучшей модели (random forest по умолчанию).
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
if [[ "${RUN_GRID}" == "1" ]]; then
|
|
||||||
step "F2. Сетка random forest / extra trees"
|
|
||||||
|
|
||||||
for depth in None 30 40; do
|
|
||||||
for leaf in 1 2 3; do
|
|
||||||
if [[ "${depth}" == "None" && "${leaf}" == "1" ]]; then
|
|
||||||
continue # это model_rf_default
|
|
||||||
fi
|
|
||||||
if [[ "${depth}" == "None" ]]; then
|
|
||||||
depth_json="null"
|
|
||||||
else
|
|
||||||
depth_json="${depth}"
|
|
||||||
fi
|
|
||||||
run_labeled "rf_d${depth}_l${leaf}" \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}" \
|
|
||||||
--model-params "{\"max_depth\": ${depth_json}, \"min_samples_leaf\": ${leaf}}"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
for max_features in 0.05 0.1; do
|
|
||||||
for n_estimators in 400 800; do
|
|
||||||
run_labeled "rf_mf${max_features}_n${n_estimators}" \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}" \
|
|
||||||
--model-params "{\"max_features\": ${max_features}, \"n_estimators\": ${n_estimators}, \"max_depth\": null, \"min_samples_leaf\": 1}"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
run_labeled rf_n800_sqrt \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}" \
|
|
||||||
--model-params '{"n_estimators": 800, "max_depth": null, "min_samples_leaf": 1}'
|
|
||||||
|
|
||||||
run_labeled rf_cw_balanced \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}" \
|
|
||||||
--model-params '{"class_weight": "balanced"}'
|
|
||||||
|
|
||||||
run_labeled rf_cw_none \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}" \
|
|
||||||
--model-params '{"class_weight": null}'
|
|
||||||
|
|
||||||
run_labeled et_dNone_l2 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model extra_trees --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}" \
|
|
||||||
--model-params '{"max_depth": null, "min_samples_leaf": 2}'
|
|
||||||
|
|
||||||
run_labeled et_d30_l1 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model extra_trees --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}" \
|
|
||||||
--model-params '{"max_depth": 30, "min_samples_leaf": 1}'
|
|
||||||
|
|
||||||
run_labeled et_d30_l2 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model extra_trees --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}" \
|
|
||||||
--model-params '{"max_depth": 30, "min_samples_leaf": 2}'
|
|
||||||
|
|
||||||
# Лучшая точка сетки проверяется на 5 повторах. Это разведочный выбор:
|
|
||||||
# для честной итоговой оценки нужен nested CV (см. final_rf_nested и
|
|
||||||
# обсуждение в FOLLOWUP_EXPERIMENTS.md).
|
|
||||||
step "F2.1. Лучшая точка сетки RF на 5 повторах"
|
|
||||||
BEST_JSON="$("${PYTHON}" - "${FOLLOWUP_DIR}" <<'PY'
|
|
||||||
import glob
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
root = sys.argv[1]
|
|
||||||
candidates = []
|
|
||||||
for path in glob.glob(os.path.join(root, "rf_*")):
|
|
||||||
metadata_path = os.path.join(path, "run_metadata.json")
|
|
||||||
pooled_path = os.path.join(path, "pooled_metrics.csv")
|
|
||||||
if not (os.path.exists(metadata_path) and os.path.exists(pooled_path)):
|
|
||||||
continue
|
|
||||||
with open(metadata_path, encoding="utf-8") as stream:
|
|
||||||
metadata = json.load(stream)
|
|
||||||
pooled = pd.read_csv(pooled_path)
|
|
||||||
params = metadata.get("config", {}).get("model_params") or {}
|
|
||||||
candidates.append(
|
|
||||||
(float(pooled["macro_f1"].mean()), os.path.basename(path), json.dumps(params, ensure_ascii=False))
|
|
||||||
)
|
|
||||||
if candidates:
|
|
||||||
candidates.sort(reverse=True)
|
|
||||||
print(f"{candidates[0][1]}\t{candidates[0][2]}")
|
|
||||||
PY
|
|
||||||
)"
|
|
||||||
if [[ -n "${BEST_JSON}" ]]; then
|
|
||||||
BEST_LABEL="${BEST_JSON%%$'\t'*}"
|
|
||||||
BEST_PARAMS="${BEST_JSON#*$'\t'}"
|
|
||||||
echo "[followup] лучшая точка сетки: ${BEST_LABEL}, параметры: ${BEST_PARAMS}"
|
|
||||||
run_labeled rf_grid_best_5 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}" \
|
|
||||||
--model-params "${BEST_PARAMS}"
|
|
||||||
else
|
|
||||||
echo "[followup] не удалось выбрать лучшую точку сетки RF"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
echo "F2 пропущена (RUN_GRID=${RUN_GRID})."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F3. LSA: тема против стиля. Перебор k и подтверждение на 5 повторах.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
step "F3. LSA: варианты, число компонент и объединение с признаками"
|
|
||||||
|
|
||||||
run_labeled lsa_sweep \
|
|
||||||
"${PYTHON}" -m stylometry.cli lsa-sweep \
|
|
||||||
--variants content,char,word,pos,fw --components 100,200,300,400 \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_SWEEP}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled lsa_content_k300 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/lsa_content_k300.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled lsa_content_k400 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/lsa_content_k400.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled lsa_char_k300 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/lsa_char_k300.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled lsa_pos_k300 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/lsa_pos_k300.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled stylometry_pos_content300 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/stylometry_pos_content300.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled stylometry_pos_pos300 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/stylometry_pos_pos300.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled stylometry_pos_lsa_k300 \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/stylometry_pos_lsa_k300.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F4. Абляция групп признаков на 5 повторах и «худые» наборы.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
step "F4. Абляция групп признаков и lean-наборы"
|
|
||||||
|
|
||||||
run_labeled ablate_full \
|
|
||||||
"${PYTHON}" -m stylometry.cli ablate --preset stylometry_pos_lsa \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
for name in groups_lean1 groups_lean2 groups_lean2_content300; do
|
|
||||||
run_labeled "${name}" \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/${name}.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
done
|
|
||||||
|
|
||||||
run_labeled groups_lean1_rf \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/groups_lean1.toml" \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled groups_lean2_rf \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/groups_lean2.toml" \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F5. Настройка символьных и POS n-грамм.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
step "F5. Символьные и POS n-граммы"
|
|
||||||
|
|
||||||
for name in min_df2 min_df5 char_max10000 char_ngram_2_4 char_ngram_3_5; do
|
|
||||||
run_labeled "${name}" \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/${name}.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_NGRAM}" --seed "${SEED}"
|
|
||||||
done
|
|
||||||
|
|
||||||
for name in pos_ngram_1_2 pos_ngram_1_4 pos_max1000; do
|
|
||||||
run_labeled "${name}" \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/${name}.toml" \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_NGRAM}" --seed "${SEED}"
|
|
||||||
done
|
|
||||||
|
|
||||||
run_labeled min_df2_rf \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/min_df2.toml" \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled char_max10000_rf \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --config "${CONFIG_DIR}/char_max10000.toml" \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F6. Балансировка классов.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
step "F6. class_weight: balanced против none"
|
|
||||||
|
|
||||||
run_labeled classweight_logreg_none \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}" \
|
|
||||||
--model-params '{"class_weight": null}'
|
|
||||||
|
|
||||||
run_labeled classweight_svc_none \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model linear_svc --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}" \
|
|
||||||
--model-params '{"class_weight": null}'
|
|
||||||
|
|
||||||
run_labeled classweight_rf_none \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}" \
|
|
||||||
--model-params '{"class_weight": null}'
|
|
||||||
|
|
||||||
run_labeled classweight_rf_balanced \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}" \
|
|
||||||
--model-params '{"class_weight": "balanced"}'
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F7. Устойчивость к seed.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
if [[ "${RUN_SEEDS}" == "1" ]]; then
|
|
||||||
step "F7. Устойчивость к seed (logreg и random forest)"
|
|
||||||
for seed in 7 2024 1337; do
|
|
||||||
run_labeled "seed_logreg_${seed}" \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${seed}"
|
|
||||||
|
|
||||||
run_labeled "seed_rf_${seed}" \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_MAIN}" --seed "${seed}" \
|
|
||||||
--model-params "{\"random_state\": ${seed}}"
|
|
||||||
done
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
echo "F7 пропущена (RUN_SEEDS=${RUN_SEEDS})."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F8. Финальная модель, отчёты и независимые проверки.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
if [[ "${RUN_FINAL}" == "1" ]]; then
|
|
||||||
step "F8. Финальная модель и отчёты"
|
|
||||||
|
|
||||||
run_labeled final_rf \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --repeats "${REPEATS_FINAL}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled final_rf_nested \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset stylometry_pos_lsa \
|
|
||||||
--model random_forest --folds 5 --nested --seed "${SEED}"
|
|
||||||
|
|
||||||
FINAL_DIR="${FOLLOWUP_DIR}/final_rf"
|
|
||||||
if [[ -d "${FINAL_DIR}" ]]; then
|
|
||||||
run "${PYTHON}" -m stylometry.cli length-report \
|
|
||||||
--run-dir "${FINAL_DIR}" --seed "${SEED}"
|
|
||||||
for group in gender age_group species; do
|
|
||||||
run "${PYTHON}" -m stylometry.cli subgroup-report \
|
|
||||||
--run-dir "${FINAL_DIR}" --group "${group}"
|
|
||||||
done
|
|
||||||
run "${PYTHON}" -m stylometry.cli compare \
|
|
||||||
--run-a "${FINAL_DIR}" --run-b "${FOLLOWUP_DIR}/ref_logreg" \
|
|
||||||
--out "${COMPARISON_DIR}/final_rf_vs_ref_logreg.json" --seed "${SEED}"
|
|
||||||
run "${PYTHON}" -m stylometry.cli compare \
|
|
||||||
--run-a "${FINAL_DIR}" --run-b "${FOLLOWUP_DIR}/ref_no_lsa" \
|
|
||||||
--out "${COMPARISON_DIR}/final_rf_vs_ref_no_lsa.json" --seed "${SEED}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
run_labeled verify_full_42 \
|
|
||||||
"${PYTHON}" -m stylometry.cli verify --preset stylometry_pos_lsa \
|
|
||||||
--folds 5 --seed 42
|
|
||||||
run_labeled verify_full_7 \
|
|
||||||
"${PYTHON}" -m stylometry.cli verify --preset stylometry_pos_lsa \
|
|
||||||
--folds 5 --seed 7
|
|
||||||
run_labeled verify_full_2024 \
|
|
||||||
"${PYTHON}" -m stylometry.cli verify --preset stylometry_pos_lsa \
|
|
||||||
--folds 5 --seed 2024
|
|
||||||
|
|
||||||
run_labeled delta_cosine \
|
|
||||||
"${PYTHON}" -m stylometry.cli delta --features 500,1000,2000 \
|
|
||||||
--metrics cosine --folds 5 --repeats "${REPEATS_GRID}" --seed "${SEED}"
|
|
||||||
|
|
||||||
for clusters in 3 5 8; do
|
|
||||||
run_labeled "cluster_k${clusters}" \
|
|
||||||
"${PYTHON}" -m stylometry.cli cluster --preset stylometry_pos_lsa \
|
|
||||||
--clusters "${clusters}" --seed "${SEED}"
|
|
||||||
done
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
echo "F8 пропущена (RUN_FINAL=${RUN_FINAL})."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# F9. Контроли: нижние границы, near-duplicates и перестановка меток.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
if [[ "${RUN_CONTROLS}" == "1" ]]; then
|
|
||||||
step "F9. Контроли"
|
|
||||||
|
|
||||||
run_labeled control_length_logreg \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset length \
|
|
||||||
--model logreg --folds 5 --repeats "${REPEATS_MAIN}" --seed "${SEED}"
|
|
||||||
|
|
||||||
run_labeled control_length_dummy \
|
|
||||||
"${PYTHON}" -m stylometry.cli run --preset length \
|
|
||||||
--model dummy --folds 5 --repeats 1 --seed "${SEED}"
|
|
||||||
|
|
||||||
step "F9.1. Поиск near-duplicates"
|
|
||||||
"${PYTHON}" - "${FOLLOWUP_DIR}" <<'PY'
|
|
||||||
from pathlib import Path
|
|
||||||
import sys
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import pandas as pd
|
|
||||||
from sklearn.feature_extraction.text import TfidfVectorizer
|
|
||||||
from sklearn.metrics.pairwise import cosine_similarity
|
|
||||||
|
|
||||||
from stylometry.datasets import load_feature_frame
|
|
||||||
|
|
||||||
frame = load_feature_frame(verbose=False)
|
|
||||||
matrix = TfidfVectorizer(analyzer="char_wb", ngram_range=(3, 5), min_df=1).fit_transform(
|
|
||||||
frame["text"]
|
|
||||||
)
|
|
||||||
similarity = cosine_similarity(matrix)
|
|
||||||
rows = np.triu_indices_from(similarity, k=1)
|
|
||||||
values = similarity[rows]
|
|
||||||
threshold = 0.8
|
|
||||||
mask = values >= threshold
|
|
||||||
pairs = pd.DataFrame(
|
|
||||||
{
|
|
||||||
"line_id_a": frame.iloc[rows[0][mask]]["line_id"].to_numpy(),
|
|
||||||
"character_a": frame.iloc[rows[0][mask]]["character"].to_numpy(),
|
|
||||||
"text_a": frame.iloc[rows[0][mask]]["text"].to_numpy(),
|
|
||||||
"line_id_b": frame.iloc[rows[1][mask]]["line_id"].to_numpy(),
|
|
||||||
"character_b": frame.iloc[rows[1][mask]]["character"].to_numpy(),
|
|
||||||
"text_b": frame.iloc[rows[1][mask]]["text"].to_numpy(),
|
|
||||||
"cosine": values[mask],
|
|
||||||
"same_character": frame.iloc[rows[0][mask]]["character"].to_numpy()
|
|
||||||
== frame.iloc[rows[1][mask]]["character"].to_numpy(),
|
|
||||||
}
|
|
||||||
).sort_values("cosine", ascending=False)
|
|
||||||
out_dir = Path(sys.argv[1]) / "negative_control"
|
|
||||||
out_dir.mkdir(parents=True, exist_ok=True)
|
|
||||||
pairs.to_csv(out_dir / "near_duplicates.csv", index=False, encoding="utf-8-sig")
|
|
||||||
print(f"[near-duplicates] пар с cosine >= {threshold}: {len(pairs)}")
|
|
||||||
if not pairs.empty:
|
|
||||||
print(pairs.head(10).to_string(index=False))
|
|
||||||
PY
|
|
||||||
|
|
||||||
step "F9.2. Контроль перестановкой меток"
|
|
||||||
"${PYTHON}" - "${FOLLOWUP_DIR}" <<'PY'
|
|
||||||
from pathlib import Path
|
|
||||||
import sys
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
from stylometry.cv import run_repeated_cv
|
|
||||||
from stylometry.datasets import load_feature_frame
|
|
||||||
from stylometry.pipelines import build_pipeline, preset_config
|
|
||||||
|
|
||||||
frame = load_feature_frame(verbose=False)
|
|
||||||
y = frame["character"].to_numpy()
|
|
||||||
config = preset_config("stylometry_pos_lsa")
|
|
||||||
rows = []
|
|
||||||
for seed in (42, 7, 2024):
|
|
||||||
rng = np.random.default_rng(seed)
|
|
||||||
shuffled = rng.permutation(y)
|
|
||||||
pipeline = build_pipeline(config, "logreg")
|
|
||||||
result = run_repeated_cv(
|
|
||||||
pipeline,
|
|
||||||
frame,
|
|
||||||
shuffled,
|
|
||||||
n_splits=5,
|
|
||||||
n_repeats=1,
|
|
||||||
seed=seed,
|
|
||||||
model_name="permuted_logreg",
|
|
||||||
verbose=False,
|
|
||||||
)
|
|
||||||
pooled, _ = result.pooled_summary()
|
|
||||||
row = pooled.iloc[0].to_dict()
|
|
||||||
row["permutation_seed"] = seed
|
|
||||||
rows.append(row)
|
|
||||||
out_dir = Path(sys.argv[1]) / "negative_control"
|
|
||||||
out_dir.mkdir(parents=True, exist_ok=True)
|
|
||||||
table = pd.DataFrame(rows)
|
|
||||||
table.to_csv(out_dir / "permutation_logreg.csv", index=False, encoding="utf-8-sig")
|
|
||||||
print(table[["permutation_seed", "macro_f1", "accuracy", "top3_accuracy"]].to_string(index=False))
|
|
||||||
print(f"[permutation] средний macro-F1: {table['macro_f1'].mean():.4f}")
|
|
||||||
PY
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
echo "F9 пропущена (RUN_CONTROLS=${RUN_CONTROLS})."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# Сводка по всем запускам и парные сравнения по повторам.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
step "Сводка follow-up"
|
|
||||||
|
|
||||||
PAIRS=(
|
|
||||||
"model_rf_default:ref_logreg"
|
|
||||||
"model_rf_default:ref_no_lsa"
|
|
||||||
"model_rf_default:model_svc_default"
|
|
||||||
"rf_grid_best_5:model_rf_default"
|
|
||||||
"model_svc_default:ref_logreg"
|
|
||||||
"ref_no_lsa:ref_logreg"
|
|
||||||
"stylometry_pos_content300:ref_no_lsa"
|
|
||||||
"stylometry_pos_pos300:ref_no_lsa"
|
|
||||||
"stylometry_pos_lsa_k300:ref_logreg"
|
|
||||||
"groups_lean1:ref_logreg"
|
|
||||||
"groups_lean2:ref_logreg"
|
|
||||||
"groups_lean2_content300:ref_logreg"
|
|
||||||
"groups_lean1_rf:model_rf_default"
|
|
||||||
"groups_lean2_rf:model_rf_default"
|
|
||||||
"min_df2:ref_logreg"
|
|
||||||
"char_max10000:ref_logreg"
|
|
||||||
"char_ngram_2_4:ref_logreg"
|
|
||||||
"char_ngram_3_5:ref_logreg"
|
|
||||||
"pos_ngram_1_2:ref_logreg"
|
|
||||||
"pos_ngram_1_4:ref_logreg"
|
|
||||||
"pos_max1000:ref_logreg"
|
|
||||||
"min_df2_rf:model_rf_default"
|
|
||||||
"char_max10000_rf:model_rf_default"
|
|
||||||
"classweight_logreg_none:ref_logreg"
|
|
||||||
"classweight_svc_none:model_svc_default"
|
|
||||||
"classweight_rf_none:model_rf_default"
|
|
||||||
"classweight_rf_balanced:model_rf_default"
|
|
||||||
"final_rf:ref_logreg"
|
|
||||||
"final_rf:ref_no_lsa"
|
|
||||||
"final_rf:model_rf_default"
|
|
||||||
"final_rf:final_rf_nested"
|
|
||||||
"control_length_logreg:ref_logreg"
|
|
||||||
)
|
|
||||||
|
|
||||||
run "${PYTHON}" scripts/analyze_followup.py \
|
|
||||||
--followup-dir "${FOLLOWUP_DIR}" \
|
|
||||||
--pairs "${PAIRS[@]}" \
|
|
||||||
--n-boot 1000 --seed "${SEED}"
|
|
||||||
|
|
||||||
step "Готово"
|
|
||||||
echo "Конец follow-up серии: $(date)"
|
|
||||||
echo
|
|
||||||
echo "Результаты: ${FOLLOWUP_DIR}"
|
|
||||||
echo "Сводка: ${FOLLOWUP_DIR}/summary.csv"
|
|
||||||
echo "Сравнения: ${FOLLOWUP_DIR}/comparisons.csv"
|
|
||||||
echo "Лог: ${LOG_FILE}"
|
|
||||||
140
lab1/scripts/run_tuning_experiments.sh
Executable file
140
lab1/scripts/run_tuning_experiments.sh
Executable file
@@ -0,0 +1,140 @@
|
|||||||
|
#!/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>"
|
||||||
Reference in New Issue
Block a user