保研定位社区里,申请者写下自己的背景和目标,其他人投票评价“不行”“刚好”或“OQ”。OQ 是 overqualified 的缩写,表示投票者认为这份背景超过了目标所需的水平。同一份背景可以收到不同评价,这种分歧本身也是数据。
baoyan-vote 项目尝试从这些投稿中学习:给定背景和申请目标,社区会怎样评价? 本文从 1,737 条投稿出发,介绍数据观察、文本整理和模型实验,最后用一个浏览器内的预测工具展示结果。最值得讨论的是,哪些信息应该保留,以及实验是否支持为它们增加模型复杂度。
这里预测的是社区评价分布。数据没有真实录取结果,因此输出不代表录取概率。
社区投稿中的背景、目标与评价
数据来自保研定位投票网站,使用 2026 年 9 月 18 日保存的投稿快照,共 1,737 条投稿、77,037 张票。每条投稿包含本科层次、成绩排名、英语与科研竞赛经历,以及申请目标和三类投票数。1
本科背景与申请意向
样本中,211、末九和中九本科合计占 74.0%;申请目标则集中在华五和中九。分组后,目标的差异更清楚:中九、末九本科最常填写华五,211、双非、四非本科最常填写中九。2
这些差异也说明,定位模型需要同时读取背景与目标。同样的成绩和科研经历,搭配不同申请目标,可能得到不同的评价。
投票分布与样本权重
“刚好”占全部投票的约六成。不过,统计投票有两种自然的方式:
- 每张票等权:合并所有票,热门投稿贡献更多。
- 每条投稿等权:先计算每条投稿的三类比例,再对有票投稿取平均。
两种口径在这份数据上比较接近,但对应不同的学习目标:模型应该更重视热门投稿,还是让每份背景拥有相同权重?后面的实验会比较这两种选择。
另一项差异来自票数多少。投稿票数的中位数为 29,最多有 362 票;只有一票时,三类比例必然集中在一个选项上。低票投稿的评价较不稳定,直接删除又会减少可学习的背景。投票多少既影响标签质量,也影响数据覆盖,筛选门槛需要用实验判断。3
自由文本的结构化处理
模型需要的是可比较的背景,原始投稿却混合了事实、补充说明和未来计划。整理这一步,首先要判断一段话究竟描述了什么。
成果、补充与计划的区分
例如,科研栏写“一篇论文在投”,补充栏又写“上面那篇刚录用,预计还会再投一篇”。这是一个虚构例子,其中已有成果只有一项:补充文字更新了进度,未来计划应另外记录。
项目把处理分成两层。规则检查排名与总人数、英语考试与分数范围、票数之和等明确约束;Typesafe Jev 负责离线整理自由文本,识别成果类型、进度、作者位置、数量及条目之间的关系,再把补充属性关联回原成果。4
整理时需要保留几种重要区别:
- 没填写与明确没有:科研情况未知,和明确没有科研,应成为不同状态。
- 已有成果与未来计划:在投、录用、计划投稿分别记录,计划不计入当前成果数量。
- 数量明确与数量未知:两篇明确的论文,加上一条数量未知的论文记录,表示“至少三篇”,并保留其中一条数量未知的信息。
这些区别会直接改变模型看到的背景。把空缺全填成零,或者把计划算成已完成成果,都会在训练前引入错误。
样本筛选与特征表示
清洗后,项目保留 1,379 条可监督投稿。零票、目标缺失、背景校验失败、语义处理未完成等记录无法提供完整的训练依据,重复投稿也需要处理。自动语义判断仍可能遗漏成果关系或误排记录,具体质量检查放在补充说明中。5
每份背景最终转换为 114 列特征,主要包含三组信息:
- 基础背景:排名除以同口径总人数,同时保留人数;英语保留考试类型与原始分数。
- 申请目标与偏好:目标层次按集合编码,学位偏好区分接受、排除和未知。
- 成果属性与数量:按科研类型、进度、作者位置,以及奖项范围、等级等汇总,保留已知数量和未知数量条目。
此外,模型对 211 → 末九 → 中九 → 华五 → 清北 增加局部顺序编码,让树模型更容易比较本科与目标。其他层次仍保留类别信息。这个顺序是否有帮助,以及成果应当怎样聚合,都会进入后续对照实验。6
社区评价分布的建模
假设一条投稿收到“不行”2 票、“刚好”7 票、“OQ”1 票,它的监督目标就是
\[ q=(0.2,\;0.7,\;0.1). \]
这类目标称为软标签:保留每一类的比例,让模型学习社区的分歧。模型输出三类概率 \(p\),通过交叉熵衡量它与投票分布的差异:
\[ L=-\sum_{c=1}^{3}q_c\log p_c. \]
当一个真实有票的类别被赋予很低的概率时,损失会增大。相比只学习最高票类别,这样的目标能区分“大家基本同意刚好”和“主要倾向刚好,但分歧很大”。
CatBoost 与表格特征
项目采用 CatBoost,一种梯度提升决策树算法。它适合这里约千条样本、数值与类别混合、存在缺失值的表格输入,也能学习条件之间的交互:同样的排名比例,在不同本科层次和申请目标下,可能产生不同意义。
长文本的理解已在清洗阶段完成,因此模型输入可以逐项检查。训练与预测还共用一套特征转换,保证表单里的一项成果与训练数据中的同类成果按同样方式处理。
训练时,一条投稿最多展开为三行相同特征,分别标记三个类别,以投票比例作为权重。这些行的加权损失正好得到上面的公式。每条投稿展开后的权重之和为 1,实现了投稿等权;改用原始票数作为权重,就得到每票等权训练。
对照实验中的取舍
比较方案前,需要避免模型在验证时遇到已经见过的背景。项目先把可能相关的匿名投稿归组,同组记录始终放在同一侧,再划分出 1,241 条开发投稿与 138 条留出投稿。
开发实验采用五折分组交叉验证:每次用四折训练、预测剩余一折,合并得到全部投稿的折外预测(OOF)。以下柱状图比较这些预测的票数加权交叉熵(CE),越低越好。每组实验只适合内部比较,不能跨组排成统一榜单。7
投稿权重与层次顺序
给每条投稿相同权重,再加入本科与目标的局部顺序特征,取得了较好的结果。顺序特征使该模型的 CE、平均绝对误差等指标在五折中都改善;增加热门投稿的训练权重,并没有带来更好的票数加权 CE。
这支持保留“投稿等权 + 局部层次顺序”的组合:让每份背景参与学习,同时给模型提供与问题相关的比较信息。不同指标仍有取舍,例如每票等权的顺序模型在票数加权平均绝对误差上略好。8
低票筛选与模型复杂度
低票投稿看起来噪声更多,但筛选没有带来稳定收益。把训练门槛从至少 1 票提高到 5 票,CE 几乎不变;提高到 10、20 票后,表现反而下降。20 票门槛会移除开发人群中约 36% 的投稿。实验保留了相同的验证人群,因此这种退化不能用“验证集换了”解释。
增加模型复杂度的收益也很有限。树深从 5 提高到 8,训练拟合改善,折外 CE 基本停留在原处;改用两个累计概率模型表达“不行→刚好→OQ”的顺序,也未优于多分类模型。现有结果支持继续使用较浅的多分类树模型。9
相似背景检索与树模型
k 近邻(kNN)提供了一种直观方案:找到背景最相似的 \(k\) 条投稿,合并它们的投票,形成预测。
困难在于定义“相似”。学校、排名、英语、科研、竞赛和目标如何折算为同一个距离,需要人为设计。实验比较了普通类别距离与层次排序距离,并尝试不同邻居数量;这些配置的四项票数加权指标都落后于 CatBoost 参考模型。进一步搜索距离权重,改善仍很小。
近邻检索依然适合帮助读者理解样本,但当前测试结果更支持用 CatBoost 产生预测。10
成果数量与关联特征
成果表示的实验尤其值得关注。早期聚合会把部分计数截断到 3,使四项与十项成果失去区别。修复方法很直接:取消截断,补上已知数量总和与数量未知条目数,特征从 110 列增加到 114 列。
另一条路线是增加关联特征。例如,“一篇高等级论文、另一篇一作论文”与“同一篇论文既是高等级又是一作”应该有所区别。不过,把属性组合展开后,特征数量增至六百多列,大部分新增组合在开发集中从未出现。
“数量 + 关联”的主要 CE 仅比“仅数量”低约 0.000047,而仅数量方案在多项其他指标上更好、维度也低得多。最终采用的就是 114 列数量方案。对这份小数据,修复已经明确的信息损失,比增加大量稀疏组合更有收益。11
模型效果与结果解释
最终模型与一个简单基准比较:基准始终输出训练投稿的平均投票分布。超过它,才说明具体背景和目标提供了额外信息。
下面展示同一组 138 条留出投稿上的结果。图中同时比较 CE、平均绝对误差(MAE)、平方误差(Brier)和累计概率误差(RPS)相对基准的降低比例。这四项误差本身越低越好,图中的降低比例越高,改善越大。12
在投稿等权口径下,模型的 CE 比平均分布基准降低约 2.85%,MAE 降低约 10.69%。MAE 约为 0.12,表示对投稿和类别平均后,概率的绝对误差约为 12 个百分点。模型确实学到了一些信息,但改善幅度有限。
分布改善与类别区分
如果只显示最高概率类别,模型几乎总会给出“刚好”:
在有唯一最高票类别的 135 条留出记录上,模型判断正确 104 条,始终猜“刚好”则正确 103 条。完整概率分布的拟合有所改善,少数类别的识别仍然很弱。 这也是预测工具展示三类概率,而不只给一个结论的原因。
数量方案也没有让所有留出指标变好:相较旧版,它的 CE 和 MAE 略有退化。开发实验中的收益值得保留,面向新投稿的效果仍需要新的数据检验。13
模型使用的背景信息
SHAP 是一种把模型输出拆分为各特征贡献的方法。对训练样本的贡献取绝对值、平均后归一化,可以观察模型主要使用了哪些信息:
科研与经历、成绩排名、竞赛奖项占据较大份额,申请目标同样重要。模型学习的是“背景与目标是否匹配”,因此目标本身参与预测是合理的。这里的份额描述模型如何使用输入,不表示某类经历对真实录取的影响比例。14
浏览器中的预测工具
下面的表单使用同一套特征转换与已有模型。quarto-marimo 通过 Pyodide/WASM 在浏览器里运行 Python,Cloudflare Pages 只提供静态文件,填写的背景不需要发送到计算后端。15
本科与成绩留空表示未知;申请目标至少选择一项。科研和奖项可逐条添加,也可明确选择没有。可以固定其他条件,只修改目标层次、排名或论文进度,观察模型评价分布的变化。
总结
这项工作的关键在于让数据表示、学习目标与评估方式保持一致:用结构化背景保留文本中的事实和状态,用软标签保留投票分歧,再通过固定分组实验判断哪些设计值得采用。缺少这种一致性时,改进往往来自信息损失被修复,而看起来更复杂的方案并没有优势。
接下来更值得投入的是补充证据:用人工标注检查数量与成果关联的提取质量,收集未参与开发的新投稿,再检查不同背景下的误差和概率校准。这样才能判断,当前限制主要来自数据整理、样本覆盖,还是预测算法。
本文依据截至 2026 年 9 月 21 日的已有产物,清洗版本为 MVP-8,模型版本为 mvp-10-quantities-only。没有重新清洗、训练或调用语义 API。
可下载聚合统计与评估数据、本科—目标汇总表及模型导出校验记录。公开资源不含逐条投稿、投稿 ID 或认证信息。
项目内的主要依据包括:data/summary.json 的快照统计、docs/mvp8-quality-review.md 的清洗抽查、experiments/ 下各主题的 results.md、artifacts/model/evaluation.json 的最终指标,以及 docs/model-interpretability/ 的归因报告。聚合文件记录了来源哈希。
补充实验细节:
- 当前 CatBoost 固定为 350 轮、树深 5、学习率 0.045、叶子 L2 正则系数 6,损失函数为
MultiClass。 - 深度从 5 增至 8,训练 CE 从 0.879245 降至 0.874719,票数加权 OOF CE 从 0.900135 变为 0.900387。深度 7 的最低值为 0.900105,折间方向不一致。
- 两个累计概率模型的票数加权 OOF CE 为 0.900365,略差于多分类参考的 0.900135,RPS 也未改善。
- 数量方案上增加固定成果槽位后,特征扩至 171 列,票数加权 CE 从 0.890675 上升至 0.897005,两种权重下的四项指标在五折中均退化,未采用。
描述性图表来自公开汇总数据,实验图使用已有报告中的指标。原始数据与冻结划分仍保存在受控项目中,公开汇总文件不包含完整训练材料。
Footnotes
快照来源记录为浏览器导出,保存于 2026-09-18 10:56:19 UTC。采集程序检查重复 ID、非负整数票数及分项合计。统计单位为投稿,同一人可能多次提交;社区投稿和投票均存在自选择,不能代表全部保研学生。↩︎
图表沿用网站原始标签,不重新推断学校。C9、华五等分类可能交叠,不能将所有标签当作互斥的客观排名。原始目标缺失的 3 条投稿单列,描述统计使用全部原始记录,和后续训练样本的口径不同。↩︎
票数分布使用同一原始快照重新聚合:零票单列,有票投稿按 1–10、11–20……191–200 分组,严格大于 200 票的投稿合并。评价比例先按投稿计算,再在组内取平均;零票和空组比例未定义。公开数据只保存区间计数及平均比例,不包含逐条票数。↩︎
语义判断低于 0.8 的接受阈值,或所选答案与最高概率选项不一致时,降为未知;关联冲突保留审计记录。该阈值不能解释为标签准确率。Jev 仅参与历史清洗,已有执行的估算实际费用约 1.86 美元。↩︎
1,736 条完成语义处理,1 条失败。排除原因可以重叠;“虚构或真实性不确定”的 288 条包含保守误排,不能视为已确认虚假。训练前固定的 20 条定性抽查发现数量、条目关联和目标偏好仍会遗漏或误判,没有据此计算语义准确率。↩︎
局部顺序编码为 0–4,并记录已映射目标的最小值、最大值及已映射和未映射数量;C9、双非、四非的顺序位置缺失,原类别保留。模型没有单调约束。清洗后的目标可以是集合,与描述图的原始目标字段不同。投稿 ID、票数、点赞、评论及时间戳不进入预测特征。↩︎
背景分组依据学校、排名、英语、成果名称和文本相似度等线索,无法确认真实身份。先分组划分,再展开软标签训练行。五折指标合并折外预测计算;点图采用局部横轴。开发折和原始留出快照均参与过历史研究,因此本文报告回顾性结果,不作为新的独立盲测。↩︎
加入顺序特征后,投稿等权模型在两种评价权重下的 CE、MAE、Brier、RPS 均为 5/5 折改善。与每票等权顺序模型相比,其票数加权 MAE 约高 0.000140;训练权重和评估权重是两个独立选择。↩︎
筛票、深度及累计概率实验采用当时的原始特征与每票等权训练,分别改变一项设计,并非对当前数量模型重新调参。筛票只作用于训练折;背景覆盖减少可能影响结果,实验未单独确认这一因果机制。↩︎
两类距离均尝试 k=10,30,50,100,各自主要 CE 最优为 k=30。CatBoost 参考采用每票等权训练。后续嵌套分组验证搜索六块距离权重,使排序 kNN 的 CE 从 0.910665 降至 0.910469,RPS 反而变差;它只隔离此次权重搜索,无法消除此前方案选择的偏差。↩︎
成果实验均采用投稿等权和相同层次顺序特征。552 个新增关联特征中,426 个在开发集全为零。仅数量方案的投稿等权四项指标及票数加权 MAE、Brier 均优于数量加关联;相对基线,其主要 CE 在 4/5 折改善,其中一折贡献较大。↩︎
MAE 为三类概率绝对误差的平均;Brier 为三类概率平方误差之和;RPS 为按“不行→刚好→OQ”排序后两个累计概率误差平方的平均。概率误差不能换算为分类准确率。真实投票有分歧时,即使完美还原,CE 也可以大于零。↩︎
旧版 110 列模型的投稿等权留出 CE 为 0.897711,数量版为 0.898398;MAE 约从 0.11943 变为 0.11991,Brier 略降。项目没有依据这次留出审计继续调整候选或参数。↩︎
对训练侧 1,241 条投稿及三个类别的 SHAP 绝对贡献取平均,再归一化并按特征组加总。解释对象是模型原始分数(logit);相关特征及各组特征数量会影响份额。科研组含实习等经历信号。图中报告值舍入后合计 100.1%,未重新归一化,也未验证新样本稳定性。↩︎
预测使用 CatBoost 导出的纯 Python 模型,并保留共享特征处理;导出时对全部 1,379 条合格样本和合成背景检查与原生模型的概率一致性,容限为
1e-12。浏览器下载模型参数、运行时与依赖,首次需联网。改变输入得到的是模型响应,不能推导出对真实录取的因果影响。↩︎