成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于因果森林算法的決策定位應用

譯文 精選
人工智能 機器學習
本文將通過一個實戰案例來深入探討如何使用機器學習隨機森林算法來輔助實現管理決策的戰略定位。

譯者 | 朱先忠?

審校 | 孫淑娟?

在我之前的??博客??中,我們已經了了如何使用因果樹來評估政策的異質處理效應。如果你還沒有讀過,我建議你在閱讀本文前先讀一遍,因為我們在本文中認為你已經了解了此文中部分與本文相關的內容。

為什么是異質處理效應(HTE:heterogenous treatment effects)?首先,對異質處理效應的估計允許我們根據們的預期結果(疾病、公司收入、客戶滿意度等)選擇提供處理(藥物、廣告、產品等)的用戶(患者、用戶、客戶等)。換句話說,估計HTE有助于我們進行目標定位。事實上,正如我們將在文章后面看到的那樣,一種處理方法在給一部分用戶帶來積極益處的同時,平均來說可能無效甚至適得其反。相反的情況也可能是這樣的:一種藥物平均來說是有效的,但如果我們明確它對其有副作用的使用者信息的話此藥物的有效性就會進一步提高。?

在本文中,我們將探討因果樹的一個擴展——因果林。正如隨機森林通過將多個自助樹平均在一起來擴展回歸樹一樣,因果森林也擴展了因果樹。主要的區別來自于推理的角度,它不那么直接。我們還將了解如何比較不同HTE估計算法的輸出,以及如何將其用于政策目標。?

在線折扣案例?

在本文的其余部分,我們繼續使用我上一篇有關因果樹文章中使用的玩具示例:我們假設我們是一家在線商店,我們有興趣了解向新客戶提供折扣是否會增加他們在商店中的支出。?

為了了解折扣是否劃算,我們進行了以下隨機實驗或A/B測試:每次新客戶瀏覽我們的在線商店時,我們都會將其隨機分配給一個處理條件。我們為受處理的用戶提供折扣而為控制用戶,我們不提供折扣。我從文件src.dgp導入數據生成過程dgp_online_discounts()。我還從src.utils導入一些繪圖函數和庫。為了不僅包括代碼,還包括數據和表等內容,我使用了Deepnote框架,這是一個類似Jupyter的基于Web的協作筆記本環境。?

我們有100000名在線cstore訪問者的數據,我們觀察他們訪問網站的時間、使用的設備、瀏覽器和地理區域。我們還會觀察到他們是否得到了折扣,我們的處理方式,他們的花費是多少,以及其他一些感興趣的結果?

由于實驗是隨機分配的,我們可以使用簡單的均值差估計來估計實驗效果。我們期望實驗組和對照組相似,但折扣除外,因此我們可以將支出的任何差異歸因于折扣。?

折扣看起來似乎是有效的:實驗組的平均花費增加了1.95美元。但是所有的顧客都受到同樣的影響嗎??

為了回答這個問題,我們想估計異質處理效應,可能是在個體層面。?

因果森林?

計算異質處理效應有許多不同的選擇。最簡單的方法是以異質性的維度與感興趣的結果進行交互。這種方法的問題在于選擇哪個變量。有時,我們有可能指導我們行動事先信息;例如,我們可能知道移動用戶的平均花費比桌面用戶多。其他時候,出于商業原因,我們可能對某個維度感興趣;例如,我們可能希望在某個地區投資更多。然而,當我們沒有額外的信息時,我們希望這個過程是數據驅動的。?

在上一篇文章中,我們探索了一種數據驅動的方法來估計異質處理效應——因果樹。我們現在將把它們擴展到因果森林。然而,在我們開始之前,我們必須介紹一下它的非因果表親——隨機森林。?

隨機森林,顧名思義,是回歸樹的延伸,在其上增加了兩個獨立的隨機性來源。特別是,隨機森林算法能夠對許多不同的回歸樹進行預測,每個樹都在數據的自助樣本上進行訓練,并將它們平均在一起。該過程通常稱為引導聚集算法,又稱裝袋算法,可以應用于任何預測算法,而不是隨機森林特有的。隨機性的額外來源來自特征選擇,因為在每次分割時,只有所有特征X的隨機子集被考慮用于最優分割。?

