ML机器学习 · 期末作业

一万七千条闲聊里
找出 260 条拼车

极端不平衡的中文短文本分类

每个点是一条帖子,红色是真正在找拼车的。1.5%
01问题

拼车需求,全埋在闲聊里

远

出门就得打车

学校在昌平,去地铁站、机场、高铁站都得打车,一趟一两百。

贵

两个人能对半摊

一个人掏全款不划算,凑上同伴,路费直接砍一半。

沉底

沉下去就没人看得到

求拼车的帖子混在失物招领、约饭、组队里,几分钟就被刷没。

→
两个论坛一天七八百条帖,真正要拼车的一两条。靠人翻,翻不过来。
01背景 · 这个作业从哪来

小程序被下架,才有了「同行雷达」

2026 年 4 月,我做了北化专属的拼车小程序「百花同行」,攒下 1,900+ 用户。后来它被下架了。

01

小程序被下架

因类目与合规问题,被微信强制下架,服务一度停摆。

→
02

重做 Web 与机器人

改做网页版和 QQ 机器人,先把服务撑住。

→
03

上线「同行雷达」

不再等同学自己发帖,主动去论坛把拼车帖捞出来。

→
雷达靠三道程序自动捞帖。这三道关长什么样,看下一页。
02原来的做法

三道关,第一道最糙

旧的三道关(本来就是全自动)

关键词

人工写的十几个词,带词放行。

→

JEV 初筛

剔掉明显不是拼车的。

→

LLM 填表

抽"几点、去哪",填不出作废。

现在:只换第一道,后面照旧

逻辑回归

学出来的分类器,给每条帖打分。

→

JEV 初筛

不变。

→

LLM 填表

不变。

→
第一道只认字面,带"拼车"就放行,约饭、吐槽全进来了。后两道本来就在自动跑,这次只换第一道。
03数据

1.7 万条帖,真正拼车的只有 1.5%

每个点是一条帖子,红点为真拼车。
17,304
两个校内论坛,9–10 月,去重后
260
真拼车帖 · 占比 1.5%
1~2
平均每天新出现的拼车帖
红点就是真拼车帖。
整屏找不出几个。
03数据 · 先得修的地方

这一列标签,不是人标的

数据里"是否拼车"那一列,是旧系统自动生成的。它只认填得出"几点、去哪"的帖子,填不出就丢,标成"不是"。

「有没有拼车去 ijoy 的,哪天都行」→ 没写具体日期,字段填不出,被丢掉
「西门有人拼车去地铁口吗,现在就一个人」→ 没写几点,字段填不出,被丢掉
「拼车去昌平区医院,下周二上午」→ 时间太笼统,对不上格子,被丢掉
✓
我逐条复核了含关键词的 433 条,找回 67 条被误删的真拼车。正例从 222 修正到 260,后面所有实验都用这套修正后的答案。
04评估 · 为什么不能看准确率

准确率在这里骗人

把所有帖子都判成"不是拼车",一行代码,准确率 98.5%。

可它一条拼车也没找到,系统等于没用。

实际是拼车
实际不是
判为拼车
0
抓对
0
误抓
判为不是
260
全部漏掉
17,044
判对

查准率 Precision

挑出来的帖子里,真正是拼车的占多少。挑得准不准。

查全率 Recall

所有真拼车里,成功挑出来的占多少。漏没漏。

05算法 · 模型内部

一条帖子,怎么算成"是拼车的概率"

1帖子文字一条论坛帖
→
2切成碎片2–3 字 n-gram
→
3每片两个数分量 xⱼ · 权重 wⱼ
→
4加权求和z = Σ wⱼxⱼ + b
→
5变概率p = σ(z)
这道模型就两个式子:
z = w₁x₁ + w₂x₂ + … + b
p = σ(z) = 1 / (1 + e−z)
xⱼ 碎片 j 在这条帖里的分量(帖里有多少)
wⱼ 碎片 j 的权重(它有多像拼车)
b  偏置,模型的默认倾向
z  净得分,所有证据加起来
p  是拼车的概率,0~1
05算法 · 第一步:分量 x

碎片在这条帖里有多重

先把帖子切成 2–3 字的碎片(按字切,专名、口语、错别字都不怕)。每个碎片算一个数 x,叫它在这条帖里的分量。
分量 = 词频 × 稀有度,再按长短归一
tf = 1 + log(出现次数)
idf = log((N+1) / (出现帖数+1)) + 1
x = tf · idf,再 L2 归一化
例:这条帖里的碎片"拼车"
N = 11,769,含"拼车"的帖 = 206
idf = ln(11770 / 207) + 1 = 5.04
tf = 1(出现 1 次)→ tf·idf = 5.04
全帖归一化因子 = 29.1
x = 5.04 ÷ 29.1 = 0.17
·
"的""了"遍地都是,idf 接近 0;"拼车""西山口"很罕见,x 就大。最后的归一化是让长帖短帖用同一把尺子。
05算法 · 第二步:加权求和 z

一条帖的分数,是各片贡献加起来

