#P5221. 第2题-监测样本偏离判定
-
1000ms
Tried: 9
Accepted: 5
Difficulty: 5
所属公司 :
oppo
第2题-监测样本偏离判定
解题思路
本题使用 PCA 重建误差进行异常检测。
训练集全部由正常样本组成,因此可以利用训练集学习正常数据的主要特征结构。如果一个测试样本与正常数据差异较大,那么经过 PCA 降维并重建后,它的重建误差通常也会更大。
具体按照以下步骤处理:
1. 缺失值填充。
题目内容
某监测系统积累了一批处于稳定状态下的历史传感数据,这些记录均可视为正常样本。现在系统收到一批新的监测记录,希望根据历史数据所形成的主要变化模式,判断新记录是否出现明显偏离。
请在仅使用 numpy/pandas/scikit-learn 的前提下,实现一个基于 PCA 重建误差的异常检测方法,并对每个待检测样本给出判定结果。
已知参考数据中只包含正常样本,而待检测数据中可能同时存在正常样本和异常样本。整个处理过程必须严格按照下面的步骤进行。
1. 缺失值补全
设参考矩阵为 R∈Rn×d,待检测矩阵为 Q∈Rm×d。
对于第 j 列特征,计算参考矩阵该列所有非缺失元素的均值,记为 cj。
随后:
- 参考矩阵第 j 列中的缺失值全部使用 cj 补全;
- 待检测矩阵第 j 列中的缺失值也必须使用相同的 cj 补全。
补全后的两个矩阵仍记作 R 和 Q。
其中:
- n 为参考样本数量;
- m 为待检测样本数量;
- d 为特征维度。
2. 标准化
使用 StandardScaler 对数据进行标准化。
StandardScaler 只能在参考矩阵 R 上执行 fit,之后分别对 R 和 Q 执行 transform。
标准化后的矩阵分别记为 R(s) 和 Q(s)。
若参考数据第 j 个特征的均值和标准差分别为 μj、σj,则有:
R(s)∗ij=σjR∗ij−μj以及:
Q(s)∗ij=σjQ∗ij−μj注意,待检测数据不能单独计算均值或标准差。
3. PCA 投影与重建
仅使用标准化后的参考矩阵 R(s) 训练 PCA。
参数固定为:
n_components=0.95svd_solver='full'
这表示保留累计解释方差比达到或超过 0.95 所需要的最少主成分数量。
将 R(s) 投影到得到的主成分空间后再执行逆变换,记重建结果为 Rˉ。
使用同一个已经训练完成的 PCA 对 Q(s) 进行投影和逆变换,得到 Qˉ。
整个过程中,不允许使用待检测数据重新训练或调整 PCA。
4. 偏离分数
一个样本的偏离分数定义为它与 PCA 重建结果之间各维平方差之和。
对于第 i 个参考样本:
ri=R(s)∗i−Rˉ∗i∗22=∑∗j=1d(R(s)∗ij−Rˉ∗ij)2对于第 i 个待检测样本:
qi=Q(s)∗i−Qˉ∗i∗22=∑∗j=1d(Q(s)∗ij−Qˉ∗ij)2因此,全部参考样本对应的偏离分数组成:
Dref=r1,r2,…,rn5. 判定边界
使用全部参考样本的偏离分数计算判定边界 τ。
必须按照下面的方式得到:
np.percentile(D_ref, 95)
即:
τ=percentile∗95(D∗ref)对于第 i 个待检测样本,其输出标签定义为:
zi={1,qi>τ 0,qi≤τ其中:
- 0 表示该样本判定为正常;
- 1 表示该样本判定为异常。
注意,当偏离分数恰好等于 τ 时,该样本仍判定为正常。
输入描述
标准输入为 JSON,格式如下:
{
"train": [[f11, f12, ..., f1d],
[f21, f22, ..., f2d],
...],
"test": [[g11, g12, ..., g1d],
[g21, g22, ..., g2d],
...]
}
其中:
train:二维列表,大小为 (n,d),其中所有样本均为正常样本;test:二维列表,大小为 (m,d),包含需要判定的样本;- 每个特征值可能是整数、浮点数或
null; train与test的特征列数完全相同;- 2≤n≤18;
- 2≤m≤18;
- 2≤d≤8。
输出描述
输出一个 JSON 数组,其中依次存放所有待检测样本的判定标签。
例如:
[0, 1, 0]
其中:
- 0 表示正常;
- 1 表示异常。
标签的顺序必须与输入中 test 的样本顺序保持一致。(标签之间有空格)
补充说明
- 仅允许使用 numpy/pandas/scikit-learn;
- 缺失值所使用的均值只能来自训练数据;
StandardScaler和PCA均只能在训练数据上进行拟合;- PCA 参数必须为
n_components=0.95、svd_solver='full'; - 判定边界必须使用
np.percentile(D_ref, 95); - 不得改用
IsolationForest、One-Class SVM、RobustScaler等其他异常检测或预处理方法。
样例1
输入
{"train": [[1,2],[2,4.1],[3,5.9],[4,8.1],[5,10]],"test": [[2.5,5.0],[2.5,10.0],[3.0,null]]}
输出
[0, 1, 0]
说明
训练数据的两个特征具有较明显的共同变化趋势,因此 PCA 可以用较少的主成分描述其主要结构。
第一个待检测样本与训练数据表现出的变化关系接近,其重建偏离较小,因此输出 0。
第二个样本的两个特征之间出现了明显不同于参考数据的关系,PCA 重建后的平方误差和超过训练误差的 95 分位数,因此输出 1。
第三个样本的第二维为 null,需要先使用训练数据第二维特征的均值进行补全,再执行标准化和 PCA 重建。其最终偏离分数没有超过判定边界,因此输出 0。