這兩個額外的隨機性來源非常重要,有助于提高隨機森林的性能。首先,裝袋算法允許隨機森林通過對多個離散預測進行平均來產生比回歸樹更平滑的預測。相反,隨機特征選擇允許隨機森林更深入地探索特征空間,允許它們發現比簡單回歸樹更多的交互。事實上,變量之間可能存在相互作用,這些相互作用本身不具有很強的預測性(因此不會產生分裂),但共同作用非常強大。?

因果森林相當于隨機森林,但用于估計異質處理效應,與因果樹和回歸樹完全相同。正如因果樹一樣,我們有一個基本問題:我們有興趣預測一個我們沒有觀察到的對象:個體處理效果τ?。解決方案是創建一個輔助結果變量Y*,其每一次觀察的預期值正好是處理效果。?

輔助結果變量?

如果你想更多了解為什么這個變量對個體處理效果沒有添加偏置的話,請看一下??我之前的文章??,我在這篇文章中進行了詳細介紹。簡而言之,您可以認為Y?*作為單個觀測的均值差估計量。

一旦我們有了一個結果變量,為了使用隨機森林來估計異質處理效應,我們還需要做一些事情。首先,我們需要建造在每片葉子上具有相同數量的處理單元和控制單元的樹。其次,我們需要使用不同的樣本來構建樹并對其進行評估,即計算每片葉子的平均結果。這個過程通常被稱為誠實樹(honest trees),因為我們可以將每個葉子的樣本視為獨立于樹結構,所以它對推斷非常有用。?

在進行評估之前,讓我們先為分類變量device、browserregion生成虛擬變量。?

df_dummies = pd.get_dummies(df[dgp.X[1:]], drop_first=True)?
df = pd.concat([df, df_dummies], axis=1)?
X = ['time'] + list(df_dummies.columns)?

現在,我們可以使用隨機森林算法來估計異質處理效應。幸運的是,我們不必手動完成所有這些,因為微軟公司的EconML包中已經提供了一個很好的因果樹和森林實現。我們將使用其中的CausalForestML函數。?

from econml.dml import CausalForestDML?

np.random.seed(0)?
forest_model = CausalForestDML(max_depth=3)?
forest_model = forest_model.fit(Y=df[dgp.Y], X=df[X], T=df[dgp.D])?

與因果樹不同,因果森林更難解釋,因為我們無法可視化每一棵樹。我們可以使用SingleTreeateInterpreter函數來繪制因果森林算法的等效表示。?

from econml.cate_interpreter import SingleTreeCateInterpreter?

intrp = SingleTreeCateInterpreter(max_depth=2).interpret(forest_model, df[X])?
intrp.plot(feature_names=X, fnotallow=12)?

因果森林模型表示?

我們可以像因果樹模型一樣解釋樹形圖。在頂部,我們可以看到數據中的平均$Y^*$的值為1.917$。從那里開始,根據每個節點頂部突出顯示的規則,數據被拆分為不同的分支。例如,根據時間是否晚于11.295,第一節點將數據分成大小為46878$和53122$的兩組。在底部,我們得到了帶有預測值的最終分區。例如,最左邊的葉子包含40191$的觀察值(時間早于11.295,非Safari瀏覽器環境下),我們預測其花費為0.264$。較深的節點顏色表示預測值較高。?

這種表示的問題在于,與因果樹的情況不同,它只是對模型的解釋。由于因果森林是由許多自樹組成的,因此無法直接檢查每個決策樹。了解在確定樹分割時哪個特征最重要的一種方法是所謂的特征重要性。?

顯然,時間是異質性的第一個維度,其次是設備(特別是移動設備)和瀏覽器(特別是Safari)。其他維度無關緊要。?

現在,讓我們檢查一下模型性能如何?

性能?

