因果推理的三个层次分别是关联(相关性)、介入(治疗/干预/处理)、反事实(想象)。关联即相关性,是最低层次,目前的人工智能(弱智能)处于这个层次,虽然是最低层次,但仍能解决现实世界的很多问题。介入即行动(do),在协变量X、混杂因子W、工具变量Z(影响T但不影响Y的变量)的环境下通过干预T(do)得到结果Y。反事实,通过反事实(反事实是指现实世界对应的虚拟世界)提问(想象)执果求因,人类智能所处的层次,能够改变世界。
微软因果推理实现的主要框架dowhy和econml,dowhy通过建模、识别、估计、验证四个步骤实现因果推理的过程;econml是个潜在结果(不能观测到的结果)模型的期望估计框架,提供了基于三个假设的多种方法实现减少选择偏差(建模使用的样本与现实世界的偏差)。这些方法的实现主要依赖的机器学习的模型,包括线性回归、随机森林、决策树、深度学习等。dowhy在识别时可以使用econml的方法来进行估计。
因果推理的研究对象为U,如:酒店客户。其属性/特征为X(X为协变量或混杂因子),结果为Y,干预T。有时还有引入Z(工具变量,也是为了减少选择偏差)。
协变量指原因T与结果Y以外的所有其他变量。比如在现有数据中,除了原因和结果的变量,其他所有变量都是协变量。而混杂因素是这些协变量中“同时影响原因与结果的变量”。也就是说,协变量中包括混杂因素,也包括非混杂因素。
下面以变换酒店房间对取消订单的影响为例,通过dowhy框架来理解因果推理的过程。
一、创建模型(通过先验证知识创建一个初始因果图,根据数据集、干预、初始因果图创建因果模型),这个因果图可能不完全,但dowhy会自动补充完整。
1.准备数据集,包括特征工程
#准备数据集
import dowhy
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import logging
logging.getLogger("dowhy").setLevel(logging.INFO)
dataset = pd.read_csv('https://raw.githubusercontent.com/Sid-darthvader/DoWhy-The-Causal-Story-Behind-Hotel-Booking-Cancellations/master/hotel_bookings.csv')
dataset.columns
# Total stay in nights
dataset['total_stay'] = dataset['stays_in_week_nights']+dataset['stays_in_weekend_nights']
# Total number of guests
dataset['guests'] = dataset['adults']+dataset['children'] +dataset['babies']
# Creating the different_room_assigned feature
dataset['different_room_assigned']=0
slice_indices =dataset['reserved_room_type']!=dataset['assigned_room_type']
dataset.loc[slice_indices,'different_room_assigned']=1
# Deleting older features
dataset = dataset.drop(['stays_in_week_nights','stays_in_weekend_nights','adults','children','babies'
,'reserved_room_type','assigned_room_type'],axis=1)
dataset.isnull().sum() # Country,Agent,Company contain 488,16340,112593 missing entries
dataset = dataset.drop(['agent','company'],axis=1)
# Replacing missing countries with most freqently occuring countries
dataset['country']=