正在加载中...

展开本页目录
算法教程HBOS-直方图异常分数

HBOS-直方图异常分数

No.162 · 在线教程

HBOS-直方图异常分数 的真实核心主要位于:

HBOS-直方图异常分数

1. 方法概述

HBOS-直方图异常分数 的真实核心主要位于:

  • core/hbos_calculator.py

从当前源码看,这个模块实现的是一个比较完整的 Histogram-based Outlier Score 流程:

  1. 选择特征列、标签列与 ID 列;
  2. 可选 One-Hot、缺失值处理与缩放;
  3. 对每个特征独立构建直方图;
  4. 用样本所在 bin 的归一化柱高计算局部分数;
  5. 对所有特征分数求和得到总异常分数;
  6. contamination 分位数给出异常阈值;
  7. 导出 Top 异常样本、每特征贡献值、ROC/PR/PCA 图等。

HBOS 的核心假设是:特征之间近似独立,异常点会落在多个特征的低密度区间。

2. 数据预处理

2.1 特征选择与 One-Hot

one_hot=True,代码会对非数值列执行 One-Hot 编码:

$$ x_{ij}^{(k)}= \begin{cases} 1,& x_{ij}=\text{cat}_k\\ 0,& \text{otherwise} \end{cases} \tag{1} $$

若不开启 One-Hot,非数值列会被尽量转数值,彻底不可转的列最终会被丢弃。

2.2 缺失值处理

项目支持:

  • drop_rows
  • drop_cols
  • mean
  • median
  • zero

2.3 缩放

代码支持:

  • none
  • standard
  • minmax

标准化形式可写为

$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{2} $$

3. HBOS 主计算

3.1 直方图密度

对第 \(j\) 个特征,代码先把该列划分为若干 bin,并得到每个 bin 的原始计数 \(c_{bj}\)。随后做平滑:

$$ c_{bj}^{(\text{s})}=c_{bj}+\alpha \tag{3} $$

其中 \(\alpha\) 对应参数 hist_smoothing

若第 \(b\) 个 bin 的宽度为 \(\Delta_{bj}\),则其密度为

$$ p_{bj}=\frac{c_{bj}^{(\text{s})}}{\sum_r c_{rj}^{(\text{s})}} \tag{4} $$

$$ \mathrm{density}_{bj}=\frac{p_{bj}}{\Delta_{bj}} \tag{5} $$

3.2 归一化柱高

代码进一步将每列密度除以该列最大密度:

$$ h_{bj}=\frac{\mathrm{density}_{bj}}{\max_r \mathrm{density}_{rj}} \tag{6} $$

并裁剪到 \([\varepsilon,+\infty)\),避免后续对数出错。

3.3 单特征异常分量

若样本 \(i\) 在第 \(j\) 个特征上落入第 \(b(i,j)\) 个 bin,则该列分数分量为

$$ s_{ij}=-\log h_{b(i,j),j} \tag{7} $$

柱高越低,\(s_{ij}\) 越大,表示该特征上越“稀有”。

3.4 总异常分数

最终总分按特征求和:

$$ S_i=\sum_{j=1}^{d}s_{ij} \tag{8} $$

这就是结果表中的 score

4. 阈值、标签与评估

4.1 阈值

若污染率为 contamination,代码用分位数阈值:

$$ \tau=Q_{1-\text{contamination}}(S) \tag{9} $$

然后判定

$$ \hat y_i= \begin{cases} 1,& S_i\ge \tau\\ 0,& \text{otherwise} \end{cases} \tag{10} $$

同时另存成异常检测常见的:

  • pred_label = -1 表示异常
  • pred_label = 1 表示正常

4.2 有标签时的二值映射

标签列会按“非 0 即异常”的规则映射到 \(\{0,1\}\),即

$$ y_i= \begin{cases} 0,& \text{原值}=0\\ 1,& \text{原值}\neq 0 \end{cases} \tag{11} $$

因此它兼容 0/1-1/1 两类标签。

4.3 评估指标

代码在有标签时会计算:

$$ \mathrm{Precision}=\frac{TP}{TP+FP},\quad \mathrm{Recall}=\frac{TP}{TP+FN},\quad \mathrm{F1}=\frac{2PR}{P+R} \tag{12} $$

并尝试追加:

  • roc_auc
  • average_precision

5. 输出结果与论文应用

5.1 Excel 工作表

当前项目导出:

  • Parameters
  • RawData
  • ProcessedFeatures
  • Scores
  • TopAnomalies
  • Threshold
  • Metrics
  • HistBins
  • HistSummary
  • TopContrib
  • Embedding_2D
  • Charts

其中 TopContrib 很重要,因为它会直接给出 Top 异常样本在每个特征上的 \(s_{ij}\) 分量。

5.2 论文写作表述建议

可以写成:

  • 基于各特征独立直方图密度构造异常分数;
  • 将样本在各特征上的低密度程度取负对数后累加,形成总异常分数;
  • 通过污染率分位数阈值筛选异常样本,并用 ROC-AUC / AP 等指标评价检测效果。

6. 实现说明与注意事项

6.1 这里的 HBOS 做了平滑和归一化

因此它不是最朴素的“直接拿 bin 频率做分数”,而是:

  1. 先做 Laplace 平滑;
  2. 再除以 bin 宽得到密度;
  3. 再按列最大密度归一化;
  4. 最后取负对数。

6.2 常数列会自动走兜底逻辑

若某列没有波动,代码会人为构造单个 bin,并使该列分数贡献接近 0,避免无意义地放大异常分数。

6.3 top_n 只影响展示

top_n 决定 TopAnomalies / TopContrib 输出多少条记录,不改变阈值与异常标签的实际生成规则。

7. 论文写作模板

7.1 方法描述模板

“本文采用基于特征独立直方图密度估计的异常检测方法,对每个特征分别构建区间直方图,并利用样本落入区间的低密度程度计算单维异常分量,最终将各维分量累加得到总异常分数。依据项目当前实现,直方图密度在计算前加入了平滑项,并进一步除以 bin 宽度与列内最大密度进行归一化,因此本文所用 HBOS 分数属于带平滑与归一化的工程实现版本,而非最朴素的原始频数口径。”

7.2 结果解释模板

结果部分可写为:总异常分数越大,说明样本在多个特征维度上越倾向于落入低频区间。TopContrib 表进一步揭示了推动异常分数升高的主要特征来源,因此论文可从“异常程度”与“异常来源”两个层面组织结果讨论。若得分分布图中阈值线右侧仅集中少量样本,则说明阈值具有较强筛选作用;若带标签结果同时具有较高 ROC-AUC 与 AP,则说明 HBOS 在排序识别与阈值判别两方面均具有较好表现。

7.3 表格标题模板

  1. 表 1 HBOS 参数设置与直方图构造规则表
  2. 表 2 样本异常分数与排序结果表
  3. 表 3 Top 异常样本特征贡献结果表
  4. 表 4 带标签场景下 HBOS 检测性能指标表

7.4 图表题注模板

  1. 图 1 HBOS 异常分数分布图及阈值位置示意图。
  2. 图 2 HBOS Top 异常样本特征贡献对比图。
  3. 图 3 HBOS 异常样本 PCA 二维嵌入散点图。

7.5 表格示例

表 1 HBOS Top 异常样本及特征贡献示例

样本编号 总异常分数 主要贡献特征 贡献值 排名
\(i_1\)
\(i_2\)

表注:总异常分数由各特征单维负对数密度分量累加得到;主要贡献特征来自 TopContrib 工作表。

8. 单篇终审补充