通常,我們無法直接評估模型性能,因為與標準的機器學習設置不同,我們沒有觀察到實際情況。因此,我們不能使用測試集來計算模型精度的度量。然而,在我們的案例中,我們控制了數據生成過程,因此我們可以獲得基本的真相。讓我們從分析模型如何沿著數據、設備、瀏覽器和區域的分類維度估計異質處理效應開始。?

def compute_discrete_effects(df, hte_model):?
temp_df = df.copy()?
temp_df.time = 0?
temp_df = dgp.add_treatment_effect(temp_df)?
temp_df = temp_df.rename(columns={'effect_on_spend': 'True'})?
temp_df['Predicted'] = hte_model.effect(temp_df[X])?
df_effects = pd.DataFrame()?
for var in X[1:]:?
for effect in ['True', 'Predicted']:?
v = temp_df.loc[temp_df[var]==1, effect].mean() - temp_df[effect][temp_df[var]==0].mean()?
effect_var = {'Variable': [var], 'Effect': [effect], 'Value': [v]}?
df_effects = pd.concat([df_effects, pd.DataFrame(effect_var)]).reset_index(drop=True)?
return df_effects, temp_df['Predicted'].mean()?

df_effects, avg_effect_notime = compute_discrete_effects(df, forest_model)?

對于每個分類變量,我們繪制了實際和估計的平均處理效果。?

fig, ax = plt.subplots()?
sns.barplot(data=df_effects, x="Variable", y="Value", hue="Effect", ax=ax).set(?
xlabel='', ylabel='', title='Heterogeneous Treatment Effects')?
ax.set_xticklabels(ax.get_xticklabels(), rotatinotallow=45, ha="right");?

作者提供的每個分類值的真實和估計處理效果?

因果森林算法非常善于預測與分類變量相關的處理效果。至于因果樹,這是預期的,因為算法具有非常離散的性質。然而,與因果樹不同的是,預測更加微妙。?

我們現在可以做一個更相關的測試:算法在時間等連續變量下的表現如何?首先,讓我們再次隔離預測的處理效果,并忽略其他協變量。?

def compute_time_effect(df, hte_model, avg_effect_notime):?

df_time = df.copy()?
df_time[[X[1:]] + ['device', 'browser', 'region']] = 0?
df_time = dgp.add_treatment_effect(df_time)?
df_time['predicted'] = hte_model.effect(df_time[X]) + avg_effect_notime?
return df_time?

df_time = compute_time_effect(df, forest_model, avg_effect_notime)?

我們現在可以復制之前的數字,但時間維度除外。我們繪制了一天中每個時間的平均真實和估計處理效果。?

sns.scatterplot(x='time', y='effect_on_spend', data=df_time, label='True')?
sns.scatterplot(x='time', y='predicted', data=df_time, label='Predicted').set(?
ylabel='', title='Heterogeneous Treatment Effects')?
plt.legend(title='Effect');?

沿時間維度繪制的真實和估計的處理效果?

我們現在可以充分理解因果樹和森林之間的區別:雖然在因果樹的情況下,估計基本上是一個非常粗略的階躍函數,但我們現在可以看到因果樹如何產生更平滑的估計。?

我們現在已經探索了該模型,是時候使用它了!?

策略定位?

假設我們正在考慮向訪問我們在線商店的新客戶提供4美元的折扣。?

cost = 4?

折扣對哪些客戶有效?我們估計平均處理效果為1.9492美元。這意味著,平均而言折扣并不真正有利可圖。然而,現在可以針對單個客戶,我們只能向一部分新客戶提供折扣。我們現在將探討如何進行政策目標定位,為了更好地了解目標定位的質量,我們將使用因果樹模型作為參考點。?

我們使用相同的CauselForestML函數構建因果樹,但將估計數和森林大小限制為1。?

from econml.dml import CausalForestDML?

np.random.seed(0)?
tree_model = CausalForestDML(n_estimators=1, subforest_size=1, inference=False, max_depth=3)?
tree_model = tree_model.fit(Y=df[dgp.Y], X=df[X], T=df[dgp.D])?

