正在加载中...

展开本页目录
算法教程HStat-Friedman H 交互强度

HStat-Friedman H 交互强度

No.141 · 在线教程

HStat-Friedman H 交互强度 的真实核心主要位于:

HStat-Friedman H 交互强度

1. 方法概述

HStat-Friedman H 交互强度 的真实核心主要位于:

  • core/hstat_calculator.py
  • ui/upload_widget.py
  • ui/results_widget.py
  • ui/main_window.py

从代码实现看,这个模块并不是直接封装某个现成的 H-statistics 库,而是按下面的流程自行实现

  1. 选择目标列与特征列;
  2. 可选地对类别特征做 pd.get_dummies()
  3. 训练树模型;
  4. 计算 1 维 / 2 维偏依赖;
  5. 用偏依赖残差的方差占比构造 Friedman H 交互强度。

设数据集为

$$ \mathcal{D}=\{(x_i,y_i)\}_{i=1}^{N} \tag{1} $$

其最终目标是对特征对 \((x_s,x_t)\) 输出交互强度排序表。

2. 数据准备与建模对象

2.1 特征列与目标列

GridRandomSearch 不同,这个模块的特征勾选框允许选择所有非目标列,包括类别列。设用户选中的特征集合为 \(S\),目标列为 \(y\),则初始特征表为

$$ X=\mathcal{D}[S] \tag{2} $$

2.2 类别编码与数值筛选

encode_categorical=True,代码执行 One-Hot 编码:

$$ X^{(\text{enc})}=\mathrm{get\_dummies}(X) \tag{3} $$

encode_categorical=False,则只保留数值列:

$$ X^{(\text{num})}=\mathrm{SelectNumeric}(X) \tag{4} $$

同时代码会把特征与目标列拼接后统一删去缺失行,并记录:

  • 被丢弃的非数值列数;
  • 被删除的缺失行数;
  • 被删除的常数列名称。

如果删完之后有效特征数少于 2 个,程序直接报错。

2.3 有效样本约束

完成预处理后,代码要求:

  1. 至少有 10 行有效样本;
  2. 至少有 2 个有效特征;
  3. 回归任务的目标列必须是数值;
  4. 分类任务的目标列至少有 2 个类别。

值得注意的是,分类任务这里没有像某些搜索模块那样再检查“每类至少若干样本”或做分层拆分。

2.4 树模型族

代码只支持两类基学习器:

  1. random_forest
    • RandomForestRegressor
    • RandomForestClassifier
  2. gradient_boosting
    • GradientBoostingRegressor
    • GradientBoostingClassifier

如果随机森林在界面上勾选“不限深度”,则 max_depth=0 会在底层转成 None;若梯度提升树收到小于 1 的深度值,则代码会回退为 3

3. 预测输出与偏依赖构造

3.1 交互不是基于最终类别标签

H-Statistic 依赖的是模型输出函数,而不是分类标签本身。记模型输出为 \(f(x)\)。代码的真实口径是:

$$ f(x)= \begin{cases} \Pr(y=1\mid x), & \text{二分类且存在 } \texttt{predict\_proba} \\ \max_c \Pr(y=c\mid x), & \text{多分类且存在 } \texttt{predict\_proba} \\ \max_c \text{score}_c(x), & \text{使用 } \texttt{decision\_function} \\ \hat y(x), & \text{回归} \end{cases} \tag{5} $$

因此分类任务中的交互强度衡量的是类别概率 / 决策分数层面的相互作用,而不是最终离散类别标签之间的关系。

3.2 训练 / 测试划分

代码会先执行

$$ \mathcal{D}_{\text{train}}\cup\mathcal{D}_{\text{test}}=\mathcal{D} \tag{6} $$

其中测试集比例来自 test_size,随机种子来自 random_state。这里一个实现细节需要明确:即使是分类任务,当前 train_test_split()没有传入 stratify=y

模型训练完成后,测试集只用于计算普通预测指标;H-Statistic 本身是在全体有效样本上结合偏依赖函数计算的。

