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

已知因果图未知因果函数,如何基于因果推断做非线性Y值预测?

因果推断框架下的预测问题求解

问题背景

我近期在学习因果推断(causal inference)与因果发现(causal discovery),一直被一个问题困扰:从文献中了解到,因果推断与传统机器学习差异显著——传统机器学习模型训练完成后,给定X即可直接预测Y值;而因果推断模型通常回答的是类似X从1变为2时对Y产生的因果效应这类问题。那么如何借助因果推断来解决预测类问题?

因果图与模拟数据

因果图构建代码

import networkx as nx
import matplotlib.pyplot as plt

# 创建有向图
G = nx.DiGraph()

# 添加节点X、Y、Z
G.add_nodes_from(['X', 'Y', 'Z'])

# 添加代表因果关系的边
G.add_edge('X', 'Y')
G.add_edge('Z', 'Y')

# 绘制因果图
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos, with_labels=True, node_color='lightblue', node_size=500, font_size=12, edge_color='gray')
plt.title('Causal Graph')
plt.show()

因果图

模拟数据生成代码

# 构建非线性关系
import numpy as np
import pandas as pd

# 生成X值
X = np.linspace(0, 10, 100)

# 生成Z值
Z = np.linspace(10, 20, len(X))

# 基于X和Z的非线性关系生成Y值
Y = np.sin(X) + np.cos(Z) + np.random.normal(0, 0.1, len(X))

# 合并为DataFrame
df = pd.DataFrame({'X': X, 'Z': Z, 'Y': Y})

# 打印数据
print(df)

生成的数据示例:

X         Z         Y
0    0.00000  10.00000 -0.781419
1    0.10101  10.10101 -0.691126
2    0.20202  10.20202 -0.603684
3    0.30303  10.30303 -0.418206
4    0.40404  10.40404 -0.087543
..       ...       ...       ...
95   9.59596  19.59596  0.748085
96   9.69697  19.69697  0.455545
97   9.79798  19.79798  0.365235
98   9.89899  19.89899  0.023566
99  10.00000  20.00000 -0.193462

[100 rows x 3 columns]

数据可视化代码

# 可视化数据
import matplotlib.pyplot as plt

# 绘制X、Y、Z的变化曲线
plt.plot(df['X'], label='X')
plt.plot(df['Y'], label='Y')
plt.plot(df['Z'], label='Z')

# 添加标签和图例
plt.xlabel('Index')
plt.ylabel('Value')
plt.legend()

# 展示图像
plt.show()

数据可视化图

核心问题

假设仅知晓因果图(Causal Graph)但不清楚具体因果函数,如何预测X=10、Z=20时的Y值?我尝试过用Microsoft causia识别因果图及进行因果推断,但这些方法无法解决该预测问题。

解决方案:因果引导的预测建模

在已知因果图的前提下,我们可以利用因果结构的约束构建更可靠的预测模型,核心思路是基于因果图明确Y的直接因果父节点,将这些父节点作为特征训练预测模型,具体步骤如下:

  1. 明确因果依赖关系
    从因果图可知,Y的直接原因是X和Z,二者之间没有混杂因子或后门路径需要控制(X和Z无直接边,也无共同父节点),因此可以直接用X和Z作为输入特征预测Y。

  2. 选择适配非线性的预测模型
    由于数据存在非线性关系(生成逻辑为Y = sin(X) + cos(Z) + 噪声),优先选择能拟合非线性的模型:

  • 梯度提升树(如XGBoost、LightGBM)
  • 神经网络
  • 高斯过程回归
  1. 模型训练与预测示例
    以下是用XGBoost实现的代码:
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(df[['X', 'Z']], df['Y'], test_size=0.2, random_state=42)

# 初始化XGBoost回归模型
model = xgb.XGBRegressor(objective='reg:squarederror', random_state=42)

# 训练模型
model.fit(X_train, y_train)

# 评估测试集性能
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"测试集均方误差: {mse:.4f}")

# 预测X=10、Z=20时的Y值
new_data = pd.DataFrame({'X': [10], 'Z': [20]})
predicted_y = model.predict(new_data)
print(f"X=10、Z=20时的Y预测值: {predicted_y[0]:.4f}")
  1. 因果框架的优势
    传统机器学习可能忽略因果结构盲目引入特征,而基于因果图的建模明确了只有X和Z是Y的直接原因,避免了无关特征或混淆变量导致的泛化性能下降。同时,训练好的模型还能直接用于因果效应计算(比如计算X从9变到10对Y的影响),实现预测与因果分析的统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:25:04