# Cross-Domain Results ## 这部分结果在回答什么问题 `results/cross-domain/` 不是 DS13 正式提交结果的重复拷贝,而是专门回答一个研究问题:当数据分布跨域变化时,仅靠一个全局 LR 是否还够用,还是应该按长度分桶后分别建模。 本仓库正式保留了两个跨域结论集: - `results/cross-domain/ds06/` - `results/cross-domain/ds07/` 它们都同时保存了: - `ensemble_meta.json` - `ensemble_lr_global_*_predictions.csv.gz` - `ensemble_lr_bucket_*_predictions.csv.gz` ## 分桶定义 跨域 bucket ensemble 的分桶不是手填经验值,而是脚本里固定编码并在正式结果中保留的长度区间: - `extreme_short = 0-75` - `short = 76-180` - `general = 181+` 对应实现可见: - `scripts/inference/run_cross_domain_ensemble.py` - `scripts/inference/run_logistic_regression_ensemble.py` ## bucket 权重是怎么来的 这里的“bucket 权重”同样不是人工拍脑袋给的。正式流程是: 1. 对每个 bucket 的 dev 子集单独收集 7 个 voter 分数。 2. 加入 `len_norm` 后做 `StandardScaler`。 3. 用 `LogisticRegression(lbfgs, C=1.0)` 在该 bucket 的 dev 子集上学习 LR。 4. 用该 bucket 的 dev 子集搜索最佳 F1 阈值。 5. 如果某个 bucket 的 dev 样本太少,则直接回退到 global LR。 因此,bucket ensemble 的核心不是“按桶给不同固定比例”,而是“按桶单独训练 LR;样本不够时回退”。 ## DS06 结果 DS06 的正式结果文件位于 `results/cross-domain/ds06/ensemble_meta.json`。 ### 总体结论 | 方案 | F1 | Precision | Recall | Accuracy | |---|---:|---:|---:|---:| | `lr_global` | 0.643836 | 0.979167 | 0.479592 | 0.734694 | | `lr_bucket` | 0.904255 | 0.944444 | 0.867347 | 0.908163 | DS06 上 bucket 方案比 global 提升非常明显,说明跨域条件下统一阈值和统一系数不够稳,长度分段后单独建模更有效。 ### DS06 的 fallback 情况 | Bucket | `n_dev` | 处理方式 | |---|---:|---| | `extreme_short` | 0 | 回退到 global | | `short` | 2 | 回退到 global | | `general` | 190 | 单独训练 bucket LR | `general` 桶学出的正式参数中,阈值为 `0.5376874712`,说明 DS06 的跨域适配并不是简单复用 global threshold,而是真的在足够样本的桶里重新拟合了一个局部 LR。 ## DS07 结果 DS07 的正式结果文件位于 `results/cross-domain/ds07/ensemble_meta.json`。 ### 总体结论 | 方案 | F1 | Precision | Recall | Accuracy | |---|---:|---:|---:|---:| | `lr_global` | 0.743119 | 0.975904 | 0.600000 | 0.792593 | | `lr_bucket` | 0.872340 | 0.836735 | 0.911111 | 0.866667 | DS07 也呈现出相同趋势:bucket LR 明显优于 global LR。 ### DS07 的 fallback 情况 | Bucket | `n_dev` | 处理方式 | |---|---:|---| | `extreme_short` | 0 | 回退到 global | | `short` | 2 | 回退到 global | | `general` | 266 | 单独训练 bucket LR | DS07 `general` 桶的正式阈值为 `0.4020108060`。这进一步说明 bucket 模型不是静态表,而是 dev 驱动的局部 LR。 ## 为什么 DS13 和 DS06 / DS07 不一样 这三个结果最需要区分的地方是 dev 规模: - DS13:`extreme_short=1`、`short=0`、`general=9`,3 个桶全部不够训练,所以 bucket 全部回退。 - DS06:只有 `general` 桶 dev 足够,因此只有 `general` 真正学出局部 LR。 - DS07:结论与 DS06 相同,也是只有 `general` 学出局部 LR。 所以不要把“仓库里保留了 bucket 逻辑”误解成“所有数据集都会有独立桶模型”。真正决定是否独立建模的是 dev 样本量。 ## 与探索期动态分桶投票的关系 仓库里还保留了探索期的动态分桶投票脚本,例如: - `scripts/train_eval/rules_and_fusion/run_dynamic_bucket_vote.py` - `src/enhanced_replica/voter_registry.py` 这些脚本里的 `bucket_weights` 属于研究路线 E06 的硬投票设定。正式跨域结论不是靠这些默认表直接得出的,而是以后续的 bucket LR 结果为准。看正式结果时,应当优先阅读: - `results/cross-domain/ds06/ensemble_meta.json` - `results/cross-domain/ds07/ensemble_meta.json` ## 可以直接复用的结论 - 如果 dev 很小,bucket 流程可能会保留,但最终会回退到 global。 - 如果某些长度桶有足够 dev 样本,bucket LR 能显著优于 global LR。 - 对当前这条研究线来说,跨域提升主要来自 `general` 桶的局部 LR,而不是来自人为设置一套长度权重表。