基于评分的因果发现算法

一、背景

在基于分数的因果算法出现之前,通常都是使用基于约束的因果算法或者基于评分的方法进行因果发现任务。但是,在使用传统的基于评分方法时,需要对所有可能出现的因果结构进行评分,(如BIC)等,这意味着我们需要遍历所有可能的因果图(DAG),但是DAG的数量会随节点数呈指数增长,直接搜索会变为NP-hard问题,而NP-hard问题是难以解决的。
那么,我们怎么将NP-hard问题转化成其他问题呢?

如今有两种方式解决:

一:贪婪搜索(GES)

二:状态空间法

二、贪婪搜索(GES)

简单的来说,就是GES就是一个从数据中使用贪婪搜索学习贝叶斯网络的方法。

那为什么要弄出GES来呢,显而易见的好处就是,它不同于之前基于约束的PC算法等这一类要做条件独立性检验,这个基于评分的GES算法不需要做独立性检验,避开了独立性检验的缺陷,即无法识别马尔科夫等价类。

如何使用贪婪搜索?

使用贪婪搜索寻找因果图过程:

1.初始化所有节点的评分

BIC = n\ln(var(x))

2.向前的贪婪搜索

  1. 首先输入一个空图,随后遍历所有的节点对(i,j)
  2. 随机链接节点对(i,j),同时检查不能有环,不能破坏现有v字结构,并且满足团条件(clique condition)

注:意思就是团(clique)就是一个无向图的完全子图,既然是完全图,当然每对顶点之间都必须要有边相连。

    3.比较更新之后的图的评分和初始评分,当BIC变小时,更新图。

3.随后使用Meek规则,将部分无向边变为有向边

优先识别因果图中隐含的V-结构。

避免因保留 Y - Z 无向边而引入环(如 X →Y → Z → X)

4.向后的贪婪搜索

  1. 将所有有向边变为无向边
  2. 删除随机边,看是否满足DAG的条件,如果满足,便删除边,不满足便挑选其他的边进行删除
  3. 计算新图的评分,判断是否小于上次图的评分,如果小于,便更新因果图。

5.用Meek规则,将部分无向边变为有向边

三、状态空间法

 我们可以引入状态空间法,将NP-hard问题转化为其他的问题。

在构建因果图的过程中,我们将空图视为初始状态,随后每加入一个或多个因素,视为新的状态。

如果我们将空图视为起点最优因果图结构视为终点,中间每一个结构使用评分方法得到评分(BIC)

那么,这个NP-hard问题便转化为了寻找最佳路径的问题。

 上图每一个节点都代表了节点中所含变量的所有因果结构。

例如:下面这个例子就表示为上图的一种方案。

 那么,为了找到最佳路径,我们引入一个新概念:父集(Parent set)或父图(Parent Graph)

  • 父图指的是某个节点(变量)在因果图中的直接原因集合,即该节点的所有父节点组成的子图结构。例如,在DAG中,若变量 X 的父节点为 {A,B},则父图对应A→X 和 B→X 的结构。

  • 基于评分的算法通过为每个节点选择最优的父节点集合,逐步构建全局因果图。

这里我们便可以定义BIC评分的函数为:

BIC = n*ln(\frac{RSS}{n}) + k*ln(n)

其中,k = 父集中节点个数,RSS = residual

  • 当父集为空时,k=0

        即选中的节点i没有父节点,residual的计算公式为:

        residual = \sum_{j=1}^{n}X_{j,i}^{2}

        residual计算为当前结构评分的平方和。

  • 当父集不为空时,k>0

        当节点i有父节点时,通过最小二乘法来拟合线性回归模型,设父集对应的矩阵为A = X[:,structure],目标节点为b = X[:,i],系数向量为\beta,残差residual是拟合误差的平方和,即:

residual = \left \| b-A\widetilde{\beta } \right \|

现在,我们就得到了所有路径的分数。

这里有两种搜索最佳路径的方法:

1.A*搜索

2.Bellman-Ford算法

例如:

 这个例子中,我们得到了所有的父集评分,对应的寻找最佳路径图像。

使用A*搜索时,

我们需要当前节点与起始点的距离,以及当前节点与目标节点的距离

f = h + g

其中f为总距离,g为当前节点距离起始点的距离,h为当前节点距离目标点的距离

假设,我们当前状态为(1,2)节点

那么,当前状态评分g即为{() ->(1)},{(1)->(1,2)},h即为{(1,2)->(1,2,0)}

g = 350.8256453955563+278.83836226229937 = 629.66400765785567

h = -6692.330897503053

f = -6,062.66688984519733

