You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras深度学习模型中逻辑回归系数标准误的显著性检验问询

双分支Keras模型中检验数值输入显著性的思路与解决方案

首先得明确:深度学习模型和传统逻辑回归的系数显著性逻辑存在本质差异,你直接套用逻辑回归的标准误计算方法会有偏差,不过我们可以调整思路来实现你的核心需求——验证inputB对模型是否有显著贡献。

为什么你的当前思路存在问题?

传统逻辑回归的特征与预测结果是线性映射关系,每个特征对应明确的权重系数;但你的双分支模型里,inputB经过了多层Dense的非线性变换,最终和inputA的分支输出合并,这里不存在“inputB的系数”这种直接对应关系。你真正需要检验的是**inputB分支整体对模型预测的贡献**,或是该分支最终输出特征对最后预测层的显著性。

第一步:获取combined层的输出(解决你当前的直接困惑)

如果你只是想拿到combined层的输出矩阵,可以通过构建子模型的方式实现:

  1. 先给combined层添加名称(方便后续调用,也可以用索引定位):
# 定义合并层时添加名称
combined = concatenate([x.output, y.output], name='combined_layer')
  1. 基于原模型构建仅输出combined层结果的子模型:
from tensorflow.keras.models import Model

# 提取combined层的输出
combined_model = Model(inputs=model.input, outputs=model.get_layer('combined_layer').output)
# 获取训练集上的combined层输出矩阵
combined_output = combined_model.predict([x_train, numeric], verbose=1)

这样你就得到了combined对应的特征矩阵,但这只是解决了数据获取问题,后续的标准误计算仍需调整思路。

第二步:更适合深度学习的显著性检验方法

思路1:置换检验(最推荐,简单直观)

这是深度学习领域检验特征重要性的常用方法,核心逻辑是通过打乱目标输入的顺序,观察模型性能的变化:

  • 保持inputA不变,随机打乱inputB(即你的numeric输入)的样本顺序
  • 对比原始模型与打乱后模型的性能(损失/准确率)
  • 如果性能差异显著,说明inputB对模型有不可替代的贡献

示例代码:

import numpy as np

# 打乱numeric输入的顺序
shuffled_numeric = np.random.permutation(numeric)
# 计算原始模型的性能
original_loss, original_acc = model.evaluate([x_train, numeric], y_train, verbose=0)
# 计算打乱inputB后的模型性能
shuffled_loss, shuffled_acc = model.evaluate([x_train, shuffled_numeric], y_train, verbose=0)

# 可以重复多次打乱,用统计检验(如t检验)判断差异显著性
n_repeats = 50
acc_diff = []
for _ in range(n_repeats):
    shuffled_numeric = np.random.permutation(numeric)
    _, shuffled_acc = model.evaluate([x_train, shuffled_numeric], y_train, verbose=0)
    acc_diff.append(original_acc - shuffled_acc)

# 计算差异的统计显著性
from scipy.stats import ttest_1samp
t_stat, p_value = ttest_1samp(acc_diff, 0)
print(f"InputB贡献的显著性p值:{p_value}")
# 如果p值<0.05,说明inputB对模型有显著贡献

思路2:Bootstrap法估计权重标准误(贴近你的原始需求)

如果你一定要计算类似逻辑回归的标准误,可以针对最后一层(对应combined层的输出)的权重,用Bootstrap方法估计标准误:

  1. 多次从训练集中有放回采样,重新训练模型
  2. 每次记录最后一层中对应inputB分支的权重(即combined层后4维对应的权重,因为inputB分支最后输出是4维)
  3. 计算这些权重的标准差,即为标准误

示例代码:

import numpy as np
from tensorflow.keras.models import clone_model

n_bootstrap = 100
inputB_weights = []

for _ in range(n_bootstrap):
    # 有放回采样训练集
    idx = np.random.choice(len(y_train), len(y_train), replace=True)
    x_boot = x_train[idx]
    num_boot = numeric[idx]
    y_boot = y_train[idx]
    
    # 克隆原模型并重新训练
    boot_model = clone_model(model)
    boot_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
    boot_model.fit([x_boot, num_boot], y_boot, epochs=40, batch_size=50, verbose=0)
    
    # 获取最后一层权重,取后4个对应inputB分支的部分
    output_weights = boot_model.get_layer('output').get_weights()[0]
    inputB_weights.append(output_weights[-4:])

# 计算每个权重的标准误
weights_se = np.std(inputB_weights, axis=0)
print(f"InputB分支对应最后一层权重的标准误:{weights_se}")

总结

  • 直接套用逻辑回归的标准误计算方法到深度学习模型上是不合理的,因为前面的非线性层破坏了线性假设
  • 置换检验是最适合你的场景的方法,无需复杂的数学推导,就能直观验证inputB的贡献显著性
  • 如果一定要追求标准误指标,Bootstrap方法是更符合深度学习特性的选择

内容的提问来源于stack exchange,提问作者Felix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:53:11