




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第9章Python機(jī)器學(xué)習(xí)在財(cái)務(wù)分析領(lǐng)域的應(yīng)用——財(cái)務(wù)舞弊識別模型”這一節(jié)先介紹機(jī)器學(xué)習(xí)和決策樹模型的基本概念以及背后的數(shù)學(xué)原理,然后介紹如何通過Python來實(shí)現(xiàn)決策樹模型,從而為之后的財(cái)務(wù)舞弊識別模型的搭建做鋪墊。目錄機(jī)器學(xué)習(xí)簡介與決策樹模型的基本原理決策樹模型與財(cái)務(wù)舞弊識別模型的搭建模型的參數(shù)調(diào)優(yōu)課后習(xí)題01機(jī)器學(xué)習(xí)簡介與決策樹模型的基本原理9.1.1機(jī)器學(xué)習(xí)簡介
機(jī)器學(xué)習(xí)是一種人工智能技術(shù),其基本思想是通過從大量經(jīng)驗(yàn)數(shù)據(jù)中學(xué)習(xí),從而能夠獨(dú)立地或在新數(shù)據(jù)上進(jìn)行預(yù)測。
機(jī)器學(xué)習(xí)有很多種類型,包括監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí)等。監(jiān)督學(xué)習(xí)是其中常見的一種,其訓(xùn)練過程需要提供帶有標(biāo)簽的訓(xùn)練數(shù)據(jù),以便算法從中學(xué)習(xí)并能夠?qū)π聰?shù)據(jù)進(jìn)行預(yù)測。無監(jiān)督學(xué)習(xí)則是通過分析不帶標(biāo)簽的數(shù)據(jù)來找出其中的模式或關(guān)聯(lián)。強(qiáng)化學(xué)習(xí)則是通過讓算法與環(huán)境交互并根據(jù)行為的結(jié)果來改進(jìn)策略。
機(jī)器學(xué)習(xí)的應(yīng)用非常廣泛,如應(yīng)用于語音識別、圖像識別、自然語言處理、推薦系統(tǒng)等方面。利用機(jī)器學(xué)習(xí)可以自動化完成許多煩瑣的任務(wù),同時也可以更好地理解和解釋數(shù)據(jù)。機(jī)器學(xué)習(xí)在各個行業(yè)中都有廣泛的應(yīng)用,如金融、醫(yī)療、教育、工業(yè)等。9.1.2決策樹模型簡介
決策樹模型是機(jī)器學(xué)習(xí)各種算法模型中比較好理解的一個模型,它的基本原理便是通過對一系列問題進(jìn)行if/else的推導(dǎo),最終實(shí)現(xiàn)相關(guān)決策。
圖9-1所示為一個典型的決策樹模型:員工離職預(yù)測模型。該決策樹模型首先判斷員工滿意度是否小于5,答案為“是”則認(rèn)為該員工會離職,答案為“否”則接著判斷其收入是否小于10000元,答案為“是”則認(rèn)為該員工會離職,答案為“否”則認(rèn)為該員工不會離職。
這只是一個簡單示例,之后要講的實(shí)際的財(cái)務(wù)舞弊識別模型會根據(jù)大數(shù)據(jù)搭建一個稍微復(fù)雜的模型,不過決策樹模型的核心原理就是圖9-1所示的內(nèi)容了。并且商業(yè)實(shí)戰(zhàn)中不會單純根據(jù)“滿意度”和“收入<10000”兩個特征就判斷員工是否離職,而是根據(jù)多個特征來預(yù)測離職概率,并根據(jù)相應(yīng)的閾值來判斷員工是否離職,如離職概率超過50%即認(rèn)為該員工會離職。
這里解釋幾個與決策樹模型有關(guān)的重要關(guān)鍵詞:根節(jié)點(diǎn)、父節(jié)點(diǎn)、子節(jié)點(diǎn)和葉子節(jié)點(diǎn)。
父節(jié)點(diǎn)和子節(jié)點(diǎn)是相對的,子節(jié)點(diǎn)由父節(jié)點(diǎn)根據(jù)某一規(guī)則分裂而來,然后子節(jié)點(diǎn)作為新的父節(jié)點(diǎn)繼續(xù)分裂,直至不能分裂為止。根節(jié)點(diǎn)則和葉子節(jié)點(diǎn)是相對的,根節(jié)點(diǎn)是沒有父節(jié)點(diǎn)的節(jié)點(diǎn),即初始節(jié)點(diǎn),葉子節(jié)點(diǎn)則是沒有子節(jié)點(diǎn)的節(jié)點(diǎn),即最后的節(jié)點(diǎn)。決策樹模型的關(guān)鍵即如何選擇合適的節(jié)點(diǎn)進(jìn)行分裂。
舉例來說,在圖9-1中,最上面的“滿意度<5”就是根節(jié)點(diǎn),它也是父節(jié)點(diǎn),分裂成兩個子節(jié)點(diǎn)“離職”和“收入<10000”,其中子節(jié)點(diǎn)“離職”因?yàn)椴辉俜至蚜耍辉儆凶庸?jié)點(diǎn)了,所以也稱為葉子節(jié)點(diǎn);另外一個子節(jié)點(diǎn)“收入<10000”也是其下面兩個子節(jié)點(diǎn)的父節(jié)點(diǎn),最后的“離職”及“不離職”則為葉子節(jié)點(diǎn)。
在實(shí)際應(yīng)用中,企業(yè)會通過已有的數(shù)據(jù)來看離職員工都符合何種特征,如查看他們的滿意度、收入、工齡、月工時、項(xiàng)目數(shù)等,然后選擇相應(yīng)的特征進(jìn)行節(jié)點(diǎn)分裂,便可以搭建出類似圖9-1所示的決策樹模型。利用該決策樹模型就可以預(yù)測員工離職情況,根據(jù)數(shù)據(jù)分析結(jié)果做好相應(yīng)的應(yīng)對措施。
決策樹本身并不復(fù)雜,主要就是通過連續(xù)的邏輯判斷來得到最后的結(jié)論,其關(guān)鍵在于如何建立出這樣的一棵“樹”。比如根節(jié)點(diǎn)應(yīng)該選擇哪一個特征,選“滿意度<5”作為根節(jié)點(diǎn)和選“收入<10000”作為根節(jié)點(diǎn)會得到不同的效果。其次,收入作為一個連續(xù)變量,是選“收入<10000”作為一個節(jié)點(diǎn),還是選“收入<100000”作為一個節(jié)點(diǎn)都是有講究的。下面就來講解決策樹模型的建樹依據(jù)。9.1.3決策樹模型的建樹依據(jù)決策樹模型的建樹依據(jù)主要用到的概念是基尼系數(shù)(gini)?;嵯禂?shù)用于計(jì)算一個系統(tǒng)中的失序現(xiàn)象,即系統(tǒng)的混亂程度?;嵯禂?shù)越大,系統(tǒng)混亂程度越高,建立決策樹模型的目的就是降低系統(tǒng)的混亂程度,從而達(dá)到合適的數(shù)據(jù)分類效果,基尼系數(shù)的計(jì)算公式如下:其中pi為類別i在樣本T中出現(xiàn)的頻率,即類別為i的樣本占總樣本個數(shù)的比率?!茷榍蠛头?,表示對所有的pi2進(jìn)行求和。例如,對于一個全部都是離職員工的樣本來說,里面只有一個類別,即離職員工,其出現(xiàn)的頻率是100%,所以該系統(tǒng)的基尼系數(shù)為1?12=0,表示該系統(tǒng)沒有混亂,或者說該系統(tǒng)的“純度”很高。而如果樣本里一半是離職員工,另一半是不離職員工,那么類別個數(shù)為2,每個類別出現(xiàn)的頻率都為50%,所以其基尼系數(shù)為1?(0.52+0.52)=0.5,即其混亂程度很高。當(dāng)引入某個用于進(jìn)行分類的變量(比如“滿意度<5”),則分割后的基尼系數(shù)公式為:其中S1、S2為劃分成兩類的樣本量,gini(T1)和gini(T2)為劃分后的兩類樣本各自的基尼系數(shù)。例如,一個初始樣本中有1000個員工,其中已知有400人離職,600人不離職。劃分前該系統(tǒng)的基尼系數(shù)為1?(0.42+0.62)=0.48,那么下面采用兩種不同的劃分方式來決定初始節(jié)點(diǎn):①根據(jù)“滿意度<5”進(jìn)行分類;②根據(jù)“收入<10000”進(jìn)行分類。劃分方式①:以“滿意度<5”為初始節(jié)點(diǎn)進(jìn)行劃分,劃分后的基尼系數(shù)為0.3,如圖9-2所示。圖9-2劃分方式②:以“收入<10000”為初始節(jié)點(diǎn)進(jìn)行劃分,劃分后的基尼系數(shù)為0.45,如圖9-3所示。圖9-3
可以看到未劃分時的基尼系數(shù)為0.48,以“滿意度<5”為初始節(jié)點(diǎn)進(jìn)行劃分的基尼系數(shù)為0.3,而以“收入<10000”為初始節(jié)點(diǎn)進(jìn)行劃分的基尼系數(shù)為0.45。基尼系數(shù)越小表示系統(tǒng)的混亂程度越低,區(qū)分度越高,能夠比較好地作為一個分類預(yù)測模型,因此這里選擇“滿意度<5”作為初始節(jié)點(diǎn)。這里演示了如何選擇初始節(jié)點(diǎn),初始節(jié)點(diǎn)下面的節(jié)點(diǎn)也是用類似的方法來進(jìn)行選擇的。
同理,對于“收入”這一變量,是選擇“收入<10000”還是選擇“收入<100000”進(jìn)行劃分,也是通過計(jì)算在這兩種情況下劃分后的基尼系數(shù)來進(jìn)行判斷的。若還有其他的變量,如“工齡”“月工時”等,也是通過類似的手段計(jì)算劃分后的系統(tǒng)的基尼系數(shù)來看如何進(jìn)行節(jié)點(diǎn)的劃分,從而搭建一個較為完善的決策樹模型。采用基尼系數(shù)進(jìn)行運(yùn)算的決策樹也稱為CART決策樹。補(bǔ)充知識點(diǎn):信息熵這里補(bǔ)充另一種衡量系統(tǒng)混亂程度的經(jīng)典手段——信息熵,供感興趣的讀者參考。信息熵的作用和基尼系數(shù)的是基本一致的,都是用來衡量系統(tǒng)的混亂程度,從而進(jìn)行合適的節(jié)點(diǎn)劃分。信息熵H(X)的計(jì)算公式如下所示:
其中,X表示的是隨機(jī)變量,隨機(jī)變量的取值為(X1,X2,X3,…),在n分類問題中,便有n個取值,例如在員工離職預(yù)測模型中,X的取值有兩種:“離職”與“不離職”。pi表示隨機(jī)變量X取值為Xi發(fā)生的概率,且有∑pi=1。此外注意這里的對數(shù)函數(shù)是以2為底,即log2(pi)。
舉例來說,對于一個全部都是離職員工的樣本來說,里面只有一個類別,即離職員工,其出現(xiàn)的頻率是100%,所以該系統(tǒng)信息熵為?1×log2(1)=0,表示該系統(tǒng)沒有混亂。而如果樣本里一半是離職員工,另一半是不離職員工,那么類別個數(shù)為2,每個類別出現(xiàn)的頻率都為50%,所以其信息熵為?(0.5×log2(0.5)+0.5×log2(0.5))=1,即其混亂程度很高。
當(dāng)引入某個用于進(jìn)行分類的變量(比如“滿意度<5”),則根據(jù)變量A劃分后的信息熵被稱為條件熵,其公式為:其中S1、S2為劃分成兩類的樣本量,H(X1)和H(X2)為劃分后的兩類樣本各自的信息熵。與之前計(jì)算基尼系數(shù)減少值類似,這里同樣是計(jì)算信息熵的減少值(原系統(tǒng)熵值?劃分后的系統(tǒng)熵值),該減少值稱為熵增益或信息增益,其值越大越好,越大表明分類后的混亂程度越低,即分類越準(zhǔn)確。信息增益的計(jì)算公式如下所示:以之前的例子來解釋信息熵的概念與使用,初始樣本中有1000個員工,其中已知有400人離職,600人不離職。劃分前該系統(tǒng)的信息熵為?(0.4×log20.4+0.6×log20.6)≈0.97,可見混亂程度較高,下面采用兩種不同的劃分方式來決定初始節(jié)點(diǎn):①根據(jù)“滿意度<5”進(jìn)行分類;②根據(jù)“收入<10000”進(jìn)行分類。方式①:以“滿意度<5”為初始節(jié)點(diǎn)進(jìn)行劃分,如圖9-4所示,劃分后的信息熵為0.65,熵增益或者說信息增益為0.32。圖9-4方式②:以“收入<10000”為初始節(jié)點(diǎn)進(jìn)行劃分,如圖9-5所示,劃分后的信息熵為0.924,熵增益或者說信息增益為0.046。圖9-5方式②:以“收入<10000”為初始節(jié)點(diǎn)進(jìn)行劃分,如圖9-5所示,劃分后的信息熵為0.924,熵增益或者說信息增益為0.046。圖9-5
根據(jù)方式①劃分的信息增益為0.32,大于根據(jù)方式②劃分的信息增益0.046,因此選擇根據(jù)方式①來進(jìn)行決策樹的劃分,這樣能更好地降低系統(tǒng)的混亂程度,從而進(jìn)行更加合理的分類。這和之前用基尼系數(shù)來計(jì)算的最終結(jié)論都是一樣的。
在決策樹模型的搭建中,因?yàn)榛嵯禂?shù)涉及的是平方運(yùn)算,而信息熵涉及的是復(fù)雜的一點(diǎn)的對數(shù)函數(shù)運(yùn)算,所以目前決策樹模型默認(rèn)使用基尼系數(shù)來進(jìn)行運(yùn)算,這樣運(yùn)算速度會較快。
商業(yè)實(shí)戰(zhàn)中的數(shù)據(jù)量通常很大,計(jì)算不同情況下的基尼系數(shù)或者信息熵就不是人力所能完成的,這時候就需要利用機(jī)器不停地訓(xùn)練來找到最佳的分裂節(jié)點(diǎn),而在Python中,有相應(yīng)的scikit-learn庫來幫助用戶快速建立一個決策樹模型,如果安裝的是Anaconda,那么這個庫已經(jīng)自動安裝好了,下面來講解決策樹模型的簡單代碼實(shí)現(xiàn)。圖9-59.1.4決策樹模型的代碼實(shí)現(xiàn)決策樹模型既可以做分類分析(即預(yù)測分類變量值),也可以做回歸分析(即預(yù)測連續(xù)變量值),對應(yīng)的模型為分類決策樹模型(DecisionTreeClassifier)及回歸決策樹模型(DecisionTreeRegressor)。1.分類決策樹模型分類決策樹模型簡單代碼示例如下。
fromsklearn.treeimportDecisionTreeClassifierX=[[1,2],[3,4],[5,6],[7,8],[9,10]]y=[1,0,0,1,1]model=DecisionTreeClassifier(random_state=0)model.fit(X,y)print(model.predict([[5,5]]))
第1行代碼用于引入分類決策樹模型。第2行代碼中的X是特征變量,共有5個訓(xùn)練數(shù)據(jù),每個數(shù)據(jù)有2個特征,如數(shù)據(jù)[1,2]的第一個特征的數(shù)值為1,第二個特征的數(shù)值為2。第3行代碼中的y是目標(biāo)變量,共有兩個類別:0和1。第4行代碼用于引入模型并設(shè)置隨機(jī)狀態(tài)參數(shù)random_state為數(shù)字0,這個數(shù)字本身沒有特殊含義,可以換成別的數(shù)字。它是一個種子參數(shù),使得每次代碼運(yùn)行的結(jié)果都一致,該參數(shù)將在本節(jié)的補(bǔ)充知識點(diǎn)中詳細(xì)講解。第5行代碼通過fit()函數(shù)訓(xùn)練模型。第6行代碼通過predict()函數(shù)進(jìn)行預(yù)測,預(yù)測結(jié)果如下:[0]可以看到對于數(shù)據(jù)[5,5]來說,它被分類到0這一類別。如果要同時預(yù)測多個數(shù)據(jù),則可以寫成如下形式。
print(model.predict([[5,5],[7,7],[9,9]]))
預(yù)測結(jié)果如下:
[001]
為方便讀者理解,利用9.2.3小節(jié)將講到的決策樹可視化技巧將決策樹可視化,如圖9-6所示。首先講一些基本概念:圖9-6中的X[0]表示數(shù)據(jù)的第一個特征,X[1]表示數(shù)據(jù)的第二個特征;gini表示該節(jié)點(diǎn)的基尼系數(shù)(以根節(jié)點(diǎn)為例,它的基尼系數(shù)計(jì)算公式為1?(0.42+0.62)=0.48);samples表示該節(jié)點(diǎn)的樣本數(shù);value表示的是各個種類所占的數(shù)量,例如根節(jié)點(diǎn)中[2,3]表示分類為0的樣本數(shù)為2,分類為1的樣本數(shù)為3;class表示的是該區(qū)塊劃分的類別,它是由value中哪個類別的樣本數(shù)量多來決定的,比如根節(jié)點(diǎn)中分類為1的樣本數(shù)(3)大于分類為0的樣本數(shù)(2),所以該節(jié)點(diǎn)的分類為1,其余依次類推。圖9-6
最上面的節(jié)點(diǎn),也就是根節(jié)點(diǎn)是以X[1]是否小于等于7作為節(jié)點(diǎn)劃分依據(jù),如果滿足該條件(即True),則劃分到左邊的子節(jié)點(diǎn),否則(即False)劃分到右邊的子節(jié)點(diǎn)。以數(shù)據(jù)[5,5]為例,在根節(jié)點(diǎn),它滿足X[1](也即第二個特征數(shù)值)小于等于7的條件,所以被劃分到左邊的子節(jié)點(diǎn)。在該子節(jié)點(diǎn)又進(jìn)行一次判斷,判斷X[0]是否小于等于2,因?yàn)閄[0]的值為5,不滿足該條件,所以被劃分到該子節(jié)點(diǎn)的右邊節(jié)點(diǎn),而該節(jié)點(diǎn)中的類別class為0,所以[5,5]這個數(shù)據(jù)在該決策樹模型下就被預(yù)測為類別0了。
補(bǔ)充知識點(diǎn):random_state參數(shù)的作用解釋在引入決策樹模型的時候,設(shè)置了隨機(jī)狀態(tài)參數(shù)random_state,設(shè)置這個參數(shù)的原因是,決策樹模型會優(yōu)先選擇使整個系統(tǒng)基尼系數(shù)下降最大的劃分方式來進(jìn)行節(jié)點(diǎn)劃分,但是有可能(尤其當(dāng)數(shù)據(jù)量較少的時候)根據(jù)不同的劃分方式劃分獲得的基尼系數(shù)下降是一樣的。圖9-7所示為不設(shè)置random_state參數(shù)時多次運(yùn)行后獲得的不同決策樹。
圖9-7
可以看到它們的節(jié)點(diǎn)劃分方式是不同的,這樣會導(dǎo)致同樣的數(shù)據(jù)的預(yù)測結(jié)果有所不同,例如數(shù)據(jù)[7,7]在左邊的決策樹中會被預(yù)測為類別0,而在右邊的決策樹中會被預(yù)測為類別1。
此時有的讀者就有疑問了,為什么模型訓(xùn)練后會產(chǎn)生兩棵不同的樹呢?哪棵樹是正確的呢?其實(shí)兩棵樹都是正確的,出現(xiàn)這種情況的原因是根據(jù)“X[1]<=7”或者“X[0]<=6”進(jìn)行節(jié)點(diǎn)劃分,產(chǎn)生的基尼系數(shù)下降是一樣的(都是0.48?(0.6×0.444+0.4×0)=0.2136),所以無論以哪種形式進(jìn)行節(jié)點(diǎn)劃分都是合理的。產(chǎn)生這一現(xiàn)象的原因很大程度是數(shù)據(jù)量較少,所以容易產(chǎn)生用不同劃分方式產(chǎn)生的基尼系數(shù)下降是一樣的情況,當(dāng)數(shù)據(jù)量較大時出現(xiàn)該現(xiàn)象的概率較小。
總的來說,對于同一個模型,不同的劃分方式可能會導(dǎo)致最后的預(yù)測結(jié)果有所不同,設(shè)置random_state參數(shù)(可以設(shè)置成0,也可以設(shè)置成1或123等任意數(shù)字)則能保證每次的劃分方式都是一致的,使得每次運(yùn)行的結(jié)果相同。這個概念對于初學(xué)者來說還是挺重要的,因?yàn)槌鯇W(xué)者往往會發(fā)現(xiàn)怎么每次運(yùn)行同一個模型出來的結(jié)果都不一樣,從而一頭霧水,如果出現(xiàn)這種情況,那么設(shè)置random_state參數(shù)即可。2.回歸決策樹模型除了進(jìn)行分類分析外,決策樹還可以進(jìn)行回歸分析,即預(yù)測連續(xù)變量,此時的決策樹便被稱為回歸決策樹,回歸決策樹模型簡單代碼示例如下(以銀行客戶價值為例)。fromsklearn.treeimportDecisionTreeRegressorX=[[1,2],[3,4],[5,6],[7,8],[9,10]]y=[1,2,3,4,5]model=DecisionTreeRegressor(max_depth=2,random_state=0)model.fit(X,y)print(model.predict([[9,9]]))其中,第2行代碼中的X是特征變量,共有2個特征;第3行代碼中的y是目標(biāo)變量,它是一個連續(xù)變量;第4行代碼用于引入模型,并設(shè)置決策樹最大深度參數(shù)max_depth為2以及隨機(jī)狀態(tài)參數(shù)random_state為0;第5行代碼通過fit()函數(shù)訓(xùn)練模型;第6行代碼通過predict()函數(shù)進(jìn)行預(yù)測,預(yù)測結(jié)果如下:[4.5]可以看到,對于[9,9]這一數(shù)據(jù),其預(yù)測擬合值為4.5。回歸決策樹模型的概念和分類決策樹的基本一致,最大的不同就是其切分標(biāo)準(zhǔn)不再是信息熵或是基尼系數(shù),而是均方誤差(MSE),均方誤差的計(jì)算公式如下。
其中,n為樣本數(shù)量,y(i)為實(shí)際值,為擬合值(預(yù)測值)。
為方便讀者理解,利用9.2.3小節(jié)將講到的決策樹可視化技巧將決策樹可視化,如圖9-8所示。圖9-8中的X[0]表示數(shù)據(jù)的第一個特征,X[1]表示數(shù)據(jù)的第二個特征;mse表示該節(jié)點(diǎn)的均方誤差;samples表示該節(jié)點(diǎn)的樣本數(shù);注意這里的value表示的是該節(jié)點(diǎn)的擬合值,在回歸決策樹里,節(jié)點(diǎn)中所有數(shù)據(jù)的均值都作為該節(jié)點(diǎn)的擬合值,對于最終的葉子節(jié)點(diǎn)而言,其擬合值就是最終的回歸模型預(yù)測值。
舉例來說,對于根節(jié)點(diǎn),它里面一共有5個數(shù)據(jù),這里是將節(jié)點(diǎn)中所有數(shù)據(jù)的均值作為該節(jié)點(diǎn)的擬合值,因此對于該節(jié)點(diǎn)來說,其擬合值為(1+2+3+4+5)/5=3,其均方誤差為數(shù)字2,如下所示,和程序獲得的結(jié)果是一致的。
圖9-8
對于回歸決策樹而言,其目的就是使得系統(tǒng)最終的均方誤差最小,其節(jié)點(diǎn)劃分依據(jù)也基于這個理念,如根節(jié)點(diǎn)是根據(jù)“X[1]<=5”進(jìn)行劃分的,這使得系統(tǒng)的均方誤差下降最大(2?(0.4×0.25+0.6×0.667)=1.5)。
這里設(shè)置了樹的最大深度參數(shù)max_depth為2,表示決策樹在根節(jié)點(diǎn)往下共有兩層,如果不設(shè)置這一參數(shù),那么右下角的節(jié)點(diǎn)還將繼續(xù)分裂,直至所有節(jié)點(diǎn)的均方誤差值都為0為止。這里設(shè)置最大深度參數(shù)max_depth的原因:一是為了方便演示擬合的效果(擬合結(jié)果4.5不是一個整數(shù),顯示是回歸結(jié)果,而不是分類結(jié)果);二是為了防止模型出現(xiàn)過擬合的現(xiàn)象(過擬合的知識點(diǎn)可參見后文的補(bǔ)充知識點(diǎn))。在實(shí)戰(zhàn)中也通常會設(shè)置最大深度參數(shù)max_depth,主要用于防止模型出現(xiàn)過擬合的現(xiàn)象。
至于[9,9]這一數(shù)據(jù)的擬合結(jié)果為什么是4.5,相信大家看圖9-8就一目了然了。
在實(shí)際應(yīng)用,分類決策樹模型用得相對較多一些,不過分類決策樹和回歸決策樹模型都很重要,隨機(jī)森林模型、AdaBoost模型、GBDT模型、XGBoost模型與LightGBM模型等都是基于決策樹模型進(jìn)行搭建的。了解了決策樹模型的簡單使用方法后,9.2節(jié)將結(jié)合具體商業(yè)案例講解如何使用Python搭建決策樹模型。
補(bǔ)充知識點(diǎn):過擬合與欠擬合如圖9-9所示,過度擬合(簡稱過擬合),是指模型在訓(xùn)練樣本中擬合程度過高,雖然它很好地貼合了訓(xùn)練集數(shù)據(jù),但是喪失了泛化能力,模型不具有推廣性(即如果換了訓(xùn)練集以外的數(shù)據(jù)就達(dá)不到較好的預(yù)測效果),導(dǎo)致在測試集中表現(xiàn)不佳。此外,與過擬合相對的是欠擬合,欠擬合是指模型擬合程度不高,數(shù)據(jù)距離擬合曲線較遠(yuǎn),或指模型沒有很好地捕捉到數(shù)據(jù)特征,不能夠很好地?cái)M合數(shù)據(jù)。02決策樹模型與財(cái)務(wù)舞弊識別模型的搭建
在資本市場中,財(cái)務(wù)舞弊往往會給市場中的參與者帶來嚴(yán)重的經(jīng)濟(jì)后果。本節(jié)將通過搭建財(cái)務(wù)舞弊識別模型來講解決策樹模型在財(cái)務(wù)領(lǐng)域的應(yīng)用,并講解如何評估決策樹模型,最后通過可視化的方式呈現(xiàn)決策樹模型。9.2.1模型搭建搭建財(cái)務(wù)舞弊識別模型的目的在于利用已有的公司財(cái)務(wù)信息(還包括其他的宏觀信息)和舞弊行為歷史信息來預(yù)測之后某公司是否有舞弊的風(fēng)險。1.?dāng)?shù)據(jù)讀取與預(yù)處理
首先介紹本例的數(shù)據(jù)來源:財(cái)務(wù)造假樣本數(shù)據(jù)通過國泰安數(shù)據(jù)庫獲取。國泰安違規(guī)處理數(shù)據(jù)庫收集了1994年以來在上海證券交易所和深圳證券交易所上市的有違規(guī)行為的上市公司公布的企業(yè)公告、證監(jiān)會指定媒體的報道及監(jiān)管機(jī)構(gòu)所出的公告等相關(guān)數(shù)據(jù)。
至于公司的財(cái)務(wù)指標(biāo)也通過國泰安數(shù)據(jù)庫獲取,主要分為微觀數(shù)據(jù)和宏觀數(shù)據(jù)。其中微觀數(shù)據(jù)包括資產(chǎn)負(fù)債表數(shù)據(jù)(如貨幣資金、固定資產(chǎn)凈額、未分配利潤等)、利潤表數(shù)據(jù)(營業(yè)總收入、資產(chǎn)減值損失、凈利潤等)、現(xiàn)金流量表數(shù)據(jù)(如銷售商品提供勞務(wù)收入、吸收投資收到的現(xiàn)金、期末現(xiàn)金及現(xiàn)金等價物等)、常用財(cái)務(wù)指標(biāo)(如流動比率、營業(yè)收入增長率、管理費(fèi)用率等)、市場數(shù)據(jù)(市盈率、托賓Q值、現(xiàn)金股利保障倍數(shù)等)、公司管理層等其他數(shù)據(jù)(如實(shí)際控制人控制權(quán)比例,前十大股東是否存在關(guān)聯(lián),董事、監(jiān)事及高管年薪等)。另外,從總體經(jīng)濟(jì)發(fā)展?fàn)顩r、貨幣政策與企業(yè)融資環(huán)境、股市行情3個方面構(gòu)建了宏觀指標(biāo)(數(shù)據(jù)來源為中經(jīng)網(wǎng)產(chǎn)業(yè)數(shù)據(jù)庫)。
以上數(shù)據(jù)已經(jīng)整合好放在源代碼文件夾下,名稱為DATA.xlsx。首先讀取公司財(cái)務(wù)信息與舞弊信息,代碼如下:importpandasaspdfraud_data=pd.read_excel('DATA.xlsx')fraud_data.head()運(yùn)行結(jié)果如圖9-10所示,其中共有29603組歷史數(shù)據(jù),其中148組為舞弊數(shù)據(jù),另外29455組為非舞弊數(shù)據(jù)?!笆欠裎璞住绷兄?,數(shù)字1代表舞弊,數(shù)字0代表未舞弊。本例的目的就是根據(jù)這些歷史數(shù)據(jù)搭建決策樹模型來預(yù)測之后公司舞弊的可能性。圖9-10fraud_()還可以通過info()函數(shù)來查看DataFrame對象的信息,結(jié)果如圖9-11所示,其中第2、3行內(nèi)容表明一共有29603行,行索引從序號0到29602,共有156列,列索引名稱為“索引”到“是否舞弊”。圖9-11
通過value_counts()函數(shù)可以查看“是否舞弊”列中的元素類別與個數(shù),代碼如下:fraud_data['是否舞弊'].value_counts()結(jié)果如下,表明“是否舞弊”列中內(nèi)容為0的有29455個,內(nèi)容為1的有148個。0294551148Name:是否舞弊,dtype:int64另外,還需要對缺失值進(jìn)行處理,首先可以通過如下代碼查看各個變量的缺失情況。fraud_data.isnull().sum().to_frame().T結(jié)果如圖9-12所示。圖9-12然后通過如下代碼輸出并刪除缺失值大于50%的列,代碼如下:fortinfraud_data.columns:iffraud_data[t].isnull().sum()/len(fraud_data)>0.5:print(t+"-->"+str(100*fraud_data[t].isnull().sum()/len(fraud_data))+"%")fraud_data=fraud_data.drop(columns=t)結(jié)果如圖9-13所示。
對于這些缺失值,若想用中位數(shù)進(jìn)行填充,怎么實(shí)現(xiàn)呢?代碼如下:fraud_data=fraud_data.fillna(fraud_data.median())fraud_data.isnull().sum().to_frame().T第1行代碼相當(dāng)于對于fraud_data的每一列,都用中位數(shù)來代替缺失值(median()就是中位數(shù)函數(shù),fillna()函數(shù)的作用是填充缺失值,其括號內(nèi)的參數(shù)表示用什么值來填充);第2行代碼用于展示現(xiàn)在缺失值的匯總情況,如圖9-14所示。
可以看到此時各列已經(jīng)沒有缺失值了。在讓模型學(xué)習(xí)之前需要解決的數(shù)據(jù)問題除了缺失值之外,還有無窮值(inf),這是獲取原始數(shù)據(jù)時無法避免的一個問題,解決思路與缺失值的解決思路是相似的。importnumpyasnpfraud_data[np.isinf(fraud_data)]=np.nanfraud_data=fraud_data.fillna(fraud_data.max())fraud_data.describe()
幸運(yùn)的是,Python有一個專門用于應(yīng)對無窮值的函數(shù),即NumPy庫的np.isinf()函數(shù),其作用與np.isnan()函數(shù)的相似,用來定位那些值為inf的單元格,但注意,這里的inf并不是字符串形式的'inf',而是一個特殊的數(shù)字類型值。第2行代碼把值inf轉(zhuǎn)換為空值(nan)。第3行代碼再用類似的方法將空值轉(zhuǎn)換為這一列的最大值。注意在順序上這一步和上一步對缺失值的操作順序不能顛倒,否則原來就是缺失值的單元格也會因此被處理為最大值,但我們并不希望缺失值變?yōu)樽畲笾担亲優(yōu)橹形粩?shù)。最后一行代碼用于輸出各列的描述性統(tǒng)計(jì),結(jié)果如圖9-15所示。
補(bǔ)充知識點(diǎn):特征工程(主要指數(shù)據(jù)處理與數(shù)據(jù)衍生)需要注意的是,只有這些原始的財(cái)務(wù)數(shù)據(jù)有時是不夠的,它們所包含的信息并不能全面地展示企業(yè)的財(cái)務(wù)信息。舉一個簡單的例子:如果單看貨幣資金這一財(cái)務(wù)指標(biāo),假設(shè)企業(yè)A與企業(yè)B處于同一個行業(yè),企業(yè)A的貨幣資金是100萬元,企業(yè)B的貨幣資金是1億元,僅憑這一點(diǎn)無法得出“企業(yè)A比企業(yè)B更善于利用資金”的結(jié)論,因?yàn)檫@也同公司的體量有關(guān),如果構(gòu)造一個新指標(biāo),如貨幣資金/流動資產(chǎn)總額,那便能夠知道企業(yè)的流動資產(chǎn)中有多少比例是貨幣資金,這比單看貨幣資金這一指標(biāo)更具實(shí)際意義?;谶@樣的理由,在常見的占比數(shù)據(jù)(存貨周轉(zhuǎn)率、應(yīng)收賬款周轉(zhuǎn)率等數(shù)據(jù)都是占比數(shù)據(jù))的基礎(chǔ)上,可以衍生出一些新的占比特征,比如對于流動資產(chǎn),將貨幣資金、交易性金融資產(chǎn)等作為分子,便可以衍生出一些新的衍生指標(biāo)(在這里便不再一一列舉)。這些數(shù)據(jù)處理(之前講解的處理缺失值和無窮值等內(nèi)容)與數(shù)據(jù)衍生的過程就叫作特征工程。至于如何構(gòu)造衍生指標(biāo),可以用Excel進(jìn)行處理,也可以通過pandas庫進(jìn)行處理,感興趣的讀者可以自行嘗試,由于篇幅關(guān)系,本書就直接使用原始數(shù)據(jù)進(jìn)行數(shù)據(jù)建模。
2.劃分訓(xùn)練集和測試集首先需要把數(shù)據(jù)劃分為訓(xùn)練集和測試集。顧名思義,訓(xùn)練集拿來做訓(xùn)練,而測試集拿來檢驗(yàn)?zāi)P陀?xùn)練的結(jié)果。劃分訓(xùn)練集和測試集的代碼如下:train_year=[iforiinrange(2009,2018)]test_year=[2019]train=fraud_data[fraud_data["年份"].isin(train_year)]test=fraud_data[fraud_data["年份"].isin(test_year)]
這里劃分的方法并不是一般的處理方法,有一定的特殊性。具體來說,本例是想用2009年—2017年的數(shù)據(jù)作為訓(xùn)練集(range(a,b)表示數(shù)字a到b,但是不包括b,即range(2009,2018)表示2009—2017年,感興趣的讀者也可以把range(2009,2018)改成range(2009,2019),將2009—2018年的數(shù)據(jù)作為訓(xùn)練集),將2019年的數(shù)據(jù)作為測試集。
所以,前兩行代碼用于分別把訓(xùn)練集和測試集對應(yīng)的年份存儲到兩個列表里。后兩行代碼則是通過篩選功能將原數(shù)據(jù)中“年份”列值屬于特定列表的數(shù)據(jù)分別存儲到train和test兩個DataFrame對象中。這里運(yùn)用到的方法是DataFrame[DataFrame['column'].isin(list)],其中,DataFrame是篩選對象,column是篩選依據(jù)對應(yīng)的列,isin()是一種特殊的篩選方法,表示值在list列表里則返回,整個篩選過程相當(dāng)于遍歷DataFrame的每一行。另外,還有一種更簡單的實(shí)現(xiàn)劃分的方法,但需要先提取特征變量和目標(biāo)變量,后文再說。
3.提取特征變量和目標(biāo)變量劃分好訓(xùn)練集和測試集之后,將特征變量和目標(biāo)變量單獨(dú)提取出來,代碼如下:X_train=train.drop(columns=['索引','年份','是否舞弊'])y_train=train['是否舞弊']X_test=test.drop(columns=['索引','年份','是否舞弊'])y_test=test['是否舞弊']其中,前兩行代碼用于提取訓(xùn)練集的特征變量和目標(biāo)變量,后兩行代碼用于提取測試集的特征變量和目標(biāo)變量。
補(bǔ)充知識點(diǎn):常規(guī)數(shù)據(jù)中訓(xùn)練集和測試集的數(shù)據(jù)劃分對于常規(guī)數(shù)據(jù),如果不需要選取特定的數(shù)據(jù)作為訓(xùn)練集和測試集,而是進(jìn)行隨機(jī)選取,可以使用如下代碼。fromsklearn.model_selectionimporttrain_test_splitX=fraud_data.drop(columns=['索引','年份','是否舞弊'])y=fraud_data['是否舞弊']X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=123)第1行代碼用于從scikit-learn庫中引入train_test_split()函數(shù)。第4行代碼用于通過train_test_split()函數(shù)劃分訓(xùn)練集和測試集,其中X_train、y_train為訓(xùn)練集數(shù)據(jù),X_test、y_test為測試集數(shù)據(jù)。
train_test_split()函數(shù)的前兩個參數(shù)X和y便是之前提取的特征變量和目標(biāo)變量。test_size是測試集數(shù)據(jù)所占的比例,這里選擇20%的數(shù)據(jù)為測試數(shù)據(jù),即0.2。如果數(shù)據(jù)的數(shù)量很多,也可以將其設(shè)置為0.1,即分配相對較少的數(shù)據(jù)來測試,分配更多的數(shù)據(jù)來訓(xùn)練。
因?yàn)橥ㄟ^train_test_split()函數(shù)劃分?jǐn)?shù)據(jù)是隨機(jī)的,所以如果想每次劃分?jǐn)?shù)據(jù)產(chǎn)生的內(nèi)容都是一致的,可以設(shè)置random_state參數(shù),這里設(shè)置的數(shù)字123沒有特殊含義,它相當(dāng)于一個種子參數(shù),使得每次劃分內(nèi)容都是一致的,也可以設(shè)置成其他值。
但需要注意,這樣劃分的訓(xùn)練集和測試集的優(yōu)點(diǎn)是數(shù)據(jù)抽取完全隨機(jī),但有時候我們在劃分上存在主觀的目的。比如在這里就希望用2009—2017年的數(shù)據(jù)來訓(xùn)練模型,用2018年的數(shù)據(jù)來測試,這樣的做法背后有時存在一些經(jīng)濟(jì)含義,是隨機(jī)抽取無法代替的。
4.過采樣本案例中,還需要進(jìn)行一項(xiàng)數(shù)據(jù)處理工作:過采樣。所謂過采樣,就是人工增加樣本數(shù)量較少的樣本來解決樣本不均衡的問題,而樣本不均衡指的是不同類別的樣本數(shù)量相差過大,這會導(dǎo)致預(yù)測結(jié)果有偏差。例如本案例中,通過如下代碼可以發(fā)現(xiàn)訓(xùn)練集中分類為0的樣本有21101個,分類為1的樣本有93個,樣本數(shù)非常不均衡。#統(tǒng)計(jì)訓(xùn)練集中y的類別和個數(shù)fromcollectionsimportCounterCounter(y_train)上面代碼的運(yùn)行結(jié)果如下。Counter({0:21101,1:93})
這樣的不均衡數(shù)據(jù)可能會在機(jī)器學(xué)習(xí)過程中給模型帶來很大的麻煩,采用默認(rèn)的分類閾值(一般是0.5)可能會導(dǎo)致大部分輸出分類為0,從而產(chǎn)生虛假的高準(zhǔn)確度,導(dǎo)致分類失敗。解決這個問題,一般有兩種方法:欠采樣和過采樣。其實(shí)理解起來也很簡單,過采樣較簡單的思路就是對少數(shù)樣本進(jìn)行重復(fù)采樣,比如復(fù)制少數(shù)類別的樣本,使少數(shù)類別的樣本數(shù)量與多數(shù)類別的樣本數(shù)量相當(dāng),但是這樣容易產(chǎn)生模型過擬合的問題,即使模型學(xué)習(xí)到的信息過于特別(specific)而不夠泛化(general),所以一種改進(jìn)后的方法(SMOTE法)是對少數(shù)類別的樣本進(jìn)行分析并根據(jù)少數(shù)類別的樣本人工合成新樣本并將之添加到數(shù)據(jù)集中(更多關(guān)于SMOTE法過采樣的相關(guān)知識點(diǎn)可參考本小節(jié)補(bǔ)充知識點(diǎn))。而欠采樣的思路與過采樣的沒有本質(zhì)上的不同,但欠采樣通過去掉一些多數(shù)類別的樣本使兩類樣本數(shù)量相當(dāng),其弊端是沒有充分利用已有樣本,下面是SMOTE法的核心代碼(注意這里用到了一個叫作imblearn的庫,需要通過pipinstallimblearn安裝這個庫)。
#使用SMOTE法進(jìn)行過抽樣處理fromimblearn.over_samplingimportSMOTE#需要通過pipinstallimblearn安裝這個庫model_smote=SMOTE()#建立SMOTE模型對象X_smote_resampled,y_smote_resampled=model_smote.fit_resample(X_train,y_train)#輸入數(shù)據(jù)并做過采樣處理再通過如下代碼對訓(xùn)練集數(shù)據(jù)進(jìn)行樣本數(shù)量統(tǒng)計(jì)。Counter(y_smote_resampled)結(jié)果如下所示,可以看到分類為0和分類為1的樣本數(shù)量都是21101個了。Counter({0:21101,1:21101})
補(bǔ)充知識點(diǎn):SMOTE法過采樣的基本原理SMOTE法過采樣,即合成少數(shù)類過采樣技術(shù),是一種改進(jìn)隨機(jī)過采樣模型容易過擬合的方案。假設(shè)對少數(shù)類進(jìn)行4倍過采樣,SMOTE法的原理如圖9-16所示。
5.模型訓(xùn)練及搭建劃分好訓(xùn)練集和測試集之后,就可以從scikit-learn庫中引入決策樹模型進(jìn)行模型訓(xùn)練了,代碼如下:fromsklearn.treeimportDecisionTreeClassifiermodel=DecisionTreeClassifier(max_depth=3,random_state=123)model.fit(X_smote_resampled,y_smote_resampled)其中,第1行代碼用于從scikit-learn庫中引入分類決策樹模型。第2行代碼用于將決策樹模型賦值給變量model,同時設(shè)置模型參數(shù)max_depth為3,即樹的最大深度為3,并設(shè)置隨機(jī)狀態(tài)參數(shù)random_state為數(shù)字123,這個數(shù)字沒有特殊意義,只是使每次運(yùn)行結(jié)果一致。第3行代碼通過fit()函數(shù)來進(jìn)行模型的訓(xùn)練,傳入的參數(shù)就是前文獲得的過采樣后的訓(xùn)練集數(shù)據(jù)。
至此,一個決策樹模型便已經(jīng)搭建完成了,搭建決策樹模型的代碼匯總?cè)缦拢耗P痛罱ㄍ瓿珊缶涂梢岳媚P蛠磉M(jìn)行預(yù)測了,此時前文的測試集就可以發(fā)揮作用了,即利用測試集來進(jìn)行預(yù)測并評估模型的預(yù)測效果。
9.2.2模型預(yù)測及評估本小節(jié)將介紹如何直接預(yù)測是否舞弊,以及預(yù)測不舞弊與舞弊的概率,最后介紹如何合理地對一個模型進(jìn)行評估。1.直接預(yù)測是否舞弊搭建模型的目的是利用它來預(yù)測數(shù)據(jù),這里把測試集中的數(shù)據(jù)導(dǎo)入模型中進(jìn)行預(yù)測,代碼如下,其中model就是9.2.1小節(jié)搭建的決策樹模型。y_pred=model.predict(X_test)輸出y_pred[0:100],結(jié)果如圖9-17所示,其中0和1為預(yù)測的結(jié)果,0表示預(yù)測不舞弊,1表示預(yù)測舞弊。
利用創(chuàng)建DataFrame的相關(guān)知識點(diǎn),將預(yù)測的y_pred和測試集實(shí)際的y_test匯總到一起,其中,y_pred是一個一維數(shù)組結(jié)構(gòu),y_test為一維序列結(jié)構(gòu),所以需要用list()函數(shù)將其轉(zhuǎn)換為列表,代碼如下:a=pd.DataFrame()
#創(chuàng)建一個空白DataFrame
a['預(yù)測值']=list(y_pred)a['實(shí)際值']=list(y_test)通過a.head()將生成的DataFrame的前5行輸出,結(jié)果如表9-1所示。
可以看到測試集中前5組數(shù)據(jù)的預(yù)測準(zhǔn)確度為80%,如果要查看整體的預(yù)測準(zhǔn)確度,可以采用如下代碼。fromsklearn.metricsimportaccuracy_scorescore=accuracy_score(y_pred,y_test)將score輸出,結(jié)果如下。0.9837860602232049發(fā)現(xiàn)整個模型在測試集上的預(yù)測準(zhǔn)確度約為0.983,即8502個測試集數(shù)據(jù)中,約有8363個記錄的預(yù)測結(jié)果和實(shí)際結(jié)果相符。此外,也可以通過模型自帶的score()函數(shù)來查看模型的預(yù)測準(zhǔn)確度,代碼如下。model.score(X_test,y_test)輸出結(jié)果同樣為0.9837。
2.預(yù)測不舞弊與舞弊的概率其實(shí)分類決策樹模型預(yù)測的本質(zhì)并不是準(zhǔn)確的0或1,而是預(yù)測其屬于某一類別的概率,可以通過如下代碼查看預(yù)測屬于各個類別的概率。y_pred_proba=model.predict_proba(X_test)此時獲得的y_pred_proba就是預(yù)測的屬于各個類別的概率,它是一個二維數(shù)組,可以直接輸出y_pred_proba,其左側(cè)一列數(shù)為類別為0的概率,右側(cè)一列數(shù)為類別為1的概率。也可以通過如下代碼將其轉(zhuǎn)換為DataFrame格式方便查看。b=pd.DataFrame(y_pred_proba,columns=['不舞弊概率','舞弊概率'])通過b.head()查看此時獲取的表格的前5行,如表9-2所示。
之前直接預(yù)測是否舞弊時,其實(shí)是看其屬于哪個類別的概率最大,如第1行數(shù)據(jù),其中不舞弊的概率約為0.955151,大于舞弊的概率0.044849,所以才預(yù)測其不舞弊。有些細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn),表中一些概率是一樣的,比如第一個和第二個記錄的不舞弊概率都是0.955151,舞弊概率都是0.044849,9.2.3小節(jié)將模型可視化呈現(xiàn)后,就能明白這些概率的計(jì)算原理了。如果想查看舞弊概率,即查看y_pred_proba的第二列,可以采用如下代碼,這是二維數(shù)組選取列的方法,其中逗號前的:表示所有行,逗號后面的數(shù)字1則表示第二列,如果把數(shù)字1改成數(shù)字0,則表示提取第一列不舞弊概率。y_pred_proba[:,1]
3.模型預(yù)測效果評估對于分類模型而言,我們不僅關(guān)心其預(yù)測的準(zhǔn)確度,還關(guān)心下面兩個指標(biāo):命中率(所有實(shí)際舞弊的公司中被預(yù)測為舞弊的比率)和假警報率(所有實(shí)際不舞弊的公司中被預(yù)測為舞弊的比率)??赏ㄟ^兩者繪制的ROC(ReceiverOperatingCharacteristic,受試者工作特征)曲線來評判模型(關(guān)于ROC曲線以及后文要講的AUC值的相關(guān)知識點(diǎn)請參考本小節(jié)的補(bǔ)充知識點(diǎn))。我們希望在相同閾值的情況下,假警報率盡量低,命中率盡可能高,即ROC曲線盡可能陡峭,其對應(yīng)的AUC(AreaUnderCurve,曲線下面積)值(ROC曲線下的面積)盡可能大。在Python實(shí)現(xiàn)上,通過如下代碼就可以求出在不同閾值下的命中率(TPR)以及假警報率(FPR)的值,從而繪制ROC曲線。
fromsklearn.metricsimportroc_curvefpr,tpr,thres=roc_curve(y_test,y_pred_proba[:,1])其中第1行代碼用于引入roc_curve()函數(shù)。第2行代碼用于傳入測試集目標(biāo)變量y_test的值,以及預(yù)測的舞弊概率,然后通過roc_curve()函數(shù)計(jì)算出不同閾值下的命中率和假警報率,并將三者賦值給變量fpr(假警報率)、tpr(命中率)、thres(閾值),此時獲得的fpr、tpr、thres為3個一維數(shù)組。注意roc_curve()函數(shù)返回的是一個含有3個元素的元組,其中默認(rèn)第一個元素為假警報率、第二個元素為命中率、第三個元素為閾值,所以在第2行代碼中寫變量順序的時候要按fpr、tpr、thres的順序來寫。通過以下代碼可以查看不同閾值下的假警報率和命中率。a=pd.DataFrame()
#創(chuàng)建一個空白DataFrame
a['閾值']=list(thres)a['假警報率']=list(fpr)a['命中率']=list(tpr)運(yùn)行代碼,表格a的內(nèi)容如表9-3所示。
可以看到閾值越大,假警報率越低,但相應(yīng)的命中率也會下降。另外有幾個要注意的點(diǎn),第1行表示只有當(dāng)一個公司被預(yù)測舞弊的概率≥198%,才判定其會舞弊,因?yàn)楦怕什粫^100%,所以此時不會有公司被判定為舞弊,即所有公司都不會被預(yù)測為舞弊,那么命中率和假警報率都為0,之所以會有這么一個看上去沒有意義的閾值,是因?yàn)閞oc_curve()函數(shù)默認(rèn)在最大閾值基礎(chǔ)上加一生成一個閾值,實(shí)際操作中可以忽略該閾值。第3行表示只有當(dāng)一個公司被預(yù)測為舞弊的概率≥38.14%,才判定其會舞弊,此時的命中率為60.6%,假警報率為5.93%,其余以此類推。
已知了不同閾值下的假警報率和命中率,可通過Matplotlib庫繪制ROC曲線,代碼如下:importmatplotlib.pyplotaspltplt.plot(fpr,tpr)plt.show()繪制的ROC曲線如圖9-18所示,可以看到這個ROC曲線還是比較陡峭的。通過如下代碼則可以快速求出模型的AUC值。fromsklearn.metricsimportroc_auc_scorescore=roc_auc_score(y_test,y_pred)print(score)其中第1行代碼用于引入roc_auc_score()函數(shù)。第2行代碼用于傳入測試集目標(biāo)變量y_test的值,以及預(yù)測的舞弊概率。將獲得的AUC值輸出,結(jié)果為0.6608,可以說預(yù)測效果還可以。補(bǔ)充知識點(diǎn):ROC曲線與AUC值在分類模型商業(yè)實(shí)戰(zhàn)中一般不會以準(zhǔn)確度作為模型的評估標(biāo)準(zhǔn),因?yàn)闇?zhǔn)確度很多時候并不可靠。以銀行客戶違約預(yù)測模型為例,倘若100個客戶里有10個人違約,而如果模型預(yù)測所有客戶都不會違約,雖然這個模型沒有過濾掉一個違約客戶,但是模型的預(yù)測準(zhǔn)確度仍然能達(dá)到90%,顯然這個較高的準(zhǔn)確度并不能反映模型的優(yōu)劣。在商業(yè)實(shí)戰(zhàn)中,我們更關(guān)心表9-4所示的兩個指標(biāo)。
其中TP、FP、TN、FN的含義如表9-5所示,這個表也叫作混淆矩陣。
真正率計(jì)算的是在所有實(shí)際違約的人中,預(yù)測為違約的比例,也稱命中率或召回率;而假正率計(jì)算的是在所有實(shí)際沒有違約的人當(dāng)中,預(yù)測為違約的比例,也稱假警報率。上述例子中,100個客戶中有10個人違約,模型預(yù)測所有客戶都不會違約,如表9-6所示,那么模型的假正率為0,即沒有誤傷一個“好人”,但是此時模型的真正率也為0,即沒有揪出一個“壞人”,因此即使是高達(dá)90%的預(yù)測準(zhǔn)確度也是沒有意義的。。
一個優(yōu)秀的客戶違約預(yù)測模型,希望命中率盡可能高,即能盡量地揪出“壞人”,同時也希望假警報率盡可能低,即不要誤傷“好人”。然而這兩者往往呈正相關(guān)性,因?yàn)橐坏┱{(diào)高閾值,比如認(rèn)為違約率超過90%的才認(rèn)定為違約,那么會導(dǎo)致假警報率很低,但是命中率也很低;而降低閾值,比如認(rèn)為違約率超過10%就認(rèn)定為違約,那么命中率就會很高,但是假警報率也會很高。因此為了衡量一個模型的優(yōu)劣,數(shù)據(jù)科學(xué)家根據(jù)不同閾值下的命中率和假警報率繪制了ROC曲線,如圖9-19所示。
ROC曲線的橫坐標(biāo)為假警報率,其縱坐標(biāo)為命中率。在某一個閾值條件下,我們希望所搭建的模型的命中率盡可能高,而假警報率盡可能低。
舉例來說,某一檢測樣本總量為100,其中違約客戶為20人,當(dāng)閾值為20%的時候,即違約概率超過20%的時候認(rèn)為用戶會違約,模型A和模型B預(yù)測出來的違約客戶都是40人。如果模型A預(yù)測違約的40人中有20人的確違約,那么命中率達(dá)20÷20=100%,此時假警報率為20÷80=25%;如果模型B預(yù)測違約的40人中有15人的確違約,那么其命中率為15÷20=75%,假警報率為25÷80=31.25%。那么此時認(rèn)為模型A是一個較優(yōu)的模型。因此,對于不同模型,我們希望在相同的閾值條件下命中率越高,假警報率越低。
如果把假警報率理解為代價,那么命中率就是收益,所以也可以說在相同閾值的情況下,希望假警報率(代價)盡量小的同時命中率(收益)盡量高,該思想反映在圖形上就是這個曲線盡可能陡峭,曲線越靠近左上角說明在同樣的閾值條件下,命中率越高,假警報率越低,模型越完善。換一個角度來理解,一個完美的模型是在不同的閾值下,假警報率都接近0,而命中率接近1,該特征反映在圖形上,就是曲線非常接近(0,1)這個點(diǎn),即曲線非常陡峭。數(shù)值比較上可以使用AUC值來衡量模型的好壞,AUC(areaundercurver)值指曲線下面的面積,該面積的取值范圍通常為0.5~1,0.5表示隨機(jī)判斷,1則代表完美的模型。在商業(yè)實(shí)戰(zhàn)中,因?yàn)榇嬖诤芏鄶_動因子,AUC值能達(dá)到0.75以上就已經(jīng)可以接受了,如果能達(dá)到0.85以上,就是非常不錯的模型了。
4.特征重要性評估模型搭建完成后,有時希望能夠知道各個特征變量的重要程度,即哪些特征變量在模型中起的作用更大,而在決策樹模型中,可通過如下代碼查看特征的重要性。model.feature_importances_獲得的結(jié)果如圖9-20所示。
在決策樹模型中,特征重要性的大小取決于該變量對模型整體的基尼系數(shù)下降的貢獻(xiàn)大小,特征變量對模型整體的基尼系數(shù)下降的貢獻(xiàn)越大,那么其特征重要性越大。舉一個例子,模型分裂到最后的葉子節(jié)點(diǎn),整個系統(tǒng)的基尼系數(shù)下降數(shù)值為0.3,如果所有根據(jù)特征A進(jìn)行分裂的節(jié)點(diǎn)產(chǎn)生的基尼系數(shù)下降的數(shù)值和為0.15,那么特征A的特征重要性為50%,即0.5。
對于特征變量不多的模型,通過上文那一行代碼即可查看各個特征變量的重要性,如果特征變量變多,可以使用代碼將特征重要性和變量名稱一一對應(yīng),比如此例有100多個特征變量,其中很多變量的重要性都很小,通過如下代碼查看特征重要性排名前5的特征。features=X_train.columns#獲取特征名稱#通過二維表格形式顯示importances_df=pd.DataFrame()importances_df['特征名稱']=featuresimportances_df['特征重要性']=model.feature_importances_importances_df=importances_df.sort_values('特征重要性',ascending=False)importances_df.head()代碼首先獲取特征名稱及特征重要性,然后將特征名稱和特征重要性整合到一個二維表格中,接著通過sort_values()方法對特征重要性進(jìn)行排序,其中設(shè)置ascending參數(shù)為False表示按逆序排列(即從大到小排序),最后取前5個最重要的特征查看。補(bǔ)充說一句,整理成二維表格也可以通過如下代碼實(shí)現(xiàn),注意此時表格是橫向顯示的,即其行索引為特征名稱和特征重要性,所以需要通過.T方法來將其轉(zhuǎn)置為豎向顯示。importances_df=pd.DataFrame([features,importances],index=['特征名稱','特征重要性']).T
運(yùn)行代碼,獲取的表格內(nèi)容如表9-7所示(第一列為特征序號),這樣特征名稱和特征重要性就一一對應(yīng)上了。
可以看到重要性最高的是第一個特征:公司是否被媒體披露重大負(fù)面消息。這也的確符合常理,可見公司在信息披露方面的表現(xiàn)對于舞弊的解釋性很強(qiáng)。此外,其他重要的特征是審計(jì)意見和凈資產(chǎn)收益率。很多其他特征在該模型中的特征重要性為0,也就是說它們沒有發(fā)揮作用(表9-7中沒有展示),這可能是因?yàn)橄拗屏藳Q策樹的深度為3層(max_depth=3),所以其他特征沒有發(fā)揮作用的機(jī)會,如果增大決策樹的最大深度,那么其他特征可能會發(fā)揮作用,這個在后文也有驗(yàn)證。
9.2.3決策樹模型可視化呈現(xiàn)及決策樹要點(diǎn)理解如果想將決策樹模型可視化呈現(xiàn),可以使用Python的graphviz插件。因?yàn)槟P涂梢暬尸F(xiàn)主要是為了演示和教學(xué),在實(shí)戰(zhàn)中應(yīng)用較少,所以對于graphviz插件的安裝與使用,感興趣的讀者可以參考本書配套的源代碼文件進(jìn)行學(xué)習(xí)。這里簡單提一下使用graphviz插件的核心知識點(diǎn)。第一步是安裝graphviz插件,可通過其官網(wǎng)下載,如果是Windows系統(tǒng),下載MSI文件并安裝,安裝完成后需要配置環(huán)境變量。第二步是安裝graphviz庫,通過pipinstallgraphviz即可安裝相關(guān)庫。安裝完畢后即可使用,通過如下核心代碼即可快速對決策樹模型進(jìn)行可視化。如果想生成包含中文的可視化圖片則相對麻煩一些。fromsklearn.treeimportexport_graphvizdot_data=export_graphviz(model,out_file=None)#這里的model就是模型名graph=graphviz.Source(dot_data)#對決策樹模型可視化graph.render('決策樹可視化')#生成決策樹可視化PDF文件
圖9-21所示便是通過graphviz生成的可視化決策樹模型。
可以看到從初始節(jié)點(diǎn)往下的確就只有3層樹狀結(jié)構(gòu),這就是一開始所設(shè)置的模型參數(shù)max_depth,即樹的最大深度。下面根據(jù)圖9-21講解幾個重要的知識點(diǎn)來加深讀者對決策樹模型的理解。知識點(diǎn)1:節(jié)點(diǎn)各元素的含義這里介紹圖9-21中每個節(jié)點(diǎn)里各內(nèi)容的含義,除了葉子節(jié)點(diǎn)外,每個節(jié)點(diǎn)都有5個元素:分裂依據(jù)、當(dāng)前基尼系數(shù)(gini)、當(dāng)前樣本數(shù)量(samples)、樣本中各類別的數(shù)量(value)、分類類別(class)。以根節(jié)點(diǎn)為例,其將“公司是否被媒體披露負(fù)面消息≤0.0”作為分裂依據(jù);它當(dāng)前的基尼系數(shù)為0.5;其含有的樣本總數(shù)為42202;其中value中的左邊數(shù)值21101表示“是否舞弊”中的0,即不舞弊公司,右邊數(shù)值21101表示“是否舞弊”中的1,即舞弊公司;最后一行的class表示類別,不過根節(jié)點(diǎn)的class沒有意義,主要看最后的葉子節(jié)點(diǎn)的class。此外,最后的葉子節(jié)點(diǎn)因?yàn)橐呀?jīng)分裂完畢,所以不再有分裂依據(jù)這一項(xiàng)。知識點(diǎn)2:節(jié)點(diǎn)劃分與依據(jù)驗(yàn)證根節(jié)點(diǎn)分裂完后產(chǎn)生兩個子節(jié)點(diǎn),其中左邊的子節(jié)點(diǎn)中大部分為不舞弊公司(共24808家公司,其中20650家不舞弊、4158家舞弊,該節(jié)點(diǎn)的基尼系數(shù)為0.279);而右邊的子節(jié)點(diǎn)中大部分為舞弊公司(共17394家公司,其中451家不舞弊、16943家舞弊,該節(jié)點(diǎn)的基尼系數(shù)為0.051),這也符合上市公司被媒體披露過重大負(fù)面消息,那么其就有較大的舞弊嫌疑的事實(shí)。根據(jù)前文的知識點(diǎn)計(jì)算經(jīng)過根節(jié)點(diǎn)分裂后的系統(tǒng)的基尼系數(shù)為24808÷42202×0.279+17394÷42202×0.051≈0.185(此時基尼系數(shù)下降值為0.5?0.185=0.315),這也是機(jī)器通過不停的訓(xùn)練和計(jì)算獲得的最優(yōu)解,如果通過別的方式進(jìn)行根節(jié)點(diǎn)分裂,系統(tǒng)基尼系數(shù)一定會比0.185大,基尼系數(shù)的下降值一定比0.315小。知識點(diǎn)3:特征重要性與整棵樹的關(guān)系還可以通過9.2.2小節(jié)計(jì)算特征重要性的代碼來驗(yàn)證上一知識點(diǎn)的觀點(diǎn)。輸出結(jié)果如表9-8所示,分別對應(yīng)5個特征變量的特征重要性。
可以看到重要性最大的便是媒體披露。同樣此表可以更好地解釋為什么有些特征變量的特征重要性很小,甚至為0,這是因?yàn)檫@些因素在該模型中沒有發(fā)揮作用,這可以從可視化的圖形中看出,每一個分叉的節(jié)點(diǎn)都沒有依據(jù)表9-8所示5個特征之外的特征變量進(jìn)行分裂,所以說其他特征變量并沒有發(fā)揮作用。如果把max_depth設(shè)置得更大一些,讓決策樹可以繼續(xù)往下分裂,那么這些特征變量將可能發(fā)揮作用,使得特征重要性不再是0。此外,前文提到過,在決策樹模型中,特征重要性的大小取決于該變量對模型整體的基尼系數(shù)下降的貢獻(xiàn)大小,這里可以利用這個可視化后的決策樹,通過演示第二個特征變量“審計(jì)意見”的特征重要性為什么為0.1423來驗(yàn)證該觀點(diǎn)。
首先需要計(jì)算模型整體的基尼系數(shù)下降,根據(jù)不同葉子節(jié)點(diǎn)的樣本數(shù)進(jìn)行權(quán)重求和,新系統(tǒng)的基尼系數(shù)為0.11,整體基尼系數(shù)下降0.5?0.11=0.39。其次來看“審計(jì)意見”,在前文的決策樹中它共在兩個節(jié)點(diǎn)上發(fā)揮了作用,對系統(tǒng)產(chǎn)生的基尼系數(shù)下降0.0552(具體計(jì)算:24808÷42202×0.279?(2586÷42202×0.39+22222÷42202×0.183)
+2586÷42202×0.39?(1109÷42202×0.472+1477÷42202×0)≈0.0552),這就是“審計(jì)意見”這一特征變量在整個模型中發(fā)揮的作用,將其除以整體的基尼系數(shù)下降值便是它的特征重要性:0.0552÷0.39≈0.142。這個值與代碼獲得的特征重要性一致。知識點(diǎn)4:葉子節(jié)點(diǎn)停止分裂的依據(jù)葉子節(jié)點(diǎn)停止分裂的依據(jù)主要有兩個:已經(jīng)分裂結(jié)束無法再分裂;達(dá)到限定的分裂條件。比如右下角的葉子節(jié)點(diǎn)的基尼系數(shù)都為0了,也就是說這個葉子節(jié)點(diǎn)的純度已經(jīng)最高了(即里面所有的元素都是同一類別),已經(jīng)不需要也無法再分裂了。而有些葉子節(jié)點(diǎn)的基尼系數(shù)還沒有到達(dá)0,因?yàn)橄拗屏藰涞淖畲笊疃龋砸膊粫^續(xù)向下分裂了。此外,葉子節(jié)點(diǎn)因?yàn)椴恍枰^續(xù)分裂,所以不存在分裂依據(jù)這一元素。
知識點(diǎn)5:不舞弊和舞弊概率與葉子節(jié)點(diǎn)的關(guān)系注意,前文在9.2.2小節(jié)提到的不舞弊與舞弊概率的計(jì)算就是基于葉子節(jié)點(diǎn)的,如果被分到左下角的第二個葉子節(jié)點(diǎn),那么公司不舞弊概率為0,舞弊概率為100%,所以判斷公司會舞弊;如果被分到最左邊的葉子節(jié)點(diǎn),這個節(jié)點(diǎn)里總共有1109個數(shù)據(jù),不舞弊的有686個公司,舞弊的有423個公司,那么如果一個新的記錄被分到該葉子節(jié)點(diǎn),那么判定該記錄舞弊的概率為423÷1109≈0.381,不舞弊的概率則為686÷1109≈0.619,因?yàn)椴晃璞赘怕蚀笥谖璞赘怕剩耘卸ㄆ洳晃璞?,其余則依次類推。知識點(diǎn)6:ROC曲線與葉子節(jié)點(diǎn)的關(guān)系此外,感興趣的讀者可以將其余葉子節(jié)點(diǎn)所反映的舞弊概率計(jì)算出來(從左邊的葉子節(jié)點(diǎn)至右邊的葉子節(jié)點(diǎn),各節(jié)點(diǎn)舞弊概率分別為38.1%、100%、32.96%、4.48%、98.11%、0%、100%和2.06%),再觀察9.2.1小節(jié)繪制ROC曲線時用到的閾值,會發(fā)現(xiàn)9.2.1小節(jié)繪制ROC曲線時使用的閾值并不是隨意選取的,選取的是這些不同葉子節(jié)點(diǎn)反映出來的舞弊概率。ROC曲線的繪制就是以這些舞弊概率的值作為閾值來看不同閾值下的命中率和假警報率。
補(bǔ)充知識點(diǎn)7:決策樹可視化——graphviz插件的安裝及使用這里簡單講解決策樹可視化技巧——graphviz插件的安裝及使用,供感興趣的讀者參考。其詳細(xì)原理可以參考本書附贈的源代碼文件夾中的PDF文檔,這里主要講解核心要點(diǎn)。1.安裝graphviz插件首先需要安裝graphviz插件,可在其官網(wǎng)下載,以Windows版本為例,在下載網(wǎng)站上選擇圖9-22所示框中的內(nèi)容:Stable2.38Windowsinstallpackages。然后下載跳轉(zhuǎn)界面中的MSI文件:graphviz-2.38.msi(本書提供的源代碼文件夾里也有該文件),如圖9-23所示。下載完該MSI文件后單擊以進(jìn)行安裝,注意,要記住安裝的文件路徑,之后進(jìn)行環(huán)境變量部署的時候會用到,通常默認(rèn)路徑為C:\ProgramFiles(x86)\Graphviz2.38,建議不要修改。
2.安裝graphviz庫以Windows系統(tǒng)為例,按Win+R快捷鍵調(diào)出運(yùn)行框,輸入cmd后單擊“確定”按鈕,在彈出的窗口內(nèi)輸入pipinstallgraphviz,按Enter鍵等待安裝結(jié)束即可。如果在JupyterNotebook編輯器中則在代碼框中運(yùn)行代碼!pipinstallgraphviz。3.graphviz庫的使用運(yùn)行如下代碼就可以生成一個可視化的決策樹模型。前兩行代碼用于引入使用graphviz庫的相關(guān)庫。第3行代碼用于設(shè)置環(huán)境變量,這樣才能在Python中使用graphviz插件,這屬于手動設(shè)置環(huán)境變量的方法(如果想在整個計(jì)算機(jī)系統(tǒng)而非單個代碼文件中設(shè)置環(huán)境變量,可以參考本章源代碼文件夾中附贈的PDF文檔),這里graphviz插件的安裝路徑為C:\ProgramFiles(x86)\Graphviz2.38,環(huán)境變量部署就是將軟件所在文件路徑中的BIN文件夾部署到運(yùn)行環(huán)境中,如果是其他安裝路徑,那么自行修改即可。第4行代碼通過export_graphviz()方法將之前搭建的決策樹模型model轉(zhuǎn)換為字符串格式并賦值給dot_data,其中注意需要設(shè)定out_file參數(shù)為None,這樣獲得的才是字符串格式。第5行代碼則是將dot_data轉(zhuǎn)換成可視化的格式。第6行代碼則是通過render()方法將圖像輸出,上述代碼默認(rèn)輸出一個名為result的PDF文件。
以下是針對舞弊模型輸出決策樹可視化文件的完整代碼。
9.2.4過采樣效果對比驗(yàn)證本節(jié)一開始就介紹了過采樣這一技術(shù),之所以采用過采樣是因?yàn)楸纠龜?shù)據(jù)存在嚴(yán)重的數(shù)據(jù)不平衡問題,這一小節(jié)就來簡單介紹過擬合問題所帶來的危害,以及如果不進(jìn)行平衡化處理會帶來什么樣的問題。模型建立和擬合仍然參照前文步驟,不同的是去掉用SMOTE法進(jìn)行過采樣的過程,代碼如下:
由此便用不平衡的數(shù)據(jù)擬合出了一個模型,可以先看原數(shù)據(jù)有多不平衡,通過如下代碼查看此時訓(xùn)練集中的樣本類別和個數(shù)。#統(tǒng)計(jì)訓(xùn)練集中y的類別和個數(shù)fromcollectionsimportCounterCounter(y_train)結(jié)果如下。Counter({0:21101,1:93})
可以看到訓(xùn)練集里有21101個樣本不舞弊,93個樣本舞弊,如此不均衡的數(shù)據(jù)可能帶來一個問題,就是模型無法全面地學(xué)習(xí)到數(shù)據(jù)集中的特征信息。因?yàn)橹挥泻苌俚臉颖臼俏璞椎?,所以模型無法學(xué)習(xí)到舞弊樣本的特征。換句話說,在這種情況下,即便判斷所有樣本都不舞弊,也擁有很高的準(zhǔn)確率(此時模型的準(zhǔn)確率達(dá)到了0.9928),但是這一準(zhǔn)確率明顯是虛高的,為什么呢?因?yàn)檫@個模型實(shí)質(zhì)上并沒有起到分類的作用。通過如下代碼可以統(tǒng)計(jì)測試集中的樣本類別和個數(shù)。Counter(y_test)
結(jié)果如下。Counter({0:4716,1:33})可以看到測試集中有33個舞弊數(shù)據(jù),然后通過如下代碼查看預(yù)測的結(jié)果。Counter(y_pred)結(jié)果如下。Counter({0:4748,1:1})可以看到33個舞弊樣本只有1個被成功預(yù)測,雖然該模型的準(zhǔn)確度非常高(大部分都預(yù)測為非舞弊),但是財(cái)務(wù)舞弊識別模型的初衷是捕捉到可能舞弊的公司,因此該模型1/33的命中率是不合格的。也可以通過如下代碼查看該模型的AUC值。y_pred_proba=model.predict_proba(X_test)fromsklearn.metricsimportroc_auc_scorescore=roc_auc_score(y_test,y_pred)print(score)結(jié)果如下,可以看到這個AUC值是很低的(通常AUC值會大于0.5,小于0.5說明模型的預(yù)測能力很差)。0.4998939779474131在真正的實(shí)戰(zhàn)中,造成模型有問題的原因還有很多,這里就不再一一列舉了,有興趣的讀者可以進(jìn)一步學(xué)習(xí)。03模型的參數(shù)調(diào)優(yōu)機(jī)器學(xué)習(xí)的各個模型其實(shí)都有內(nèi)置的參數(shù),比如前文提到的決策樹模型的很重要的一個參數(shù):max_depth(樹的最大深度)。這種參數(shù)也被稱為超參數(shù),除了max_depth外,決策樹模型還有許多常用參數(shù),如criterion(特征選擇標(biāo)準(zhǔn))、min_samples_leaf(葉子節(jié)點(diǎn)的最少樣本數(shù))等,更多參數(shù)可以參考本章最后的補(bǔ)充知識點(diǎn)2:分類決策樹模型的超參數(shù)。在大多數(shù)情況下,使用模型的默認(rèn)參數(shù)也能獲得較好的結(jié)果及預(yù)測準(zhǔn)確度,然而如果想要精益求精,那么就需要對模型的超參數(shù)進(jìn)行調(diào)優(yōu),例如max_depth取3,還是取默認(rèn)值None(不設(shè)置最大深度,即分裂到所有葉子節(jié)點(diǎn)的基尼系數(shù)都為0)都是有考究的,如果max_depth取得過小可能會導(dǎo)致模型欠擬合,而如果取得過大,則容易導(dǎo)致模型過擬合(欠擬合和過擬合的知識點(diǎn)可參見9.1.4小節(jié)),因此需要一個手段來調(diào)節(jié)這些參數(shù)。這一節(jié)便介紹調(diào)整模型參數(shù)的常用方法:網(wǎng)格搜索(GridSearch)以及搭配使用的K折交叉驗(yàn)證。在學(xué)習(xí)網(wǎng)格搜索之前,先來了解K折交叉驗(yàn)證的基本原理。9.3.1K折交叉驗(yàn)證在機(jī)器學(xué)習(xí)中,因?yàn)橛?xùn)練集和測試集劃分?jǐn)?shù)據(jù)是隨機(jī)的,所以有時會重復(fù)地使用數(shù)據(jù)來更好地評估模型的有效性,并選出最好的模型,該做法稱為交叉驗(yàn)證。具體而言就是對原始樣本數(shù)據(jù)進(jìn)行切分,然后組合成為多組不同的訓(xùn)練集和測試集,用訓(xùn)練集訓(xùn)練模型,用測試集評估模型。某次的訓(xùn)練集可能是下次的測試集,故而稱作交叉驗(yàn)證。交叉驗(yàn)證有3種方法,分為簡單交叉驗(yàn)證、K折交叉驗(yàn)證和留一交叉驗(yàn)證。其中K折交叉驗(yàn)證的應(yīng)用較為廣泛,K折交叉驗(yàn)證是指將數(shù)據(jù)集隨機(jī)等分為K份,每次選取K?1份為訓(xùn)練集訓(xùn)練模型,然后用剩下的1份作為測試集,得到K個模型后將這K個模型的平均測試效果作為最終的模型效果。舉例來說,圖9-24所示便是3折交叉驗(yàn)證,即將數(shù)據(jù)隨機(jī)等分為3份,然后每次隨機(jī)選取2份數(shù)據(jù)作為訓(xùn)練集,剩下的1份作為測試集,重復(fù)3次,得到3個不同的測試效果,綜合來看這3個不同的測試結(jié)果能更加準(zhǔn)確地對模型進(jìn)行評估。通常來說,如果訓(xùn)練集相對較小,則增大K值,這樣在每次迭代過程中將會有更多的數(shù)據(jù)用于模型訓(xùn)練,同時算法時間延長;如果訓(xùn)練集相對較大,則減小K值,這樣可降低模型在不同的數(shù)據(jù)塊上進(jìn)行重復(fù)擬合的性能評估的計(jì)算成本,在平均性能的基礎(chǔ)上獲得模型的準(zhǔn)確評估。除了更加精確地對模型進(jìn)行評估,交叉驗(yàn)證另外一個重要的作用就是利用更加精確的評估結(jié)果對模型進(jìn)行參數(shù)調(diào)優(yōu),它經(jīng)常配合9.3.2小節(jié)要講到的網(wǎng)格搜索一起使用。補(bǔ)充知識點(diǎn):K折驗(yàn)證的代碼實(shí)現(xiàn)通過如下代碼可以實(shí)現(xiàn)K折交叉驗(yàn)證,并獲得每次驗(yàn)證的得分情況。fromsklearn.model_selectionimportcross_val_scoreacc=cross_val_score(model,x_smote_resampled,y_smote_resampled,cv=5)其中,第1行代碼用于引入交叉驗(yàn)證的函數(shù)cross_val_score();第2行代碼使用cross_val_score()函數(shù)進(jìn)行交叉驗(yàn)證,分別傳入模型名稱(model)、特征變量數(shù)據(jù)(x_smote_resampled)、目標(biāo)變量數(shù)據(jù)(y_smote_resampled)、交叉驗(yàn)證的次數(shù)(cv)。這里cv=5表示交叉驗(yàn)證5次,每次隨機(jī)取4/5的數(shù)據(jù)用來訓(xùn)練,取1/5的數(shù)據(jù)用來測試(如果不填該參數(shù),則cv值默認(rèn)為3)。此外,這里沒有設(shè)置scoring參數(shù),即認(rèn)為選擇默認(rèn)值accuracy(準(zhǔn)確度)進(jìn)行打分。輸出acc可以看到5次交叉驗(yàn)證得到的打分如下(注意,由于K折交叉驗(yàn)證具有隨機(jī)性,每次獲取的結(jié)果可能略有不同)。array([0.73251512,0.79956683,0.81633574,0.76570397,0.38808664])通過運(yùn)行如下代碼獲得這5個得分的平均分。acc.mean()結(jié)果如下:0.6741336546258525上面交叉驗(yàn)證默認(rèn)以準(zhǔn)確度作為評價標(biāo)準(zhǔn),如果想以ROC曲線的AUC值作為評價標(biāo)準(zhǔn),則可以設(shè)置scoring參數(shù)為roc_auc,代碼如下:acc=cross_val_score(model,x_smote_resampled,y_smote_resample,scoring='roc_auc',cv=5)在后文要講的網(wǎng)格搜索中,其實(shí)不再需要使用cross_val_score()函數(shù),屆時將使用GridSearchCV()函數(shù)同時進(jìn)行交叉驗(yàn)證和參數(shù)調(diào)優(yōu),所以關(guān)于cross_val_score()函數(shù)簡單了解即可。9.3.2網(wǎng)格搜索(參數(shù)調(diào)優(yōu))網(wǎng)格搜索是一種窮舉搜索的調(diào)參手段:遍歷所有的候選參數(shù),循環(huán)建立模型并對模型的有效性和準(zhǔn)確性進(jìn)行評估,選取表現(xiàn)最好的參數(shù)作為最終結(jié)果。以決策樹模型最
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 女團(tuán)趣味測試題及答案
- 文明就餐面試題及答案
- 慢性膽管癌的臨床觀察
- 物業(yè)部長面試題及答案
- 壓瘡護(hù)理試題及答案
- java中poi面試題及答案
- 保安服務(wù)禮儀知識培訓(xùn)課件
- 保安培訓(xùn)知識100問課件
- 煙草任務(wù)提成方案(3篇)
- 橋梁樁基返工方案(3篇)
- 2025年湖南省高考真題卷政治和答案
- 聚焦2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)模式的知識產(chǎn)權(quán)保護(hù)報告
- 2024年河北省孟村回族自治縣事業(yè)單位公開招聘工作人員考試題含答案
- 額葉膠質(zhì)瘤護(hù)理查房
- 農(nóng)行招聘薪酬管理辦法
- 2025至2030中國膜行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國物流園區(qū)行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢及投資規(guī)劃深度研究報告
- 2026年高考生物一輪復(fù)習(xí):必背高頻考點(diǎn)講義(全)
- 2025年成人高考語文試題及答案
- 移動護(hù)理信息系統(tǒng)應(yīng)用
- 影視劇公司管理制度
評論
0/150
提交評論