接下來,我們將數據集分成一個訓練集和一個測試集。這一想法與交叉驗證非常相似:我們使用訓練集來訓練模型——在我們的案例中是異質處理效應的估計器——并使用測試集來評估其質量。主要區別在于,我們沒有觀察到測試數據集中的真實結果。但是我們仍然可以使用訓練測試分割來比較樣本內預測和樣本外預測。?

我們將所有觀察結果的80%放在訓練集中,20%放在測試集中。?

df_train, df_test = df.iloc[:80_000, :], df.iloc[20_000:,]?

首先,讓我們僅在訓練樣本上重新訓練模型。?

np.random.seed(0)?
tree_model = tree_model.fit(Y=df_train[dgp.Y], X=df_train[X], T=df_train[dgp.D])?
forest_model = forest_model.fit(Y=df_train[dgp.Y], X=df_train[X], T=df_train[dgp.D])?

現在,我們可以確定目標策略,即決定我們向哪些客戶提供折扣。答案似乎很簡單:我們向所有預期處理效果大于成本(4美元)的客戶提供折扣。?

借助于一個可視化工具,它可以讓我們了解處理對誰有效以及如何有效,這就是所謂的處理操作特征(TOC)曲線。這個名字可以看作基于另一個更著名的接收器操作特性(ROC)曲線的修正,該曲線描繪了二元分類器的不同閾值的真陽性率與假陽性率。這兩種曲線的想法類似:我們繪制不同比例受處理人群的平均處理效果。在一個極端情況下,當所有客戶都被處理時,曲線的值等于平均處理效果而在另一個極端情況下,當只有一個客戶被處理時曲線的值則等于最大處理效果。?

現在讓我們計算曲線。?

def compute_toc(df, hte_model, cost, truth=False):?
df_toc = pd.DataFrame()?
for q in np.linspace(0, 1, 101):?
if truth:?
df = dgp.add_treatment_effect(df_test)?
effect = df['effect_on_spend']?
else:?
effect = hte_model.effect(df[X])?
ate = np.mean(effect[effect >= np.quantile(effect, 1-q)])?
temp = pd.DataFrame({'q': [q], 'ate': [ate]})?
df_toc = pd.concat([df_toc, temp]).reset_index(drop=True)?
return df_toc?

df_toc_tree = compute_toc(df_train, tree_model, cost)?
df_toc_forest = compute_toc(df_train, forest_model, cost)?

現在,我們可以繪制兩個CATE估算器的處理操作特征TOC)曲線。?

def plot_toc(df_toc, cost, ax, color, title):?
ax.axhline(y=cost, lw=2, c='k')?
ax.fill_between(x=df_toc.q, y1=cost, y2=df_toc.ate, where=(df_toc.ate > cost), color=color, alpha=0.3)?
if any(df_toc.ate > cost):?
q = df_toc_tree.loc[df_toc.ate > cost, 'q'].values[-1]?
else: ?
q = 0?
ax.axvline(x=q, ymin=0, ymax=0.36, lw=2, c='k', ls='--')?
sns.lineplot(data=df_toc, x='q', y='ate', ax=ax, color=color).set(?
title=title, ylabel='ATT', xlabel='Share of treated', ylim=[1.5, 8.5]) ?
ax.text(0.7, cost+0.1, f'Discount cost: {cost:.0f}$', fnotallow=12)?

fix, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))?
plot_toc(df_toc_tree, cost, ax1, 'C0', 'TOC - Causal Tree')?
plot_toc(df_toc_forest, cost, ax2, 'C1', 'TOC - Causal Forest')?

處理操作特性曲線?

正如預期的那樣,兩種估算器的TOC曲線都在下降,因為平均效應隨著我們處理客戶份額的增加而降低。換言之,我們在發布折扣時越有選擇,每個客戶的優惠券效果就越高。我還畫了一條帶有折扣成本的水平線,以便我們可以將TOC曲線下方和成本線上方的陰影區域解釋為預期利潤。?

