#P4911. 饮用水质二分类预测模型
-
1000ms
Tried: 66
Accepted: 20
Difficulty: 6
所属公司 :
美团
时间 :2026年5月9日-算法岗
饮用水质二分类预测模型
解题思路
本题要求仅使用基础的数值计算工具实现完整的二分类训练流程,模型为仿射变换后接逻辑函数。
首先,使用训练集特征按列计算均值 μ 和标准差 σ,标准差使用 ddof=0。若某一列的 σ=0,则将其改为 1,避免除零。然后使用训练集得到的 μ 和 σ 对 train、val、test 做相同标准化。
模型使用仿射变换后接逻辑函数:
题目内容
在环境监测任务中,研究人员收集了多个水样的物理化学特征(如 pH 值、浊度、溶解氧等),并已知其中一部分水样是否适宜饮用。请你仅使用基础数值计算工具,实现一套完整的二分类模型训练与预测流程。
-
特征标准化:利用训练集计算每个特征的均值 μ 和总体标准差 σ(分母为样本数 N)。然后对训练集、验证集和测试集的所有特征进行缩放:x′=σx−μ。若某一特征的 σ=0,则将其置为 1 以避免除零。
-
模型定义:采用仿射变换后接逻辑函数 y^=1+e−(w⊤x+b)1,其中 w 为权重向量,b 为偏置。损失函数由二分类交叉熵和权重向量的 L2 范数平方惩罚构成:
其中 λ=10−4。计算对数前需将 y^i 截断到 [10−15,1−10−15] 区间。
-
优化算法:使用一种基于梯度一阶矩和二阶矩估计的自适应优化方法,超参数设置为:初始学习率 0.01,一阶矩衰减系数 β1=0.9,二阶矩衰减系数 β2=0.999,数值稳定常数 ϵ=10−8。小批量大小为 16,不足 16 时使用剩余样本。每个训练周期开始前,以固定种子 42 生成的随机排列打乱训练集顺序。
-
学习率调度:前 5 个训练周期采用预热策略,学习率从 0 线性增长到 0.01;第 6 个周期及以后保持恒定 0.01。
-
早停与模型恢复:最多训练 100 个周期。每个周期结束后在验证集上计算损失。若连续 10 个周期验证损失未较历史最佳损失下降超过 10−6,则提前终止训练。训练完成后将模型参数恢复至验证损失最小的状态。
-
预测与输出:用最终模型计算测试集每个样本的概率 y^=1+e−(w⊤x+b)1。若 y^≥0.5 则判定为正类(标签 1),否则为负类(标签 0)。按测试集顺序输出所有预测标签。
约束条件:
- 特征维度 d≥1,所有特征均为实数且无缺失值。
- 训练集、验证集和测试集的样本数量均不少于 16。
- 权重向量 w 和偏置 b 的初始值全部置为 0。
输入描述
输入只有一行,包含一个 JSON 对象。该对象有三个键:`"train"`、`"val"` 和 `"test"`。`"train"` 和 `"val"` 各自为一个二维数组,每一行由 d 个实数特征和一个整数标签(0 或 1)组成;`"test"` 也是一个二维数组,每一行仅包含 d 个实数特征,没有标签列。
输出描述
输出一行 JSON 数组,包含对 `"test"` 中每个样本的预测类别(整数 0 或 1),顺序与输入中测试样本的顺序一致。
样例1
输入
{"train":[[0.0,0],[0.0,0],[0.0,0],[0.0,0],[0.0,0],[0.0,0],[0.0,0],[0.0,0],[2.0,1],[2.0,1],[2.0,1],[2.0,1],[2.0,1],[2.0,1],[2.0,1],[2.0,1]],"val":[[0.0,0],[0.0,0],[0.0,0],[0.0,0],[0.0,0],[0.0,0],[0.0,0],[0.0,0],[2.0,1],[2.0,1],[2.0,1],[2.0,1],[2.0,1],[2.0,1],[2.0,1],[2.0,1]],"test":[[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[2.0],[2.0],[2.0],[2.0],[2.0],[2.0],[2.0],[2.0]]}
输出
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
说明
本样例展示了最简单的一维特征二分类情形。训练集与验证集均包含 16 个样本,前 8 个特征值为 0.0 且标签为 0,后 8 个特征值为 2.0 且标签为 1。标准化后两类特征被明显分开,逻辑回归模型可以轻松学习到权重 w>0 及合适的偏置 b,从而在测试集上对前 8 个 0.0 输出 0,后 8 个 2.0 输出 1,全部预测正确。
样例2
输入
{"train":[[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1]],"val":[[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1],[0.0,1]],"test":[[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]]}
输出
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
说明
该样例测试了边界情况:所有样本的唯一特征取值恒为 0.0,标签恒为 1。由于训练集特征的标准差 σ=0,按题目要求将 σ 置为 1,标准化后特征全部变为 0。此时权重 w 的梯度始终为 0,只有偏置 b 参与更新。优化器会逐渐增大 b,使预测概率 y^=1+e−b1 趋近于 1。最终模型对测试集全部 16 个特征为 0.0 的样本均输出 1。
样例3
输入
{"train":[[0.0,0.0,0],[0.0,1.0,0],[1.0,0.0,0],[1.0,1.0,1],[0.0,0.0,0],[0.0,1.0,0],[1.0,0.0,0],[1.0,1.0,1],[0.0,0.0,0],[0.0,1.0,0],[1.0,0.0,0],[1.0,1.0,1],[0.0,0.0,0],[0.0,1.0,0],[1.0,0.0,0],[1.0,1.0,1]],"val":[[0.0,0.0,0],[0.0,1.0,0],[1.0,0.0,0],[1.0,1.0,1],[0.0,0.0,0],[0.0,1.0,0],[1.0,0.0,0],[1.0,1.0,1],[0.0,0.0,0],[0.0,1.0,0],[1.0,0.0,0],[1.0,1.0,1],[0.0,0.0,0],[0.0,1.0,0],[1.0,0.0,0],[1.0,1.0,1]],"test":[[0.0,0.0],[0.0,1.0],[1.0,0.0],[1.0,1.0],[0.0,0.0],[0.0,1.0],[1.0,0.0],[1.0,1.0],[0.0,0.0],[0.0,1.0],[1.0,0.0],[1.0,1.0],[0.0,0.0],[0.0,1.0],[1.0,0.0],[1.0,1.0]]}
输出
[0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]
说明
本样例使用二维特征演示线性可分的数据。训练集和验证集均由 4 种特征组合各重复 4 次构成,共 16 个样本:
- (0.0,0.0)、(0.0,1.0)、(1.0,0.0) 对应的标签为
0; - (1.0,1.0) 对应的标签为
1。 测试集也是同样的4种组合重复4次。特征经过标准化后,线性分类器会学习到合适的决策边界(例如 x1+x2>0.5 判为1)。由于数据完全可分且训练集/验证集分布一致,模型在测试集上准确复现了真实的标签序列:每4个样本输出[0, 0, 0, 1],共计16个预测值。