3.3 网格点构造

对每个特征列,代码构造偏依赖网格:

$$ G_j= \begin{cases} \mathrm{unique}(x_j), & \text{若唯一值个数}\le \texttt{grid\_points} \\ \mathrm{Quantile}(x_j,\{0.05,\dots,0.95\}), & \text{否则} \end{cases} \tag{7} $$

也就是说,连续特征默认使用 5% 到 95% 分位点之间的离散网格,而不是最小值到最大值的等距网格。

3.4 偏依赖抽样

若有效样本数大于 pd_sample_size,则代码会先无放回抽取一部分样本构造偏依赖输入:

$$ X_{\text{PD}}\subset X,\qquad |X_{\text{PD}}|=\texttt{pd\_sample\_size} \tag{8} $$

这一步只影响偏依赖计算成本,不影响后面在全体样本上的插值与方差统计。

3.5 一维偏依赖

对特征 \(x_s\) 的 1 维偏依赖,代码按网格值逐点替换样本列后求平均预测:

$$ \hat f_s(z)=\frac{1}{|X_{\text{PD}}|}\sum_{x\in X_{\text{PD}}} f\big(x_{-s},x_s=z\big) \tag{9} $$

3.6 二维偏依赖

对特征对 \((x_s,x_t)\),代码构造 2 维偏依赖面:

$$ \hat f_{st}(z_s,z_t)=\frac{1}{|X_{\text{PD}}|}\sum_{x\in X_{\text{PD}}} f\big(x_{-(s,t)},x_s=z_s,x_t=z_t\big) \tag{10} $$

随后再借助 RegularGridInterpolator 把这张 2D 网格面插值回每个真实样本点上。

4. H-Statistic 的真实计算口径

4.1 特征对交互强度

在当前实现中,对一对特征 \((s,t)\),代码先构造残差面:

$$ r_{st}(x)=\hat f_{st}(x_s,x_t)-\hat f_s(x_s)-\hat f_t(x_t) \tag{11} $$

再计算

$$ H_{st}^2=\frac{\mathrm{Var}\!\big(r_{st}(x)\big)}{\mathrm{Var}\!\big(\hat f_{st}(x_s,x_t)\big)} \tag{12} $$

并把结果截断到 \([0,1]\) 区间,最终输出:

  • H2
  • H = sqrt(H2)
  • var_fij
  • var_residual

这里需要特别说明:这份实现直接使用上式的残差方差比,没有再显式减去整体均值项,因此应把它描述成“基于 Friedman H 思路的实现口径”,而不要过度写成某个严格标准化公式的逐字复现。

4.2 单特征强度表

除了成对交互外,代码还构造了一个单特征表:

$$ H_s^2=\frac{\mathrm{Var}\!\big(f(x)-\hat f_s(x_s)\big)}{\mathrm{Var}\!\big(f(x)\big)} \tag{13} $$

并输出:

  • feature
  • H2
  • H

这张表更像是“单特征 1D 偏依赖无法解释的剩余波动占比”,不应简单等同于标准教科书里的 pairwise H-statistic。

5. 输出结果、评价指标与导出

5.1 测试集预测指标

模型训练后,分类任务导出:

$$ \mathrm{Accuracy}=\frac{1}{|\mathcal{D}_{\text{test}}|}\sum_i \mathbf{1}(\hat y_i=y_i) \tag{14} $$

以及:

  • f1_macro
  • f1_weighted

回归任务导出:

$$ \mathrm{RMSE}=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat y_i)^2} \tag{15} $$

$$ \mathrm{MAE}=\frac{1}{n}\sum_{i=1}^{n}|y_i-\hat y_i| \tag{16} $$

$$ R^2=1-\frac{\sum_i(y_i-\hat y_i)^2}{\sum_i(y_i-\bar y)^2} \tag{17} $$