這兩種算法預測的處理份額相似,約為20%,因果森林算法針對的客戶略多一些。然而,他們預測的利潤結果卻大相徑庭。因果樹算法預測的邊際較小且恒定,而因果林算法預測的是更大且更陡的邊際。那么,種算法更準確?

為了比較它們,我們可以在測試集中對它們進行評估。我們采用訓練集上訓練的模型,預測處理效果,并將其與測試集上訓練模型的預測進行比較。注意,與機器學習標準測試程序不同,有一個實質性的區別:在我們的案例中,我們無法根據實際情況評估我們的預測,因為沒有觀察到處理效果。我們只能將兩個預測相互比較。?

def compute_effect_test(df_test, hte_model, cost, ax, title, truth=False):?
df_test['Treated'] = hte_model.effect(df_test[X]) > cost?
if truth:?
df_test = dgp.add_treatment_effect(df_test)?
df_test['Effect'] = df_test['effect_on_spend']?
else:?
np.random.seed(0)?
hte_model_test = copy.deepcopy(hte_model).fit(Y=df_test[dgp.Y], X=df_test[X], T=df_test[dgp.D])?
df_test['Effect'] = hte_model_test.effect(df_test[X])?
df_test['Cost Effective'] = df_test['Effect'] > cost?
tot_effect = ((df_test['Effect'] - cost) * df_test['Treated']).sum()?
sns.barplot(data=df_test, x='Cost Effective', y='Treated', errorbar=None, width=0.5, ax=ax, palette=['C3', 'C2']).set(?
title=title + '\n', ylim=[0,1])?
ax.text(0.5, 1.08, f'Total effect: {tot_effect:.2f}', fnotallow=14, ha='center')?
return ?


fix, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))?
compute_effect_test(df_test, tree_model, cost, ax1, 'Causal Tree')?
compute_effect_test(df_test, forest_model, cost, ax2, 'Causal Forest')?

因果樹模型似乎比因果森林模型表現得更好一些,總凈效應為8386美元——相對于4948美元。從圖中,我們也可以了解差異的來源。因果森林算法往往限制性更強,處理的客戶更少,沒有誤報的陽性,但也有很多誤報的陰性。另一方面,因果樹算法看起來更加“慷慨”,并將折扣分配給更多的新客戶。這既轉化為更多的真陽性,也轉化為假陽性。總之,凈效應似乎有利于因果樹算法。?

通常,我們討論到這里就可以停止,因為我們可以做的事情不多了。然而,在我們的案例情形中,我們可以訪問真正的數據生成過程。因此,接下來我們不妨檢查一下這兩種算法的真實精度。?

首先,讓我們根據處理效果的預測誤差來比較它們。對于每個算法,我們計算處理效果的均方誤差。?

from sklearn.metrics import mean_squared_error as mse?

def compute_mse_test(df_test, hte_model):?
df_test = dgp.add_treatment_effect(df_test)?
print(f"MSE = {mse(df_test['effect_on_spend'], hte_model.effect(df_test[X])):.4f}")?


compute_mse_test(df_test, tree_model)?
compute_mse_test(df_test, forest_model)?

結果是,隨機森林模型更好地預測了平均處理效果,均方誤差為0.5555美元,而不是0.9035美元。?

那么,這是否意味著更好的目標定位呢?我們現在可以復制上面所做的相同的柱狀圖,以了解這兩種算法在策略目標方面的表現。?

fix, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))?
compute_effect_test(df_test, tree_model, cost, ax1, 'Causal Tree', True)?
compute_effect_test(df_test, forest_model, cost, ax2, 'Causal Forest', True)?

幅圖非常相似,但結果卻大相徑庭。事實上,因果森林算法現在優于因果樹算法,總效果為10395美元,而8828美元。為什么會出現這種突然的差異?

為了更好地理解差異的來源,讓我們根據實際情況繪制TOC。?

df_toc = compute_toc(df_test, tree_model, cost, True)?

fix, ax = plt.subplots(1, 1, figsize=(7, 5))?
plot_toc(df_toc, cost, ax, 'C2', 'TOC - Ground Truth')?

