【Python實戰因果推斷】2_因果效應異質性2

目錄

CATE with Regression

Evaluating CATE Predictions


CATE with Regression

我想你可能已經預料到了:與應用因果推理中的大多數情況一樣,答案往往從線性回歸開始。但在走這條路之前,讓我們把事情變得更具體一些。假設你在一家遍布全國的連鎖餐廳工作。這項業務的一個關鍵組成部分是了解何時應該給顧客打折。為此,該公司在全國范圍內進行了一項為期三年的實驗,在連鎖店中的六家不同餐廳隨機提供折扣。數據存儲在以下數據框中:

您的目標是了解何時是打折的最佳時機。在這些數據中,每家餐廳和每一天都有一行數據。這與本書中使用的大多數示例有些不同,以前的示例以顧客為單位。現在,單位是日-餐廳組合。即便如此,你仍然可以運用以前的推理方法,只是你要 "對待"(給予折扣)的不是顧客,而是 "對待 "日。您也可以在每一天的每家餐廳采用不同的價格,但我們還是把問題簡化為保持各餐廳的價格一致。

您可以將這一業務問題視為 CATE 估算問題。如果您能創建一個模型,輸出每一天的銷售額對折扣的敏感度以及協變量,即 \frac\partial{\partial t}E[Sales(t)|X] ,那么,您就可以使用該模型來決定何時打折以及打多少折。

現在你有了更具體的東西可以利用,讓我們來看看回歸如何幫助你。回想一下,您當時的情況很復雜。您需要預測 \frac{\delta Y_{i}}{\delta T_{i}},但遺憾的是,它是不可觀測的。所以你不能簡單地使用多項式回歸算法,然后將其作為目標。但也許你并不需要觀察?\frac{\delta Y_{i}}{\delta T_{i}}?來預測它。

例如,假設您對數據擬合了以下線性模型:y_i=\beta_0+\beta_1t_i+\beta_2X_i+e_i

如果在治療上加以區分,結果會如下:\frac{\delta y_i}{\delta t_i}=\beta_1? 即 在隨機治療的情況下ATE。

由于可以通過估計前面的模型得到 \widehat{\beta}_{1} ,因此甚至可以說,即使無法觀察到斜率,也可以預測斜率。在這個例子中,預測相當簡單。您預測的是每個人的恒定值 \widehat{\beta}_{1}。這是件好事,但并不是您想要的。這是 ATE,而不是 CATE。這對您計算何時給予折扣沒有任何幫助,因為每個單位(日和餐廳組合)得到的斜率預測都是一樣的。

要改進它,可以做以下簡單的改變:y_i=\beta_0+\beta_1t_i+\beta_2X_i+\beta_3t_iX_i+e_i,這樣就可以預測出以下坡度:\frac{\widehat{\delta y_i}}{\delta t_i}=\widehat{\beta_1}+\widehat{\beta_3}X_i其中,\beta_3 是 X 特征的向量系數!

每個由不同 Xi 定義的實體都會有不同的斜率預測。換句話說,斜率預測會隨著 X 的變化而變化。直觀地說,包含治療與協變因素之間的交互作用可以讓模型了解效果如何隨著這些協變因素的變化而變化。這就是回歸如何為您提供估計 CATE 的方法,即使您無法直接預測它。
理論就講到這里。讓我們來看看如何編寫代碼。首先,您需要定義協變量。在本例中,協變量基本上是日期的特定特征,如月份、星期以及是否是節假日。我還加入了競爭對手的平均價格,因為這可能會影響顧客對每家餐廳折扣的反應。

一旦有了協變量,就需要將它們與治療進行交互。* 運算符就可以做到這一點。它為左側和右側創建一個加法項,再加上一個交互項。例如,a*b 將在回歸中包含 a、b 和 a * b 項。在你的例子中,結果如下:

sales_i=\beta_0+\beta_1discount_i+\beta_2X_i^\star discount_i+\beta_3X_i+e_i

import statsmodels.formula.api as smf
X = ["C(month)", "C(weekday)", "is_holiday", "competitors_price"]
regr_cate = smf.ols(f"sales ~ discounts*({'+'.join(X)})",data=data).fit()

估算出模型后,就可以從參數估算值中提取預測斜率:

\frac{\delta sales_i}{\delta discounts_i}=\widehat{\beta_1}+\widehat{\beta_3}X_i

其中,β1 是折扣系數,β3 是交互系數向量。您可以直接從擬合模型中提取這些參數,但獲得斜率預測的更簡便方法是使用導數的定義:\frac{\delta y}{\delta t}=\frac{y(t+\epsilon)-y(t)}{(t+\epsilon)-t},?\epsilon趨近0,?您可以用 1 代替 \epsilon?來近似地理解這一定義:\frac{\delta y}{\delta t}\approx\hat{y}(t+1)-\hat{y}(t),?其中 y 由模型預測值給出。由于這是一個線性模型,因此近似值是精確的。

換句話說,您將用模型做出兩個預測:一個通過原始數據,另一個通過原始數據,但處理量增加了一個單位。這兩個預測之間的差異就是您的 CATE 預測。下面是一些代碼:

ols_cate_pred = (regr_cate.predict(data.assign(discounts=data["discounts"]+1))-regr_cate.predict(data))

好了,您有了 CATE 模型及其預測。但仍有一個潛伏的問題:它到底有多好?換句話說,如何評估這個模型?您可能已經知道,比較實際值和預測值在這里是行不通的,因為實際治療效果并不是在單位水平上觀察到的。

Evaluating CATE Predictions

如果您有傳統數據科學的背景,您可能會發現這種 CATE 預測看起來很像常規的機器學習預測,但卻有一個無法在單位層面觀察到的隱秘目標。這意味著,傳統機器學習中使用的大量模型評估技術(如交叉驗證)在這里仍然適用,而其他技術則需要一些調整。

因此,為了保持傳統,我們將數據分為訓練集和測試集。既然有時間維度,那就用它吧。訓練集將包含 2016 年和 2017 年的數據,測試集則包含 2018 年以后的數據:

train = data.query("day<'2018-01-01'")
test = data.query("day>='2018-01-01'")

現在,讓我們重試之前的 CATE 回歸模型,但只使用訓練數據進行估計,并對測試集進行預測:

X = ["C(month)", "C(weekday)", "is_holiday", "competitors_price"]regr_model = smf.ols(f"sales ~ discounts*({'+'.join(X)})",data=train).fit()cate_pred = (regr_model.predict(test.assign(discounts=test["discounts"]+1))-regr_model.predict(test))

為了增加趣味性,讓我們用一個純粹的預測性機器學習模型來衡量這個回歸模型。這個機器學習模型只是試圖預測結果 Y:

from sklearn.ensemble import GradientBoostingRegressorX = ["month", "weekday", "is_holiday", "competitors_price", "discounts"]y = "sales"np.random.seed(1)ml_model = GradientBoostingRegressor(n_estimators=50).fit(train[X],train[y])ml_pred = ml_model.predict(test[X])

最后,讓我們把一個非常糟糕的模型也納入比較范圍。這個模型簡單地輸出-1 和 1 之間的隨機數。這顯然是無稽之談,但也是一個值得關注的有趣基準。歸根結底,你想知道用 CATE 模型分配治療是否會比隨機分配更好,這就是最后一個模型的作用。

為了方便起見,我將所有數據存儲在一個新的數據幀 test_pred:

np.random.seed(123)test_pred = test.assign(ml_pred=ml_pred,cate_pred=cate_pred,rand_m_pred=np.random.uniform(-1, 1, len(test)),)

有了模型之后,就該想辦法評估和比較它們了。也就是說,你必須面對ground truth是不可觀測的這一事實。正如你很快就會看到的,訣竅在于認識到,盡管你無法測量單個個體的治療效果,但你可以估計很小群體的治療效果。因此,如果你想用 CATE 來評估你的模型,就必須依賴于群體層面的指標。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35992.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[A133]uboot啟動流程

[A133]uboot啟動流程 hongxi.zhu 2024-6-21 1. 第一階段 lds描述 從u-boot.lds中能找到程序的匯編入口ENTRY(_start) brandy/brandy-2.0/u-boot-2018/u-boot.lds OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUT…

Spring Boot中的異步編程技巧

Spring Boot中的異步編程技巧 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討在Spring Boot應用程序中如何使用異步編程技巧&#xff0c;以提升性…

LeetCode題練習與總結:單詞拆分--139

一、題目描述 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。如果可以利用字典中出現的一個或多個單詞拼接出 s 則返回 true。 注意&#xff1a;不要求字典中出現的單詞全部都使用&#xff0c;并且字典中的單詞可以重復使用。 示例 1&#xff1a; 輸入: s "l…

vant組件 頂部下拉刷新和頁面底部下拉獲取數據+頂部搜索框

1.html部分&#xff08;頂部tab切換無&#xff0c;只有主體list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"請輸入搜索關鍵詞"search"…

JavaEE之HTTP協議(1)_HTTP基礎知識,HTTP 請求、響應格式,方法,狀態碼

一、HTTP協議 1.1 基本概念: HTTP全稱超文本傳輸協議&#xff0c;是一種無狀態的、應用層的協議&#xff0c;它基于請求/響應模型。客戶端&#xff08;通常是Web瀏覽器&#xff09;通過發送HTTP請求到服務器來獲取或發送信息&#xff0c;服務器則返回HTTP響應作為回應。HTTP協…

shell (三)shell腳本

SHELL腳本 編程語言的分類 解釋型語言&#xff1a;shell&#xff0c;Python&#xff0c;需要解析器 編譯型語言&#xff1a;C語言&#xff0c;C&#xff0c;需要編譯器 shell腳本 操作系統的結構 shell&#xff08;貝殼&#xff09; 應用層 app&#xff0c;代碼 應用層需要通…

2024年軟件測試面試題大全【答案+文檔】

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 一、面試基礎題 簡述測試流程&#xff1a; 1、閱讀相關技術文檔&#xff08;如產品PRD、UI設計…

