# 第五节项目实验报告

这是可复现的合成数据教学实验，不代表真实共享单车运营效果。

## 任务与数据

预测一个站点场景是否为高需求，正类 y=1。特征为预测时已知的温度、是否下雨、站点类型；不输入样本编号与目标标签。
180 个独立合成场景：120 个开发样本、60 个保留测试样本。开发集正类 45/120，温度缺失 14，站点缺失 10。
真实按日期连续采集的数据应考虑按时间划分，本教学数据没有日期与跨行依赖。

## 预处理与评估协议

配置：温度填充=median，标准化=True，使用站点=True。
每折只使用该折训练部分拟合温度填充规则、填充后的均值与标准差、站点独热编码词表。缺失站点使用 MISSING 类别；未知类别编码为全零。
数值特征为处理后的温度和 0/1 下雨，启用的站点类别使用独热编码。开发集采用固定的分层 3 折交叉验证；选择指标是平均 F1，预测阈值固定为 0.5。
逻辑回归训练 600 次、学习率 0.15、梯度中 L2 系数 0.01，偏置不惩罚。树最小叶子 4 个样本。

| 模型 | 3 折平均 F1 | 折间标准差 |
|---|---:|---:|
| 多数类基线 | 0.000000 | 0.000000 |
| 逻辑回归 | 0.679487 | 0.103896 |
| 决策树（深度 1） | 0.658188 | 0.054851 |
| 决策树（深度 3） | 0.652976 | 0.057888 |
| 决策树（深度 6） | 0.631527 | 0.061061 |

## 选择与错误分析

按平均 F1 选择：**逻辑回归**。平均 F1 为 0.679487。
合并 120 个折外预测后的混淆矩阵：TP=28，FP=9，FN=17，TN=66；合并 F1=0.682927。合并 F1 与逐折 F1 的平均不是同一种统计量。
FP 意味着实际非高需求却被预测为高需求，可能导致多备车辆；FN 意味着高需求被漏掉，可能导致备车不足。本实验用 F1 作为预先确定的教学选择指标，没有估计真实错误成本。
完整折外样本预测见 `out-of-fold-predictions.csv`。错误分析应先查标签、缺失与特征，再提出单一改动并重新验证；按子组看到的差异不能单独证明原因。

## 最终测试

锁定预处理与模型后，在完整 120 个开发样本重训；温度填充值 19.0000。
60 个保留测试样本：TP=14、FP=5、FN=8、TN=33。
准确率=0.783333，精确率=0.736842，召回率=0.636364，F1=0.682927。
这份结果用于最终报告，不据此改选模型或阈值。阅读过本报告的测试成绩后，相同测试数据也不能再当作未知的最终考试。

## 限制与下一步

样本很少，标签按概率生成，特征不包含所有影响需求的因素。折间标准差只是本次三折分数的离散程度，不是置信区间。
下一轮研究可预先提出加入新特征或改变模型的假设，在新的开发流程中验证；如据本测试结果改进，需使用新的独立评估数据。

## 复现

`python lessons/lesson-05-project.py`（需要 NumPy）。所有随机数、折与候选顺序固定。
可选参数：`--impute zero`、`--no-scale`、`--no-station`。运行会覆盖输出目录中的当前记录。
`model-pipeline.json` 保存当前所选模型、预处理参数和阈值，可用 `json.load` 读回，结合本文件的 `transform` 和 `predict_probability` 预测新记录。