處理操作特性曲線。?

正如我們所看到的,TOC是傾斜度非常大的,存在一些平均處理效果非常高的客戶。隨機森林算法能夠更好地識別它們,因此總體上更有效,盡管目標客戶較少?

結論?

在這篇文章中,我們學習了一個功能非常強大的估計異質處理效應算法——因果森林。因果森林建立在與因果樹相同的原則上,但受益于對參數空間和裝袋算法的更深入探索。?

此外,我們還了解了如何使用異質處理效應的估計來執行政策定位。通過識別具有最高處理效果的用戶,我們能夠確保一項政策有利可圖。我們還看到了政策目標與異質處理效應評估目標的不同,因為分布的尾部可能比平均值具有更強的相關?

參考文獻?

  • S. Athey, G. Imbens, Recursive partitioning for heterogeneous causal effects (2016), PNAS.?
  • S. Wager, S. Athey, Estimation and Inference of Heterogeneous Treatment Effects using Random Forests (2018), Journal of the American Statistical Association.?
  • S. Athey, J. Tibshirani, S. Wager, Generalized Random Forests (2019). The Annals of Statistics.?
  • M. Oprescu, V. Syrgkanis, Z. Wu, Orthogonal Random Forest for Causal Inference (2019). Proceedings of the 36th International Conference on Machine Learning.?

譯者介紹

朱先忠,51CTO社區編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。?

原文標題:??From Causal Trees to Forests??,作者:Matteo Courthoud



責任編輯:華軒 來源: 51CTO
相關推薦

2014-07-07 10:05:57

機械學習

2017-05-19 12:49:18

大數據時空算法商業決策

2016-12-05 16:33:30

2017-08-04 14:28:40

決策樹隨機森林CART模型

2014-12-15 10:59:08

RFIDWiFi定位

2021-05-28 17:18:44

TensorFlow數據機器學習

2024-01-30 00:55:23

2024-04-12 07:40:37

因果推斷推薦模型推薦系統

2022-10-27 14:25:46

無服務器Serverless云原生

2022-10-14 16:48:40

因果推斷數據預處理特征設計

2017-10-18 14:11:20

機器學習決策樹隨機森林

2022-11-11 08:00:00

決策樹機器學習監督學習

2023-05-04 08:28:30

因果推斷方法算法

2023-09-22 10:34:19

學習算法隨機森林Java

2017-09-25 16:16:49

決策樹隨機森林機器學習

2022-09-25 23:19:01

機器學習決策樹Python

2021-03-24 15:19:15

數據應用企業管理

2023-03-22 10:12:30

機器學習KPI自動化

2025-03-17 08:45:00

AI模型數據

2023-06-02 07:19:56

因果推斷度小滿
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九亚洲 | 深夜福利亚洲 | 免费成年网站 | 国产一区不卡 | 综合九九 | 国产成年人小视频 | 精品成人免费视频 | 亚洲交性 | 久久久久久久久久久福利观看 | 西西裸体做爰视频 | 亚洲 欧美 日韩在线 | 天天操天天操 | 欧美一级电影免费观看 | 亚洲网站在线观看 | 黄色av网站在线观看 | 男人的天堂中文字幕 | 超碰网址 | 亚洲一区二区三区视频免费观看 | 免费在线观看成年人视频 | 日本三级日产三级国产三级 | 九色在线 | 一区二区视屏 | 日本不卡一区 | 国产欧美精品一区 | 国产91久久久久久久免费 | 日韩中文在线 | 精品不卡 | 欧美一区二区三区在线观看 | 久久综合一区二区三区 | 三级免费毛片 | 不卡一区二区在线观看 | 秋霞电影院午夜伦 | 久久在线精品 | 色婷婷综合久久久中字幕精品久久 | 亚洲精品黄色 | 婷婷在线免费 | 亚洲精品一区在线观看 | 伊人网站视频 | 国产精品久久久久无码av | 国内成人免费视频 | 91一区二区在线观看 |