1、線性回歸模型

1、主要解決問題類型 1.1 預測分析(Prediction) 線性回歸可以用來預測一個變量(通常稱為因變量或響應變量)的值,基于一個或多個輸入變量(自變量或預測變量)。例如,根據房屋的面積、位置等因素預測房價。 1.2 異常檢測(Outlier Detection) 線性回歸可以幫助識別數…

鴻蒙開發系統基礎能力:【@ohos.systemTime (設置系統時間)】

設置系統時間 本模塊用來設置、獲取當前系統時間&#xff0c;設置、獲取當前系統日期和設置、獲取當前系統時區。 說明&#xff1a; 本模塊首批接口從API version 7開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import systemTime …

沙盒在數據防泄密領域意義

在信息化快速發展的今天&#xff0c;數據已成為企業最寶貴的資產之一。然而&#xff0c;數據泄密事件頻發&#xff0c;給企業的安全和發展帶來了巨大威脅。SDC沙盒防泄密系統&#xff0c;作為一種創新的數據防泄密解決方案&#xff0c;正逐漸在數據防泄密領域發揮著越來越重要的…

理解和使用JavaScript的閉包

閉包 在前端開發中&#xff0c;JavaScript是一種非常重要的編程語言。它的靈活性和強大功能使得開發者可以創建豐富的用戶體驗。然而&#xff0c;JavaScript中有些概念對于初學者來說可能比較難以理解&#xff0c;閉包就是其中之一。本文將深入探討JavaScript中的閉包&#xf…

安裝zabbix時報錯Could not resolve host: mirrors.huaweicloud.com;Unknown error解決辦法

目錄 1、問題原因 2、解決辦法 3、知識拓展 DNS的區別 DNS配置文件解析 域名解析過程 4、書籍推薦 當安裝Zabbix server&#xff0c;Web前端&#xff0c;agent時出現&#xff1a; [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安裝過程中會出…

Python3極簡教程(一小時學完)上

開始 Python 之旅 本教程基于 Python for you and me 教程翻譯制作&#xff0c;其中參考了 Python tutorial 和 _The Python Standard Library_&#xff0c;并對原教程的內容進行了改進與補充。 相關鏈接地址如下&#xff1a; _Python tutorial_&#xff1a;Python 入門指南…

數字孿生流域:定義、組成等

數字孿生流域&#xff1a;定義、組成等 1 數字孿生流域&#xff08;Digital Twin Basin/Watershed&#xff09;總則1.1 定義1.2 適用范圍1.3 建設目標1.4 建設原則 2 數字孿生流域框架與組成2.1 數字孿生流域框架2.2 數字孿生流域組成2.2.1 數字孿生平臺2.2.2 信息化基礎設施 3…

類的裝飾器

1 使用類定義裝飾器 class Person(object):def __init__(self):self._age 0propertydef age(self):return self._ageage.setterdef age(self,newValue):print(觸發了嗎)self._age newValuep Person() print(p.age) # 0 p.age 20 print(p.age) # 20 2 類屬性 class Pe…

JavaScript學習筆記(二)

12、數字 常規用法和java的用法相似&#xff0c;就不再做詳細的記錄, JavaScript 數字 以下只記錄特殊用法&#xff1a; 12.1 數字字符串運算 在所有數字運算中&#xff0c;JavaScript 會嘗試將字符串轉換為數字&#xff1a; var x "100"; var y "10"…

探索QCS6490目標檢測AI應用開發(一):Yolov8n模型轉換及量化

目標檢測&#xff08;Object Detection&#xff09;是計算機視覺領域的核心任務之一&#xff0c;它旨在識別圖像中的物體并確定其位置&#xff0c;在本期的文章中&#xff0c;我們用一個端到端的目標檢測AI應用為例子。介紹如何在QCS6490 Ubuntu系統上實現一個目標檢測應用開發…

第 5 章理解 ScrollView 并構建 Carousel UI

通過上一章的學習,我相信你現在應該明白如何使用堆棧構建復雜的 UI。當然,在你掌握 SwiftUI 之前,你還需要大量的練習。因此,在深入研究 ScrollView 以使視圖可滾動之前,讓我們先以一個挑戰開始本章。你的任務是創建一個類似于圖 1 所示的卡片視圖。 …

如何遷移R包

遷移R包涉及將一個或多個R包從一個系統轉移到另一個系統。以下是遷移R包的詳細步驟&#xff1a; 1. 確定要遷移的R包 首先&#xff0c;列出你在當前系統中安裝的所有R包&#xff0c;或僅列出你需要遷移的R包。你可以使用以下代碼列出所有安裝的R包&#xff1a; installed_pa…

swp添加池子addLiquidity失敗

案發現場 首次添加交易對、一直失敗、但是也沒提示具體的原因。到這一步就沒了、由下圖可知、也沒看到log、由此可見第一步就失敗了。 解決方案 一、添加 工廠KywFactory 添加如下 bytes32 public constant INIT_CODE_PAIR_HASH keccak256(abi.encodePacked(type(KywPair…