那么上述结构的评分便为  -6,062.66688984519733

使用Bellman-Ford算法时(什么是Bellman-Ford算法?

按照随机顺序不断更新从起始点空集,一直到终点最优结构的距离。

参考:

1. Score-based causal discovery methods — causal-learn 0.1.3.6 documentation

 2.Huang, B., Zhang, K., Lin, Y., Schölkopf, B., & Glymour, C. (2018, July). Generalized score functions for causal discovery. In Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining (pp. 1551-1560).

3.Chickering, D. M. (2002). Optimal structure identification with greedy search. Journal of machine learning research, 3(Nov), 507-554.

4.Bellman-Ford最短路径算法_哔哩哔哩_bilibili

### 因果推理算法的实现方法 因果推理的核心在于识别变量间的因果关系而非仅仅相关性。以下是几种常见的因果推理算法及其具体实现方式: #### 1. 倾向性评分匹配 (Propensity Score Matching, PSM) PSM 是一种常用的因果推断方法,用于减少观察性研究中的混杂偏差。它通过计算处理组和对照组个体接受干预的概率来平衡协变量分布。 ```python from causalml.match import NearestNeighborMatch import pandas as pd # 构建数据集 data = pd.DataFrame({ 'treatment': [0, 1, 0, 1], 'outcome': [10, 20, 15, 25], 'covariate1': [1, 2, 3, 4], 'covariate2': [5, 6, 7, 8] }) matcher = NearestNeighborMatch(caliper=None, exclude_vars=[]) matched_data = matcher.fit(data['treatment'], data.drop('treatment', axis=1)) print(matched_data) ``` 这种方法适用于具有二元处理变量的情况,并能有效降低混淆因素的影响[^2]。 --- #### 2. 双重稳健估计 (Doubly Robust Estimation) 双重稳健估计是一种结合回归调整和逆概率加权的方法,能够在至少一个模型正确指定的情况下提供一致的估计结果。 ```python from sklearn.linear_model import LinearRegression import numpy as np def doubly_robust_estimation(treatment, outcome, covariates): ipw_model = LogisticRegression() mu_0_model = LinearRegression() mu_1_model = LinearRegression() # 训练IPW模型 ipw_model.fit(covariates, treatment) # 计算倾向得分 propensity_scores = ipw_model.predict_proba(covariates)[:, 1] # 分别训练控制组和实验组的结局模型 control_idx = np.where(treatment == 0)[0] treated_idx = np.where(treatment == 1)[0] mu_0_model.fit(covariates.iloc[control_idx], outcome.iloc[control_idx]) mu_1_model.fit(covariates.iloc[treated_idx], outcome.iloc[treated_idx]) # 结合两部分进行最终估计 dr_estimate = ( sum((treatment * (outcome - mu_1_model.predict(covariates)) / propensity_scores) + ((1 - treatment) * (mu_0_model.predict(covariates))) - ((1 - treatment) * (outcome - mu_0_model.predict(covariates)) / (1 - propensity_scores))) ) / len(outcome) return dr_estimate doubly_robust_estimation(...) ``` 此方法特别适合于高维数据环境下的因果效应估计。 --- #### 3. Do-Calculus 和结构因果模型 (Structural Causal Models, SCMs) Do-Calculus 提供了一种形式化框架,允许我们从观测数据中推导出因果效应。SCMs 则定义了变量间的关系网络。 ```python from causallib.estimation import IPW ipw_estimator = IPW(estimator="logistic", clip_min=0.01, clip_max=0.99) ipw_estimator.fit(X_train, a_train) ate = ipw_estimator.estimate_population_outcome(X_test, a_test).mean() print(f"Average Treatment Effect: {ate}") ``` 上述代码展示了如何利用 `causallib` 库执行基于 IPW 的平均治疗效果估计[^3]。 --- #### 4. 合成控制法 (Synthetic Control Method) 合成控制法主要用于面板数据环境中,构建未受干预影响的虚拟对照单位以评估政策或其他干预措施的效果。 ```python from synthcontrol import Synth synth = Synth() synth.fit( donor_pool=data.query("state != 'California'"), recipient=data.query("state == 'California'") ) effects = synth.predict_effects(intervention_time=1988) print(effects) ``` 该方法尤其适用于时间序列数据分析场景[^4]。 --- ### 软件工具推荐 除了手动编码外,还可以借助专门设计的库简化开发流程: - **CausalML**: 支持多种机器学习驱动型因果推断技术。 - **DoWhy**: 自动验证假设条件并生成因果图。 - **EconML**: 微软开源项目,专注于异质性处理效应分析。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值