貝葉斯網(wǎng)絡(luò)的因果關(guān)系檢測(cè)(Python)
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
在機(jī)器學(xué)任務(wù)中,確定變量間的因果關(guān)系(causality)可能是一個(gè)具有挑戰(zhàn)性的步驟,但它對(duì)于建模工作非常重要。本文將總結(jié)有關(guān)貝葉斯概率(Bayesian probabilistic)因果模型(causal models)的概念,然后提供一個(gè)Python實(shí)踐教程,演示如何使用貝葉斯結(jié)構(gòu)學(xué)習(xí)來(lái)檢測(cè)因果關(guān)系。
1. 背景
在許多領(lǐng)域,如預(yù)測(cè)、推薦系統(tǒng)、自然語(yǔ)言處理等,使用機(jī)器學(xué)習(xí)技術(shù)已成為獲取有用觀察和進(jìn)行預(yù)測(cè)的標(biāo)準(zhǔn)工具。
1.1. 相關(guān)性
-
正相關(guān):兩個(gè)變量之間存在一種關(guān)系,即兩個(gè)變量同時(shí)朝同一方向移動(dòng)。 -
負(fù)相關(guān):兩個(gè)變量之間存在一種關(guān)系,即一個(gè)變量增加與另一個(gè)變量減少相關(guān)聯(lián)。 -
無(wú)相關(guān)性:當(dāng)兩個(gè)變量之間沒(méi)有關(guān)系時(shí)。
1.1.2. 關(guān)聯(lián)性
方程 1:使用超幾何檢驗(yàn)測(cè)試幸存與女性之間的關(guān)聯(lián)性
2. 因果關(guān)系
如果兩個(gè)隨機(jī)變量 和 在統(tǒng)計(jì)上相關(guān)( ),那么要么(a) 導(dǎo)致 ,(b) 導(dǎo)致 ,或者(c)存在一個(gè)第三個(gè)變量 同時(shí)導(dǎo)致 和 。此外,給定 的條件下, 和 變得獨(dú)立,即 。
貝葉斯圖模型又稱貝葉斯網(wǎng)絡(luò)、貝葉斯信念網(wǎng)絡(luò)、Bayes Net、因果概率網(wǎng)絡(luò)和影響圖。都是同一技術(shù),不同的叫法。
可以創(chuàng)建四個(gè)圖:(a、b)級(jí)聯(lián),(c)共同父節(jié)點(diǎn)和(d)V 結(jié)構(gòu),這些圖構(gòu)成了貝葉斯網(wǎng)絡(luò)的基礎(chǔ)。
需要注意的是,貝葉斯網(wǎng)絡(luò)是有向無(wú)環(huán)圖(Directed Acyclic Graph, DAG),而 DAG 是具有因果性的。這意味著圖中的邊是有向的,并且沒(méi)有(反饋)循環(huán)(無(wú)環(huán))。
2.1. 概率論
-
后驗(yàn)概率(posterior probability)是給定 發(fā)生的概率。 -
條件概率(conditional probability)或似然是在假設(shè)成立的情況下,證據(jù)發(fā)生的概率。這可以從數(shù)據(jù)中推導(dǎo)出來(lái)。 -
我們的先驗(yàn)(prior)信念是在觀察到證據(jù)之前,假設(shè)的概率。這也可以從數(shù)據(jù)或領(lǐng)域知識(shí)中推導(dǎo)出來(lái)。 -
最后,邊際(marginal)概率描述了在所有可能的假設(shè)下新證據(jù)發(fā)生的概率,需要計(jì)算。如果您想了解更多關(guān)于(分解的)概率分布或貝葉斯網(wǎng)絡(luò)的聯(lián)合分布的詳細(xì)信息,請(qǐng)閱讀這篇博客[6]。
3. 貝葉斯結(jié)構(gòu)學(xué)習(xí)用于估計(jì) DAG
BIC是貝葉斯信息準(zhǔn)則(Bayesian Information Criterion)的縮寫。它是一種用于模型選擇的統(tǒng)計(jì)量,可以用于比較不同模型的擬合能力。BIC值越小,表示模型越好。在貝葉斯網(wǎng)絡(luò)中,BIC是一種常用的評(píng)分函數(shù)之一,用于評(píng)估貝葉斯網(wǎng)絡(luò)與數(shù)據(jù)的擬合程度。
BDeu是貝葉斯-狄利克雷等價(jià)一致先驗(yàn)(Bayesian-Dirichlet equivalent uniform prior)的縮寫。它是一種常用的評(píng)分函數(shù)之一,用于評(píng)估貝葉斯網(wǎng)絡(luò)與數(shù)據(jù)的擬合程度。BDeu評(píng)分函數(shù)基于貝葉斯-狄利克雷等價(jià)一致先驗(yàn),該先驗(yàn)假設(shè)每個(gè)變量的每個(gè)可能狀態(tài)都是等可能的。
基于評(píng)分的結(jié)構(gòu)學(xué)習(xí)
-
基于約束的結(jié)構(gòu)學(xué)習(xí)
3.1. 基于評(píng)分的結(jié)構(gòu)學(xué)習(xí)
-
搜索算法用于優(yōu)化所有可能的 DAG 搜索空間;例如 ExhaustiveSearch、Hillclimbsearch、Chow-Liu 等。 -
評(píng)分函數(shù)指示貝葉斯網(wǎng)絡(luò)與數(shù)據(jù)的匹配程度。常用的評(píng)分函數(shù)是貝葉斯狄利克雷分?jǐn)?shù),如 BDeu 或 K2,以及貝葉斯信息準(zhǔn)則(BIC,也稱為 MDL)。
-
ExhaustiveSearch,顧名思義,對(duì)每個(gè)可能的 DAG 進(jìn)行評(píng)分并返回得分最高的 DAG。這種搜索方法僅適用于非常小的網(wǎng)絡(luò),并且阻止高效的局部?jī)?yōu)化算法始終找到最佳結(jié)構(gòu)。因此,通常無(wú)法找到理想的結(jié)構(gòu)。然而,如果只涉及少數(shù)節(jié)點(diǎn)(即少于 5 個(gè)左右),啟發(fā)式搜索策略通常會(huì)產(chǎn)生良好的結(jié)果。 -
Hillclimbsearch 是一種啟發(fā)式搜索方法,可用于使用更多節(jié)點(diǎn)的情況。HillClimbSearch 實(shí)施了一種貪婪的局部搜索,從 DAG“start”(默認(rèn)為斷開的 DAG)開始,通過(guò)迭代執(zhí)行最大化增加評(píng)分的單邊操作。搜索在找到局部最大值后終止。 -
Chow-Liu 算法是一種特定類型的基于樹的方法。Chow-Liu 算法找到最大似然樹結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)最多只有一個(gè)父節(jié)點(diǎn)。通過(guò)限制為樹結(jié)構(gòu),可以限制復(fù)雜性。 -
Tree-augmented Naive Bayes(TAN)算法也是一種基于樹的方法,可用于建模涉及許多不確定性的龐大數(shù)據(jù)集的各種相互依賴特征集。
3.2. 基于約束的結(jié)構(gòu)學(xué)習(xí)
4. 實(shí)踐:基于bnlearn 庫(kù)
結(jié)構(gòu)學(xué)習(xí):給定數(shù)據(jù):估計(jì)捕捉變量之間依賴關(guān)系的 DAG。
參數(shù)學(xué)習(xí):給定數(shù)據(jù)和 DAG:估計(jì)各個(gè)變量的(條件)概率分布。
-
推斷:給定學(xué)習(xí)的模型:確定查詢的精確概率值。
基于 pgmpy 庫(kù)構(gòu)建
包含最常用的貝葉斯管道
簡(jiǎn)單直觀
開源
詳細(xì)文檔
4.1. 在灑水器數(shù)據(jù)集中進(jìn)行結(jié)構(gòu)學(xué)習(xí)
使用 bnlearn 庫(kù),用幾行代碼就能確定因果關(guān)系。
請(qǐng)注意,灑水器數(shù)據(jù)集已經(jīng)過(guò)處理,沒(méi)有缺失值,所有值都處于 1 或 0 的狀態(tài)。
濕草的狀態(tài)取決于兩個(gè)節(jié)點(diǎn),即雨水和灑水器;
雨水的狀態(tài)由多云的狀態(tài)決定;
-
而灑水器的狀態(tài)也由多云的狀態(tài)決定。
# 'hc' or 'hillclimbsearch'model_hc_bic = bn.structure_learning.fit(df, methodtype='hc', scoretype='bic')model_hc_k2 = bn.structure_learning.fit(df, methodtype='hc', scoretype='k2')model_hc_bdeu = bn.structure_learning.fit(df, methodtype='hc', scoretype='bdeu')
# 'ex' or 'exhaustivesearch'model_ex_bic = bn.structure_learning.fit(df, methodtype='ex', scoretype='bic')model_ex_k2 = bn.structure_learning.fit(df, methodtype='ex', scoretype='k2')model_ex_bdeu = bn.structure_learning.fit(df, methodtype='ex', scoretype='bdeu')
# 'cs' or 'constraintsearch'model_cs_k2 = bn.structure_learning.fit(df, methodtype='cs', scoretype='k2')model_cs_bdeu = bn.structure_learning.fit(df, methodtype='cs', scoretype='bdeu')model_cs_bic = bn.structure_learning.fit(df, methodtype='cs', scoretype='bic')
# 'cl' or 'chow-liu' (requires setting root_node parameter)model_cl = bn.structure_learning.fit(df, methodtype='cl', root_node='Wet_Grass')
如果灑水器關(guān)閉,草地濕潤(rùn)的概率有多大?
如果灑水器關(guān)閉且多云,下雨的概率有多大?
4.2. 如何進(jìn)行推斷?
4.2.1. 參數(shù)學(xué)習(xí)
-
最大似然估計(jì)是使用變量狀態(tài)出現(xiàn)的相對(duì)頻率進(jìn)行的自然估計(jì)。在對(duì)貝葉斯網(wǎng)絡(luò)進(jìn)行參數(shù)估計(jì)時(shí),數(shù)據(jù)不足是一個(gè)常見問(wèn)題,最大似然估計(jì)器存在對(duì)數(shù)據(jù)過(guò)擬合的問(wèn)題。換句話說(shuō),如果觀察到的數(shù)據(jù)對(duì)于基礎(chǔ)分布來(lái)說(shuō)不具有代表性(或者太少),最大似然估計(jì)可能會(huì)相差甚遠(yuǎn)。例如,如果一個(gè)變量有 3 個(gè)可以取 10 個(gè)狀態(tài)的父節(jié)點(diǎn),那么狀態(tài)計(jì)數(shù)將分別針對(duì) 個(gè)父節(jié)點(diǎn)配置進(jìn)行。這使得最大似然估計(jì)對(duì)學(xué)習(xí)貝葉斯網(wǎng)絡(luò)參數(shù)非常脆弱。減輕最大似然估計(jì)過(guò)擬合的一種方法是貝葉斯參數(shù)估計(jì)。 -
貝葉斯估計(jì)從已存在的先驗(yàn) CPTs 開始,這些 CPTs 表示在觀察到數(shù)據(jù)之前我們對(duì)變量的信念。然后,使用觀察數(shù)據(jù)的狀態(tài)計(jì)數(shù)來(lái)更新這些“先驗(yàn)”??梢詫⑾闰?yàn)視為偽狀態(tài)計(jì)數(shù),在歸一化之前將其添加到實(shí)際計(jì)數(shù)中。一個(gè)非常簡(jiǎn)單的先驗(yàn)是所謂的 K2 先驗(yàn),它只是將“1”添加到每個(gè)單獨(dú)狀態(tài)的計(jì)數(shù)中。一個(gè)更明智的先驗(yàn)選擇是 BDeu(貝葉斯狄利克雷等效均勻先驗(yàn))。
# Examples to illustrate how to manually compute MLE for the node Cloudy and Rain:# Compute CPT for the Cloudy Node:# This node has no conditional dependencies and can easily be computed as following:# P(Cloudy=0)sum(df['Cloudy']==0) / df.shape[0] # 0.488# P(Cloudy=1)sum(df['Cloudy']==1) / df.shape[0] # 0.512# Compute CPT for the Rain Node:# This node has a conditional dependency from Cloudy and can be computed as following:# P(Rain=0 | Cloudy=0)sum( (df['Cloudy']==0) & (df['Rain']==0) ) / sum(df['Cloudy']==0) # 394/488 = 0.807377049# P(Rain=1 | Cloudy=0)sum( (df['Cloudy']==0) & (df['Rain']==1) ) / sum(df['Cloudy']==0) # 94/488 = 0.192622950# P(Rain=0 | Cloudy=1)sum( (df['Cloudy']==1) & (df['Rain']==0) ) / sum(df['Cloudy']==1) # 91/512 = 0.177734375# P(Rain=1 | Cloudy=1)sum( (df['Cloudy']==1) & (df['Rain']==1) ) / sum(df['Cloudy']==1) # 421/512 = 0.822265625
4.2.2. 在 Sprinkler 數(shù)據(jù)集上進(jìn)行推理
如果噴灌系統(tǒng)關(guān)閉,草坪潮濕的可能性有多大?P(Wet_grass=1 | Sprinkler=0) = 0.51 如果噴灌系統(tǒng)關(guān)閉并且天陰,有下雨的可能性有多大?P(Rain=1 | Sprinkler=0, Cloudy=1) = 0.663
4.3. 我如何知道我的因果模型是正確的?
5. 討論
后驗(yàn)概率分布的結(jié)果或圖形使用戶能夠?qū)δP皖A(yù)測(cè)做出判斷,而不僅僅是獲得單個(gè)值作為結(jié)果。
可以將領(lǐng)域/專家知識(shí)納入到 DAG 中,并在不完整信息和缺失數(shù)據(jù)的情況下進(jìn)行推理。這是可能的,因?yàn)樨惾~斯定理基于用證據(jù)更新先驗(yàn)項(xiàng)。
具有模塊化的概念。
通過(guò)組合較簡(jiǎn)單的部分來(lái)構(gòu)建復(fù)雜系統(tǒng)。
圖論提供了直觀的高度交互的變量集。
-
概率論提供了將這些部分組合在一起的方法。
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。
下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。
下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