每个碎片有一个权重 w(它有多像拼车,下一页讲怎么来的)。它给这条帖的贡献 = w × x。全部相加,再加偏置 b,就是净得分 z。
碎片分量 x权重 w贡献 = x×w
拼车0.1721.6+3.7
地铁0.204.6+0.9
左右0.195.3+1.0
站的0.223.6+0.8
其余 18 个——+5.1
贡献合计+11.5
净得分 z
z = 贡献合计 + b
z = 11.5 + (−4.82)
z = 6.68
·
权重和贡献别混。w 是碎片本身值多少分,x 是它在这条帖里出现多强,相乘才是贡献。b 是默认倾向,这里为负,表示要几条证据一起才顶得过 0。
05算法 · 第三步:变成概率 p

把分数压成 0 到 1 的概率

p = σ(z) = 1 / (1 + e−z)
S 形(sigmoid)函数:把任意分数 z 压进 0~1,越像拼车越接近 1。
这条帖:z = 6.68
p = 1 / (1 + e−6.68)
e−6.68 ≈ 0.00125
p = 1 / 1.00125 = 0.999
→ 99.9% 是拼车,判"是"。
净得分 z概率 p判断
−20.12不是
00.50临界
20.88是
6.680.999是(这条帖)
·
阈值取 0.5,等价于"z > 0 就判是"。模型其实是在给每条帖算一个 z,再和 0 比。
05算法 · 第四步:权重怎么学

w 和 b 是试出来的

起点

w、b 全设 0

一开始对所有碎片一视同仁,每条帖都算不出区别。

→
猜一遍

逐条算 p,和真值比

每条帖算出 p,和"是不是拼车"的正确答案比,得到误差。

→
改

按误差调 w、b

真拼车被算低了,就抬高帖里碎片的 w;被算高了,就压低。

→
收敛

1.1 万条过 17 轮

反复 17 遍,w、b 稳定下来:"拼车"的 w 停在 +21.6,b 停在 −4.82。

!
正例只占 1.5%,不管它模型会"躺平"全判不是。所以给每条正例 26.9 倍权重,逼它重视这少数。
06结果

三种做法,同一张考卷

用 10 月 15 号之后的 5,535 条做盲测,里面有 41 条真拼车。模型从没见过它们。

做法判出几条其中真拼车查准率查全率
全判"不是拼车"00—0
关键词规则814150.6%100%
逻辑回归 · 阈值 0.5413790.2%90.2%
逻辑回归 · 阈值 0.4433990.7%95.1%
逻辑回归 · 阈值 0.061084138.0%100%

我原以为更准的筛子会更省。结果反过来:要一条不漏,模型得吐 108 条,关键词只要 81 条。

模型只在允许漏几条的时候划算。阈值 0.4,43 条候选,抓 95%,噪声还是 4 条。

06结果 · 交给后面的东西有多干净

把噪声从 40 条压到 4 条

默认挡位下,模型吐 41 条、其中噪声 4 条;关键词吐 81 条、其中噪声 40 条。

关键词规则
输出 81 条
真 41噪声 40

一半是噪声,约饭、吐槽全被捞了进来。

逻辑回归
输出 41 条
真 37噪声 4

九成是真的,代价是漏掉 4 条极短帖。

→
阈值降到 0.4,候选 43 条,召回 95%,噪声仍是 4 条。
06结果 · 打开看看

它自己学到了"拼车"该怎么搭配

模型给"加分"的碎片(权重越高越像拼车)
拼车
+21.6
车去
+7.7
拼车去
+7.0
车回
+6.4
左右
+5.3
地铁
+4.6
除了"拼车",车去、车回、左右、地铁这些搭配,关键词表里根本没有,是它从 219 条正例里自己数出来的。
它栽在哪:默认阈值下漏掉的 4 条

四条全是超短帖(23–53 字),只提了一次"拼车",没有地铁、时间这些搭配帮着撑分,总分压不过 0.5。

椅子乐团演出,有人一起回学校吗… → 0.06
找 25 号国能笔试拼车,石景山… → 0.19
有人去 25 号考试中心吗,可以拼车… → 0.41
改进方向:短文本证据不足,可以补"正文长度"当特征。
07结论

变的不是模型,是答案

51%────────→90%

同一个模型,一个参数都没改,只把那批错误标签修正了,查准率从 51% 跳到 90%。

→
模型的天花板由标准答案决定。复核 433 条,花了一小时左右。 90% 是上限。复核和模型看的是同一类线索,等于自己给自己判卷;真实水平在 51% 到 90% 之间。
08上线之后

还剩两件事没解决

已经换掉

第一道关键词换成逻辑回归

阈值按后面 JEV、LLM 的容量定。默认 0.5,想少漏就调低。

还没解决

短帖漏召回

漏掉的 4 条都是 23–53 字的短帖,只提了一次"拼车"。

还没解决

标签只复核了 433 条

只动了含关键词的那批,不含关键词的 1.6 万条没看过。

→
模型能换掉第一道,换不掉标签的问题。下一版先把正文长度做成特征。
09我的作品集

除了作业,我还在做这两个东西

校园出行

百花同行 · 同行雷达

北化专属的公益拼车平台。「同行雷达」自动聚合全校论坛的拼车帖。

1,900+ 用户 · bhtx.prom1se.cn
AI 助手

HerMemory

AI 的记忆是纯文本:随时可见、随时可改、可迁移,不藏在别人的云端黑箱里。

基于开源 Hermes
← → 翻页 · F 全屏