8.1 图题与表题对齐建议

  • Parameters 表可写为:表X HBOS 参数设置与阈值规则表。
  • RawData 表可写为:表X HBOS 原始数据表。
  • ProcessedFeatures 表可写为:表X HBOS 处理后特征表。
  • Scores 表可写为:表X HBOS 样本异常分数结果表。
  • TopAnomalies 表可写为:表X HBOS Top 异常样本排序表。
  • Threshold 表可写为:表X HBOS 异常阈值信息表。
  • Metrics 表可写为:表X HBOS 检测性能指标汇总表。
  • HistBins 表可写为:表X HBOS 各特征直方图区间表。
  • HistSummary 表可写为:表X HBOS 直方图统计摘要表。
  • TopContrib 表可写为:表X HBOS Top 异常样本特征贡献表。
  • Embedding_2D 表可写为:表X HBOS 二维嵌入结果表。
  • Charts 表可写为:表X HBOS 图表索引与路径清单。
  • scores_hist.png 建议写为:图X HBOS 异常分数分布图。
  • threshold_recall.png 建议写为:图X HBOS 阈值与召回率关系图。
  • roc.png 建议写为:图X HBOS ROC 曲线图。
  • pr.png 建议写为:图X HBOS PR 曲线图。
  • embedding_pca.png 建议写为:图X HBOS PCA 二维嵌入图。

8.2 终审说明

  • 当前代表性结果目录中的真实主工作簿为 HBOS-直方图异常分数_results_20260322_144010.xlsx,复现输出为 hbos_repro.xlsx。论文附录中若列文件名,应明确区分主运行结果与 repro 结果。
  • 当前真实工作表体系比一般异常检测算法更细,除了 Scores/TopAnomalies/Threshold/Metrics 外,还包括 HistBinsHistSummaryTopContrib。正文若讨论异常来源,应优先引用 TopContrib,不要只用总分排序替代。
  • 当前实体图文件位于 *_charts/ 目录下,真实图名包括 scores_hist.pngthreshold_recall.pngroc.pngpr.pngembedding_pca.png。终稿图题应按这组真实文件名对齐,而不是泛写成“异常检测结果图”。
  • 真实 repro 脚本为 repro_hbos.py,并通过 INPUT_FILE = 'repro_inputs/hbos_repro_data.csv' 读取输入副本。附录中的复现实验说明应保留这一统一转写后的 CSV 路径口径。
  • 当前实现会把原始输入或内存数据统一落为 hbos_repro_data.csv,因此论文若对“原始上传文件格式”有要求,应另在实验设置中补充说明,而不能默认 repro 仍直接读取最初的 Excel 文件。

8.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/异常检测/HBOS-直方图异常分数,代表性结果目录更新为 具体的算法3/异常检测/HBOS-直方图异常分数/results/HBOS_20260329_170106
  • 该目录实际包含两份工作簿:主运行结果 HBOS-直方图异常分数_results_20260329_170106.xlsx 与复现输出 hbos_repro.xlsx。两份工作簿的真实工作表一致,均为 ParametersRawDataProcessedFeaturesScoresTopAnomaliesThresholdMetricsHistBinsHistSummaryTopContribEmbedding_2DCharts
  • 主运行图目录为 HBOS-直方图异常分数_results_20260329_170106_charts/,复现图目录为 hbos_repro_charts/。两套目录中均可见 embedding_pca.pngpr.pngroc.pngscores_hist.pngthreshold_recall.png
  • 当前输入副本位于 repro_inputs/hbos_repro_data.csvrepro_hbos.py 中明确写有 INPUT_FILE = 'repro_inputs/hbos_repro_data.csv'。这属于标准 repro_inputs/... 结构。
  • 文档中若讨论阈值,应引用真实存在的 Threshold 工作表;若讨论异常来源,应引用 TopContrib,而不是仅用 Scores 的总异常分数排序替代。
  • 需要避免把 __pycache__ 或历史测试目录写入论文证据。当前代表性目录的有效证据是主 xlsx、repro xlsx、两套图目录、repro_hbos.pyrepro_inputs/hbos_repro_data.csv

9. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/异常检测/HBOS-直方图异常分数/results/HBOS_20260329_170106
  • 正文应围绕 ParametersRawDataProcessedFeaturesScoresTopAnomaliesThresholdMetricsHistBinsHistSummaryTopContribEmbedding_2DCharts 来写。
  • 图证应对应 scores_hist.pngthreshold_recall.pngroc.pngpr.pngembedding_pca.png,并把主运行图和 hbos_repro_charts/ 分开说明。
  • 复现脚本应按 repro_hbos.py + repro_inputs/hbos_repro_data.csv 的口径说明。