HStat-Friedman H 交互强度
HStat-Friedman H 交互强度 的真实核心主要位于:
HStat-Friedman H 交互强度
1. 方法概述
HStat-Friedman H 交互强度 的真实核心主要位于:
core/hstat_calculator.pyui/upload_widget.pyui/results_widget.pyui/main_window.py
从代码实现看,这个模块并不是直接封装某个现成的 H-statistics 库,而是按下面的流程自行实现:
- 选择目标列与特征列;
- 可选地对类别特征做
pd.get_dummies(); - 训练树模型;
- 计算 1 维 / 2 维偏依赖;
- 用偏依赖残差的方差占比构造 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 有效样本约束
完成预处理后,代码要求:
- 至少有 10 行有效样本;
- 至少有 2 个有效特征;
- 回归任务的目标列必须是数值;
- 分类任务的目标列至少有 2 个类别。
值得注意的是,分类任务这里没有像某些搜索模块那样再检查“每类至少若干样本”或做分层拆分。
2.4 树模型族
代码只支持两类基学习器:
random_forestRandomForestRegressorRandomForestClassifier
gradient_boostingGradientBoostingRegressorGradientBoostingClassifier
如果随机森林在界面上勾选“不限深度”,则 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]\) 区间,最终输出:
H2H = sqrt(H2)var_fijvar_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} $$
并输出:
featureH2H
这张表更像是“单特征 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_macrof1_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} $$
需要区分:
- 上述指标来自训练后在测试集上的普通预测评估;
H2交互强度来自偏依赖与方差分解;- 两者不是同一类量,不能混为一谈。
5.2 图表生成规则
代码会尝试生成两类图:
interaction_heatmap- 只有当有效特征数
<= 30时才绘制;
- 只有当有效特征数
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. 实现说明与注意事项
根据当前真实代码,论文说明中应明确以下边界:
- 这不是直接调用现成 H-statistics 库的封装,而是“树模型 + 偏依赖 + 插值 + 方差比”的自写实现。
- 分类任务中参与交互计算的是预测概率或决策分数,不是最终类别标签。
- 分类任务的数据拆分没有做
stratify分层。 pd_sample_size只影响偏依赖的近似计算样本数,不影响后续在全体样本上的插值与方差统计。- 单特征
H2表和成对交互H2表不是同一个定义,应分别解释。 - 目录中虽然存在
feature_engineering_panel.py,但主窗口实际仍是UploadWidget + ResultsWidget流程,文档不应把该面板写成当前已接入的主分析步骤。
7. 论文写作模板
7.1 方法描述模板
“本文采用基于 Friedman H 统计量思想的特征交互强度分析方法。首先利用树模型拟合目标变量与特征之间的非线性关系,然后构造一维与二维偏依赖函数,最后通过非加性残差的方差占比衡量特征交互强度。依据项目当前实现,分类任务使用预测概率或决策分数作为模型输出,回归任务使用连续预测值作为输出,因此文中 H 值应解释为模型输出层面的非加性作用强度,而非严格意义上的因果交互效应。”
7.2 结果解释模板
结果部分可写为:pairwise H2 越大,说明对应特征对在模型输出层面存在越明显的非加性联合作用;single-feature H2 则反映单变量偏依赖无法解释的剩余波动比例。论文结果部分宜同时展示 Top-K 特征对交互强度表、全量交互热图和模型基础预测性能指标,从而区分“模型预测准确”与“模型存在显著交互结构”这两个不同层面的结论。若某一特征对在热图与排序表中均持续居前,可将其视为重点讨论的结构性交互关系。
7.3 表格标题模板
- 表 1 Friedman H 交互分析模型与参数设置表
- 表 2 Top-K 特征对交互强度排序结果表
- 表 3 单特征 H 统计量结果表
- 表 4 交互分析模型预测性能指标表
7.4 图表题注模板
- 图 1 全量特征对 Friedman H 交互强度热图。
- 图 2 Top-K 特征对交互强度排序图。
- 图 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 H2 与 single-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.xlsx 与 hstat_repro.xlsx 两类 repro 再生产物,且其工作表集合与主工作簿一致。
图件证据也成对存在:主图目录 HStat-Friedman_H_交互强度_results_20260329_170619_plots/、复现实验图目录 HStat-Friedman_H_交互强度_results_20260329_170619_reproduce_plots/ 以及 hstat_repro_plots/ 内都可直接核验 interaction_heatmap.png 与 top_pairs.png。因此 HStat 当前不只是“有主结果图”,而是具备主结果图与 repro 图的重复验证结构。
目录内还存在 repro_hstat.py 与 repro_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 = 120、max_depth = 5、top_k_pairs = 5、random_state = 42。同时 repro_inputs/ 下真实存在 hstat_baseline_input.csv 与 hstat_reproduce_20260329_170619_data.csv。因此这篇文档可以明确写成:当前 HStat 已具备同目录相对路径输入副本、主结果工作簿、复现工作簿和复现图目录的完整闭环。
9. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/可解释与AutoML/HStat-Friedman H 交互强度/results/HStat-Friedman H 交互强度分析结果_20260329_170619。 - 正文应围绕
原始数据、处理后数据、交互强度Top、交互强度全量、特征交互、模型指标、Parameters、偏依赖数据、图表清单来写。 - 图证应对应
interaction_heatmap.png与top_pairs.png,并把主结果图和 repro 图分别说明。 - 复现脚本应按
repro_hstat.py + repro_inputs/hstat_baseline_input.csv的口径说明,且目录里还保留了旧绝对路径兼容遗留。