需要区分:

  1. 上述指标来自训练后在测试集上的普通预测评估;
  2. H2 交互强度来自偏依赖与方差分解;
  3. 两者不是同一类量,不能混为一谈。

5.2 图表生成规则

代码会尝试生成两类图:

  1. interaction_heatmap
    • 只有当有效特征数 <= 30 时才绘制;
  2. top_pairs
    • Top K 交互对画水平条形图。

因此特征数较多时,热图可能被自动跳过,但交互对条形图仍可能存在。

5.3 Excel 工作表

save_to_excel() 实际导出:

  • 原始数据
  • 处理后数据
  • 交互强度Top
  • 交互强度全量
  • 特征交互
  • 模型指标
  • Parameters
  • 偏依赖数据
  • 图表清单

其中:

  • 原始数据 是用户上传的完整原表;
  • 处理后数据 是编码、删缺失、去常数列之后的特征表,再拼上原始目标列;
  • 偏依赖数据 保存每个特征在各个网格点上的 1 维偏依赖值。

5.4 输出路径与复现脚本

默认结果路径采用:

  • 目录:results/HStat-Friedman H 交互强度分析结果_时间戳/
  • 文件:HStat-Friedman_H_交互强度_results_时间戳.xlsx

结果页还会自动导出:

  • repro_hstat.py

以及可另行导出带时间戳的 hstat_reproduce_*.py 与对应输出日志。

6. 实现说明与注意事项

根据当前真实代码,论文说明中应明确以下边界:

  1. 这不是直接调用现成 H-statistics 库的封装,而是“树模型 + 偏依赖 + 插值 + 方差比”的自写实现。
  2. 分类任务中参与交互计算的是预测概率或决策分数,不是最终类别标签。
  3. 分类任务的数据拆分没有做 stratify 分层。
  4. pd_sample_size 只影响偏依赖的近似计算样本数,不影响后续在全体样本上的插值与方差统计。
  5. 单特征 H2 表和成对交互 H2 表不是同一个定义,应分别解释。
  6. 目录中虽然存在 feature_engineering_panel.py,但主窗口实际仍是 UploadWidget + ResultsWidget 流程,文档不应把该面板写成当前已接入的主分析步骤。

7. 论文写作模板

7.1 方法描述模板

“本文采用基于 Friedman H 统计量思想的特征交互强度分析方法。首先利用树模型拟合目标变量与特征之间的非线性关系,然后构造一维与二维偏依赖函数,最后通过非加性残差的方差占比衡量特征交互强度。依据项目当前实现,分类任务使用预测概率或决策分数作为模型输出,回归任务使用连续预测值作为输出,因此文中 H 值应解释为模型输出层面的非加性作用强度,而非严格意义上的因果交互效应。”

7.2 结果解释模板

结果部分可写为:pairwise H2 越大,说明对应特征对在模型输出层面存在越明显的非加性联合作用;single-feature H2 则反映单变量偏依赖无法解释的剩余波动比例。论文结果部分宜同时展示 Top-K 特征对交互强度表、全量交互热图和模型基础预测性能指标,从而区分“模型预测准确”与“模型存在显著交互结构”这两个不同层面的结论。若某一特征对在热图与排序表中均持续居前,可将其视为重点讨论的结构性交互关系。

7.3 表格标题模板

  1. 表 1 Friedman H 交互分析模型与参数设置表
  2. 表 2 Top-K 特征对交互强度排序结果表
  3. 表 3 单特征 H 统计量结果表
  4. 表 4 交互分析模型预测性能指标表

7.4 图表题注模板

  1. 图 1 全量特征对 Friedman H 交互强度热图。
  2. 图 2 Top-K 特征对交互强度排序图。
  3. 图 3 单特征 H 统计量与成对 H 统计量对比图。

7.5 表格示例

表 1 特征交互强度排序结果

特征 1 特征 2 pairwise H2 排名
\(X_a\) \(X_b\)
\(X_c\) \(X_d\)

