决策树实验对照方法

发布于 2026-10-13 22:41 1412 字 8 min read 手写 每个字都是我自己敲的。

先把这三者分清: 1. 这次决策树具体预测什么? 它预测的是座位编号,例如 、,并不直接预测“有人”“无人”或“恶意占座”。 当前流程是: KNN 和决策树目前是可按模型版本切换的两条识别路径,还没有做二者联合投票。 2. 决策树吃进去的是什么数据? 实现位于 decision_tree.py。 训练数据每行包含扫描时间、设备、真实座位和各 AP 的...

先把这三者分清:

部分解决什么问题判断依据怎么来
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 不纯度:

[Gini(S)=1−∑cpc2][ Gini(S)=1-\sum_c p_c^2 ]

例如,一个节点中 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 准确率需人工复核
KNN93.06%100.00%19.10%
决策树65.62%80.21%48.96%

这支持当前继续使用 KNN 作为默认在线模型,决策树作为实验对照。比较包含各自的设备偏移处理,不能单凭这组结果断言所有决策树都不如 KNN;数据也仍是模拟数据,不能作为现场验收成绩。

执笔 手写

随机文章

加载中...