先把这三者分清:
| 部分 | 解决什么问题 | 判断依据怎么来 |
|---|---|---|
| KNN | 当前指纹最可能属于哪个座位? | 比较查询指纹与参考指纹的距离,近邻投票 |
| 决策树 | 当前指纹最可能属于哪个座位? | 从训练数据中学习特征分裂条件 |
| 占座规则引擎 | 这个座位应该进入什么业务状态? | 人制定的业务规则、持续时间和可信度阈值 |
1. 这次决策树具体预测什么?
它预测的是座位编号,例如 A-01、B-03,并不直接预测“有人”“无人”或“恶意占座”。
当前流程是:
手机上传 WiFi 扫描
↓
清洗、对齐、合并多帧
↓
KNN 或决策树识别座位
↓
检查可信度与证据质量
↓
结合连续命中次数、持续时间、用户会话等信息
↓
占座规则引擎给出建议
↓
后端状态机决定是否更新座位状态KNN 和决策树目前是可按模型版本切换的两条识别路径,还没有做二者联合投票。
2. 决策树吃进去的是什么数据?
实现位于 decision_tree.py。
训练数据每行包含扫描时间、设备、真实座位和各 AP 的 RSSI。先按照设备、批次、座位和时间划分连续采样窗口,默认每 5 帧合并一次,逐 AP 取中位数降噪。
随后构造两组特征:
- 相对 RSSI:每个有效 AP 的 RSSI,减去当前窗口有效 RSSI 的中位数。
- 存在标记:每个 AP 是否被扫描到,用
1/0表示。
例如:
原始 RSSI:[-50, -70, -80, -60]
中位数: -65
相对 RSSI:[15, -5, -15, 5]
存在标记:[1, 1, 1, 1]假设另一台手机整体读数偏高 4 dB:
原始 RSSI:[-46, -66, -76, -56]
中位数: -61
相对 RSSI:[15, -5, -15, 5]两台手机的相对特征相同,因此这种处理能降低整体 RSSI 偏移的影响。
缺失 AP 的相对值填 0,同时把存在标记设成 0,从而区分“缺失”与“恰好等于中位数”。
当前示例模型有 12 个 AP 维度,因此输入是 24 个特征。设备编号、真实座位标签、批次编号都不作为树的输入特征;真实座位只是训练时的正确答案。
这个方案也有代价:它丢失了整体信号强弱信息。两个座位如果只有整体 RSSI 不同,相对特征可能无法区分;不同频段的偏移不一致,也不能保证被消除。
3. 树是怎么训练出来的?
使用的是 sklearn 的 DecisionTreeClassifier,即 CART 分类树。
训练时,算法不断尝试:
用哪个特征、在哪个阈值处分开,能让分开后的座位类别更集中?
衡量类别混杂程度的指标是 Gini 不纯度:
例如,一个节点中 A、B 座位各占一半,Gini 为 0.5;如果全是 A,Gini 就是 0。算法选择能让左右子节点的加权不纯度下降最多的分裂。
需要区分两类参数:
| 内容 | 来源 |
|---|---|
| 某节点选哪个 AP、分裂阈值是多少 | 训练学习 |
| 最大深度默认 12、叶节点最少 3 个窗口 | 人指定的训练超参数 |
| 共同 AP 至少 3 个、残差过大要求复核 | 人制定的证据检查策略 |
本次训练出的树实际深度为 12,共有 54 个叶节点。一个座位可以对应多个叶节点,叶节点数量不必等于座位数量。
4. 线上如何得到座位和可信度?
新扫描经过同样的特征处理后,从根节点逐层判断,最后到达一个叶节点。
假设某叶节点训练样本的类别分布为:
A-01:8 个
A-02:2 个则输出:
Top-1:A-01
类别频率:0.8
第二候选:A-02,频率 0.2这里的 0.8 是训练样本在叶节点里的类别频率,不代表已经验证了“实际有 80% 概率正确”。 当前决策树没有做独立概率校准;即使纯叶节点输出 1.0,也可能在新设备或新环境上判断错误。
因此实现中还增加了证据检查:
- 共同有效 AP 不足。
- 查询与预测座位参考指纹的残差过大。
- 其他座位也能以相近或更低残差解释查询。
- 叶节点第一、第二名平票。
遇到这些情况,可信度会被置为 0,要求人工确认。这些检查是人为设计的保护规则,不是树学习出来的分支。
另外,树的 Top-3 只取叶节点中非零频率的类别。如果只有一个类别,就只返回一个,不强行补两个座位。
模型会保存为 JSON,包含节点、阈值、类别分布、特征重要性和规则文本;接口还返回 decision_path,可以追溯一次预测经过了哪些判断。
5. 这次对比说明了什么?
我们用 Honor、Pixel 的数据训练,完整留出 Redmi 作为测试设备。两种模型评估的是同一批 288 个窗口:
| 模型 | Top-1 准确率 | Top-3 准确率 | 需人工复核 |
|---|---|---|---|
| KNN | 93.06% | 100.00% | 19.10% |
| 决策树 | 65.62% | 80.21% | 48.96% |
这支持当前继续使用 KNN 作为默认在线模型,决策树作为实验对照。比较包含各自的设备偏移处理,不能单凭这组结果断言所有决策树都不如 KNN;数据也仍是模拟数据,不能作为现场验收成绩。