表注pairwise H2 由二维偏依赖与一维偏依赖的非加性残差方差占比计算得到,数值越大表示模型输出中的交互作用越强。

8. 单篇终审补充

8.1 图题与表题对齐建议

当前 HStat 模块的真实工作簿包含:

  • 原始数据
  • 处理后数据
  • 交互强度Top
  • 交互强度全量
  • 特征交互
  • 模型指标
  • Parameters
  • 偏依赖数据
  • 图表清单

其中 交互强度Top 适合正文引用,交互强度全量 适合附录完整呈现,特征交互 则承接单特征 H 统计量。不要把 特征交互 与成对交互强度表混成同一类结果,它们的定义不同。

图文件由 save_to_excel() 统一保存到结果目录下的 plots/ 子目录,文件名来自图键名,当前真实图至少会对应:

  • interaction_heatmap.png(特征数不大时)
  • top_pairs.png

因此图题建议写成“Friedman H 交互强度热力图”“Top-K 特征对交互强度排序图”。若特征数过多导致热图被跳过,正文中就不应继续保留热图占位描述。

8.2 终审说明

这篇文档最需要强调的工程事实,是当前 H 统计量不是调用外部专门库,而是基于树模型预测、偏依赖插值和方差比的项目内实现。因此论文里若讨论数值口径,应以当前程序输出的 pairwise H2single-feature H2 为准,不要直接照抄外部库文档。

另外,当前 repro 脚本已经采用 repro_inputs/... 相对路径,结果目录中可见如 repro_inputs/hstat_baseline_input.csv 的输入引用。这篇可按新框架写可复现性。

8.3 全量强化补充

本次全量强化绑定的真实结果目录为 具体的算法3/可解释与AutoML/HStat-Friedman H 交互强度/results/HStat-Friedman H 交互强度分析结果_20260329_170619。该目录内主工作簿为 HStat-Friedman_H_交互强度_results_20260329_170619.xlsx,实际工作表为 原始数据处理后数据交互强度Top交互强度全量特征交互模型指标Parameters偏依赖数据图表清单。同目录下还可核验到 HStat-Friedman_H_交互强度_results_20260329_170619_reproduce.xlsxhstat_repro.xlsx 两类 repro 再生产物,且其工作表集合与主工作簿一致。

图件证据也成对存在:主图目录 HStat-Friedman_H_交互强度_results_20260329_170619_plots/、复现实验图目录 HStat-Friedman_H_交互强度_results_20260329_170619_reproduce_plots/ 以及 hstat_repro_plots/ 内都可直接核验 interaction_heatmap.pngtop_pairs.png。因此 HStat 当前不只是“有主结果图”,而是具备主结果图与 repro 图的重复验证结构。

目录内还存在 repro_hstat.pyrepro_inputs/。脚本当前真实参数写法为 INPUT_FILE = 'repro_inputs/hstat_baseline_input.csv',并绑定 target_column = 'y'feature_cols = ['x1', 'x2', 'x3']task = 'regression'model_type = 'random_forest'n_estimators = 120max_depth = 5top_k_pairs = 5random_state = 42。同时 repro_inputs/ 下真实存在 hstat_baseline_input.csvhstat_reproduce_20260329_170619_data.csv。因此这篇文档可以明确写成:当前 HStat 已具备同目录相对路径输入副本、主结果工作簿、复现工作簿和复现图目录的完整闭环。

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

  • 当前主结果目录应写作 具体的算法3/可解释与AutoML/HStat-Friedman H 交互强度/results/HStat-Friedman H 交互强度分析结果_20260329_170619
  • 正文应围绕 原始数据处理后数据交互强度Top交互强度全量特征交互模型指标Parameters偏依赖数据图表清单 来写。
  • 图证应对应 interaction_heatmap.pngtop_pairs.png,并把主结果图和 repro 图分别说明。
  • 复现脚本应按 repro_hstat.py + repro_inputs/hstat_baseline_input.csv 的口径说明,且目录里还保留了旧绝对路径兼容遗留。