12_信息熵,信息熵公式,信息增益,决策树、常见决策树使用的算法、决策树的流程、决策树API、决策树案例、随机森林、随机森林的构建过程、随机森林API、随机森林的优缺点、随机森林案例
1 信息熵
以下來自:https://www.zhihu.com/question/22178202/answer/161732605
1.2 信息熵的公式
先拋出信息熵公式如下:
1.2 信息熵
信息量是對信息的度量,就跟時間的度量是秒一樣,當(dāng)我們考慮一個離散的隨機(jī)變量x的時候,當(dāng)我們觀察到的這個變量的一個具體值的時候,我們接收到了多少信息呢?
多少信息用信息量來衡量,我們接受到的信息量跟具體發(fā)生的事件有關(guān)。
信息的大小跟隨機(jī)事件的概率有關(guān)。越小概率的事情發(fā)生了產(chǎn)生的信息量越大,如湖南產(chǎn)生的地震了;越大概率的事情發(fā)生了產(chǎn)生的信息量越小,如太陽從東邊升起來了(肯定發(fā)生嘛,沒什么信息量)。這很好理解!
例子
如果我們有倆個不相關(guān)的事件x和y,那么我們觀察到的倆個事件同時發(fā)生時獲得的信息應(yīng)該等于觀察到的事件各自發(fā)生時獲得的信息之和,即:
h(x,y) = h(x) + h(y)
由于x,y是兩個不相關(guān)的事件,那么滿足p(x,y) = p(x) * p(y)。
根據(jù)上面推導(dǎo),我們很容易看出h(x)一定與p(x)的對數(shù)有關(guān)(因?yàn)橹挥袑?shù)形式的真數(shù)相乘之后,能夠?qū)?yīng)對數(shù)的相加形式,可以試試)。因此我們有信息量公式如下:
下面解決兩個疑問:
1、為什么有一個負(fù)號
其中,負(fù)號是為了確保信息一定是正數(shù)或者是0,總不能為負(fù)數(shù)吧!
2、為什么底數(shù)為2
這是因?yàn)?#xff0c;我們只需要信息量滿足低概率事件x對應(yīng)于高的信息量。那么對數(shù)的選擇是任意的。我們只是遵循信息論的普遍傳統(tǒng),使用2作為對數(shù)的底!
信息熵
下面我們正式引出信息熵
信息量度量的是一個具體事件發(fā)生了所帶來的信息,而熵則是在結(jié)果出來之前對可能產(chǎn)生的信息量的期望——考慮該隨機(jī)變量的所有可能取值,即所有可能發(fā)生事件所帶來的信息量的期望。即:
轉(zhuǎn)換一下為:
最終我們的公式來源推導(dǎo)完成了。
這里我再說一個對信息熵的理解。信息熵還可以作為一個系統(tǒng)復(fù)雜程度的度量,如果系統(tǒng)越復(fù)雜,出現(xiàn)不同情況的種類越多,那么他的信息熵是比較大的。
如果一個系統(tǒng)越簡單,出現(xiàn)情況種類很少(極端情況為1種情況,那么對應(yīng)概率為1,那么對應(yīng)的信息熵為0),此時的信息熵較小。
2 信息增益
信息增益就是熵(這里是信息熵)和特征條件熵的差。
g(D,A)=H(D)-H(D|A) 【信息增益 = 信息熵 - 條件熵】
什么意思呢,就是說對于一個確定的數(shù)據(jù)集來說,HD(D)是確定的,那么H(D|A)在A特征一定的情況下,隨機(jī)變量的不確定性越小,信息增益越大,這個特征的表現(xiàn)就越好。
所以,信息增益就是在得知特征X一定的情況下,Y(逾期概率)不確定性的減少程度。
一個特征往往會使一個隨機(jī)變量Y的信息量減少,減少的部分就是信息增益。
條件熵:表示在條件X下y的信息熵。
3 決策樹
3.1 認(rèn)識決策樹
決策樹思想的來源非常樸素,程序設(shè)計(jì)中的條件分支結(jié)構(gòu)就是if-then結(jié)構(gòu),最早的決策樹就是利用這類結(jié)構(gòu)分割數(shù)據(jù)的一種分類學(xué)習(xí)方法
3.2 信息論基礎(chǔ)–銀行貸款分析
你如何去劃分是否能得到貸款?
決策樹的實(shí)際劃分:
3.3 決策樹的理解
決策樹是監(jiān)督學(xué)習(xí)算法之一,并且是一種基本的分類與回歸方法;決策樹也分為回歸樹和分類樹。
決策樹是表示基于特征對實(shí)例進(jìn)行分類的樹形結(jié)構(gòu)。
從給定的訓(xùn)練數(shù)據(jù)集中,依據(jù)特征選擇的準(zhǔn)則,遞歸的選擇最優(yōu)劃分特征,并根據(jù)此特征將訓(xùn)練數(shù)據(jù)進(jìn)行分割,使得各子數(shù)據(jù)集有一個最好的分類的過程。
決策樹算法3要素:
1、特征選擇
2、決策樹生成
3、決策樹剪枝
關(guān)于決策樹生成:
決策樹的生成過程就是 使用滿足劃分準(zhǔn)則的特征不斷的將數(shù)據(jù)集劃分為純度更高,不確定性更小的子集的過程。對于當(dāng)前數(shù)據(jù)集D的每一次的劃分,都希望根據(jù)某特征劃分之后的各個子集的純度更高,不確定性更小。
而如何度量劃分?jǐn)?shù)據(jù)集前后的數(shù)據(jù)集的純度以及不確定性呢?
答案:特征選擇準(zhǔn)則,比如:信息增益,信息增益率,基尼指數(shù)
特征選擇準(zhǔn)則:
目的:使用某特征對數(shù)據(jù)集劃分之后,各數(shù)據(jù)子集的純度要比劃分前的數(shù)據(jù)集D的純度高(不確定性要比劃分前數(shù)據(jù)集D的不確定性低)
注意:
3.4 常見決策樹使用的算法
3.5 決策樹的流程
構(gòu)造決策樹的數(shù)據(jù)必須要充足,特征較少的數(shù)據(jù)集可能會導(dǎo)致決策樹的正確率偏低。若數(shù)據(jù)特征過多,不會選擇特征也會影響決策樹的正確率。構(gòu)建一個比較理想的決策樹,大致可分為以下三步:特征選擇、決策樹的生成與決策樹的修剪。
3.6 sklearn決策樹API
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None) 決策樹分類器criterion:默認(rèn)是'gini'系數(shù),也可以選擇信息增益的熵'entropy' max_depth:樹的深度大小 random_state:隨機(jī)數(shù)種子method: decision_path:返回決策樹的路徑。3.7 泰坦尼克號乘客生存分類
在泰坦尼克號和titanic2數(shù)據(jù)幀描述泰坦尼克號上的個別乘客的生存狀態(tài)。在泰坦尼克號的數(shù)據(jù)幀不包含從劇組信息,但它確實(shí)包含了乘客的一半的實(shí)際年齡。關(guān)于泰坦尼克號旅客的數(shù)據(jù)的主要來源是百科全書Titanica。這里使用的數(shù)據(jù)集是由各種研究人員開始的。其中包括許多研究人員創(chuàng)建的旅客名單,由Michael A. Findlay編輯。
我們提取的數(shù)據(jù)集中的特征是票的類別,存活,乘坐班,年齡,登陸,home.dest,房間,票,船和性別。乘坐班是指乘客班(1,2,1),是社會經(jīng)濟(jì)階層的代表。
其中age數(shù)據(jù)存在缺失。
數(shù)據(jù)地址:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
泰坦尼克號乘客生存分類模型:
1、pd讀取數(shù)據(jù) 2、選擇有影響的特征,處理缺失值 3、進(jìn)行特征工程,pd轉(zhuǎn)換字典,特征抽取 x_train.to_dict(orient="records") 4、決策樹估計(jì)器流程。決策樹的結(jié)構(gòu)、本地保存
1、sklearn.tree.export_graphviz()函數(shù)能夠?qū)С鯠OT格式 tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])2、工具:(能夠?qū)ot文件轉(zhuǎn)換為pdf、png) 安裝graphviz ubuntu:sudo apt-get install graphviz Mac:brew install graphviz3、運(yùn)行命令 然后我們運(yùn)行這個命令 dot -Tpng tree.dot -o tree.pngwindows下安裝graphviz
如果是windows下,訪問graphviz官網(wǎng),下載graphviz-2.38.msi
案例:
from sklearn.model_selection import train_test_split from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier,export_graphviz import pandas as pddef decision():"""決策樹對泰坦尼克號進(jìn)行預(yù)測生死:return:"""# 獲取數(shù)據(jù)titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")# 處理數(shù)據(jù),找出特征值和目標(biāo)值x = titan[['pclass', 'age', 'sex']]y = titan['survived']print(x)# 缺失值處理x['age'].fillna(x['age'].mean(), inplace=True)# 分割數(shù)據(jù)集到訓(xùn)練集合測試集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)# 進(jìn)行處理(特征工程)特征-》類別-》one_hot編碼dict = DictVectorizer(sparse=False)x_train = dict.fit_transform(x_train.to_dict(orient="records"))print(dict.get_feature_names())x_test = dict.transform(x_test.to_dict(orient="records"))print(x_train)# 用決策樹進(jìn)行預(yù)測dec = DecisionTreeClassifier()#dec.fit(x_train, y_train)## 預(yù)測準(zhǔn)確率print("預(yù)測的準(zhǔn)確率:", dec.score(x_test, y_test))## 導(dǎo)出決策樹的結(jié)構(gòu)export_graphviz(dec, out_file="./tree.dot", feature_names=['年齡', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])return Noneif __name__ == "__main__":decision()輸出結(jié)果:
pclass age sex 0 1st 29.0000 female 1 1st 2.0000 female 2 1st 30.0000 male 3 1st 25.0000 female 4 1st 0.9167 male... ... ... 1308 3rd NaN male 1309 3rd NaN male 1310 3rd NaN male 1311 3rd NaN female 1312 3rd NaN male [1313 rows x 3 columns] D:\installed\Anaconda3\lib\site-packages\pandas\core\generic.py:6287: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copyself._update_inplace(new_data) ['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male'] [[24. 0. 0. 1. 0. 1. ][20. 0. 1. 0. 1. 0. ][51. 1. 0. 0. 0. 1. ]...[31.19418104 0. 1. 0. 1. 0. ][18. 0. 0. 1. 0. 1. ][31.19418104 0. 1. 0. 1. 0. ]] 預(yù)測的準(zhǔn)確率: 0.77811550151975683.8 決策樹的優(yōu)缺點(diǎn)以及改進(jìn)
優(yōu)點(diǎn):1、簡單的理解和解釋,樹木可視化2、需要很少的數(shù)據(jù)準(zhǔn)備,其他技術(shù)通常需要數(shù)據(jù)歸一化。缺點(diǎn):1、決策樹學(xué)習(xí)者可以創(chuàng)建不能很好地推廣數(shù)據(jù)的過于復(fù)雜的樹,這被稱為過擬合。2、決策樹可能不穩(wěn)定,因?yàn)閿?shù)據(jù)的小變化可能會導(dǎo)致完全不同的樹被生成改進(jìn):1、減枝cart算法。2、隨機(jī)森林4 集成學(xué)習(xí)方法-隨機(jī)森林
集成學(xué)習(xí)通過建立幾個模型組合的來解決單一預(yù)測問題。它的工作原理是生成多個分類器/模型,各自獨(dú)立地學(xué)習(xí)和作出預(yù)測。這些預(yù)測最后結(jié)合成單預(yù)測,因此優(yōu)于任何一個單分類的做出預(yù)測。
4.1 什么是隨機(jī)森林
定義:在機(jī)器學(xué)習(xí)中,隨機(jī)森林是一個包含多個決策樹的分類器,并且其輸出的類別是由個別樹輸出的類別的眾數(shù)(絕大多數(shù))而定。
例如:如果你訓(xùn)練了5個樹,其中有4個樹的結(jié)果是True,1個樹的結(jié)果是False,那么最終結(jié)果會是True。
隨機(jī)森林是一種有監(jiān)督學(xué)習(xí)算法,是以決策樹為基學(xué)習(xí)器的集成學(xué)習(xí)算法。隨機(jī)森林非常簡單,易于實(shí)現(xiàn),計(jì)算開銷也很小,但是它在分類和回歸上表現(xiàn)出非常驚人的性能,因此,隨機(jī)森林被譽(yù)為“代表集成學(xué)習(xí)技術(shù)水平的方法”。
學(xué)習(xí)算法
根據(jù)下列算法而建造每棵樹:
1、用N來表示訓(xùn)練用例(樣本)的個數(shù),M表示特征數(shù)目。
2、輸入特征數(shù)目m,用于確定決策樹上一個節(jié)點(diǎn)的決策結(jié)果;其中m應(yīng)遠(yuǎn)小于M。
3、從N個訓(xùn)練用例(樣本)中以有放回抽樣的方式,取樣N次,形成一個訓(xùn)練集(即bootstrap取樣),并用未抽到的用例(樣本)做預(yù)測,評估其誤差。
隨機(jī)森林的隨機(jī)性體現(xiàn)在哪幾個方面?
1、數(shù)據(jù)集的隨機(jī)選取
從原始的數(shù)據(jù)集中采取有放回的抽樣(bagging),構(gòu)造子數(shù)據(jù)集,子數(shù)據(jù)集的數(shù)據(jù)量是和原始數(shù)據(jù)集相同的。不同子數(shù)據(jù)集的元素可以重復(fù),同一個子數(shù)據(jù)集中的元素也可以重復(fù)。
2、待選特征的隨機(jī)選取
與數(shù)據(jù)集的隨機(jī)選取類似,隨機(jī)森林中的子樹的每一個分裂過程并未用到所有的待選特征,而是從所有的待選特征中隨機(jī)選取一定的特征,之后再在隨機(jī)選取的特征中選取最優(yōu)的特征
為什么要隨機(jī)抽樣訓(xùn)練集?
如果不進(jìn)行隨機(jī)抽樣,每棵樹的訓(xùn)練集都一樣,那么最終訓(xùn)練出的樹分類結(jié)果也是完全一樣的。
為什么要有放回地抽樣?
如果不是有放回的抽樣,那么每棵樹的訓(xùn)練樣本都是不同的,都是沒有交集的,這樣每棵樹都是“有偏的”,都是絕對“片面的”(當(dāng)然這樣說可能不對),也就是說每棵樹訓(xùn)練出來都是有很大的差異的;而隨機(jī)森林最后分類取決于多棵樹(弱分類器)的投票表決。
為什么使用隨機(jī)森林
1、隨機(jī)森林既可以用于分類問題,也可以用于回歸問題
2、過擬合是個關(guān)鍵的問題,可能會讓模型的結(jié)果變得糟糕,但是對于隨機(jī)森林來說,如果隨機(jī)森林的樹足夠多,那么分類器就不會過擬合模型
3、隨機(jī)森林分類器可以處理缺失值。
4、隨機(jī)森林分類器可以用分類值建模。
4.2 隨機(jī)森林的構(gòu)建過程
1、從原始訓(xùn)練集中使用Bootstraping方法隨機(jī)有放回采樣取出m個樣本,共進(jìn)行n_tree次采樣。生成n_tree個訓(xùn)練集。
2、對n_tree個訓(xùn)練集,我們分別訓(xùn)練n_tree個決策樹模型。
3、對于單個決策樹模型,假設(shè)訓(xùn)練樣本特征的個數(shù)為n,那么每次分裂時根據(jù)信息增益/信息增益比/基尼指數(shù) 選擇最好的特征進(jìn)行分裂。
4、每棵樹都已知這樣分裂下去,知道該節(jié)點(diǎn)的所有訓(xùn)練樣例都屬于同一類。在決策樹的分裂過程中不需要剪枝
5、將生成的多顆決策樹組成隨機(jī)森林。對于分類問題,按照多棵樹分類器投票決定最終分類結(jié)果;對于回歸問題,由多顆樹預(yù)測值的均值決定最終預(yù)測結(jié)果。
注意:OOB(out-of-bag ):每棵決策樹的生成都需要自助采樣,這時就有1/3的數(shù)據(jù)未被選中,這部分?jǐn)?shù)據(jù)就稱為袋外數(shù)據(jù)。
再如:
隨機(jī)森林分解開來就是“隨機(jī)”和“森林”。“隨機(jī)”的含義我們之后講,我們先說“森林”,森林是由很多棵樹組成的,因此隨機(jī)森林的結(jié)果是依賴于多棵決策樹的結(jié)果,這是一種集成學(xué)習(xí)的思想。森林里新來了一只動物,森林舉辦森林大會,判斷這到底是什么動物,每棵樹都必須發(fā)表意見,票數(shù)最多的結(jié)果將是最終的結(jié)果。隨機(jī)森林最終的模型見下圖示:
這里推薦一篇博文:用通俗易懂的方式剖析隨機(jī)森林
4.3 隨機(jī)森林API
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’,max_depth=None, bootstrap=True, random_state=None)n_estimators:integer,optional(default = 10) 森林里的樹木數(shù)量 criteria:string,可選(default =“gini”)分割特征的測量方法。 max_depth: integer或None,可選(默認(rèn)=無)樹的最大深度 bootstrap:boolean,optional(default=True) 是否在構(gòu)建樹時使用放回抽樣4.4 隨機(jī)森林的優(yōu)點(diǎn)、缺點(diǎn)
缺點(diǎn):
4.5 泰坦尼克號乘客生存分類分析
from sklearn.model_selection import train_test_split,GridSearchCV from sklearn.feature_extraction import DictVectorizer from sklearn.ensemble import RandomForestClassifier import pandas as pddef decision():"""決策樹對泰坦尼克號進(jìn)行預(yù)測生死:return:"""# 獲取數(shù)據(jù)titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")# 處理數(shù)據(jù),找出特征值和目標(biāo)值x = titan[['pclass', 'age', 'sex']]y = titan['survived']print(x)# 缺失值處理x['age'].fillna(x['age'].mean(), inplace=True)# 分割數(shù)據(jù)集到訓(xùn)練集合測試集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)# 進(jìn)行處理(特征工程)特征-》類別-》one_hot編碼dict = DictVectorizer(sparse=False)x_train = dict.fit_transform(x_train.to_dict(orient="records"))print(dict.get_feature_names())x_test = dict.transform(x_test.to_dict(orient="records"))# 隨機(jī)森林進(jìn)行預(yù)測(超參數(shù)調(diào)優(yōu))rf = RandomForestClassifier()param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}# 網(wǎng)絡(luò)搜索與交叉驗(yàn)證gc = GridSearchCV(rf,param_grid=param,cv=2)gc.fit(x_train,y_train)print("準(zhǔn)確率:",gc.score(x_test,y_test))print("查看選擇的參數(shù)模型:", gc.best_params_)return Noneif __name__ == "__main__":decision()輸出結(jié)果:
pclass age sex 0 1st 29.0000 female 1 1st 2.0000 female 2 1st 30.0000 male 3 1st 25.0000 female 4 1st 0.9167 male... ... ... 1308 3rd NaN male 1309 3rd NaN male 1310 3rd NaN male 1311 3rd NaN female 1312 3rd NaN male [1313 rows x 3 columns] D:\installed\Anaconda3\lib\site-packages\pandas\core\generic.py:6287: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copyself._update_inplace(new_data) ['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male'] 準(zhǔn)確率: 0.7750759878419453 查看選擇的參數(shù)模型: {'max_depth': 5, 'n_estimators': 120}打個賞唄,您的支持是我堅(jiān)持寫好博文的動力。
總結(jié)
以上是生活随笔為你收集整理的12_信息熵,信息熵公式,信息增益,决策树、常见决策树使用的算法、决策树的流程、决策树API、决策树案例、随机森林、随机森林的构建过程、随机森林API、随机森林的优缺点、随机森林案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝锦鲤卡有什么用
- 下一篇: 13_线性回归分析、线性模型、损失函数、