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