日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习算法总结--决策树

發布時間:2023/12/10 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习算法总结--决策树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

定義:分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種類型:內部結點和葉結點。內部結點表示一個特征或屬性,葉結點表示一個類。

決策樹學習通常包括3個步驟:特征選擇、決策樹的生成和決策樹的修剪。

決策樹學習本質上是從訓練數據集中歸納出一組分類規則,也可以說是由訓練數據集估計條件概率模型。它使用的損失函數通常是正則化的極大似然函數,其策略是以損失函數為目標函數的最小化。

決策樹學習的算法通常是一個遞歸地選擇最優特征,并根據該特征對訓練數據進行分割,使得對各個子數據集有一個最好的分類的過程。

決策樹的生成對應于模型的局部選擇,決策樹的剪枝對應于模型的全局選擇。決策樹的生成只考慮局部最優,相對地,決策樹的剪枝則考慮全局最優。

特征選擇

特征選擇的準則通常是信息增益或者信息增益比。

首先是給出信息熵的計算公式H(p)=?ni=1pilogpi,熵越大,隨機變量的不確定性就越大。公式中pi表示隨機變量X屬于類別i的概率,因此n表示類別的總數。

條件熵的定義為:H(Y|X)=ni=1piH(Y|X=xi)

已經有了熵作為衡量訓練樣例集合純度的標準,現在可以定義屬性分類訓練數據的效力的度量標準。這個標準被稱為“信息增益(information gain)”。簡單的說,一個屬性的信息增益就是由于使用這個屬性分割樣例而導致的期望熵降低(或者說,樣本按照某屬性劃分時造成熵減少的期望,個人結合前面理解,總結為用來衡量給定的屬性區分訓練樣例的能力)。更精確地講,一個屬性A相對樣例集合S的信息增益Gain(S,A)被定義為:

其中 Values(A)是屬性A所有可能值的集合,Sv是S中屬性A的值為v的子集,注意上式第一項就是原集合S的熵,第二項是用A分類S后的熵的期望值,第二項描述的期望熵就是每個子集的熵的加權和,權值為屬性Sv的樣例占原始樣例S的比例|Sv|/|S|,所以Gain(S,A)是由于知道屬性A的值而導致的期望熵減少,換句話來講,Gain(S,A)是由于給定屬性A的值而得到的關于目標函數值的信息。

信息增益的缺點是存在偏向于選擇取值較多的特征的問題。為了解決這個問題,可以使用信息增益比

因此,特征A對訓練數據集D的信息增益比gR(D,A)的定義如下:

gR(D,A)=g(D,A)HA(D)
其中 g(D,A)是信息增益,而 HA(D)=?ni=1|Di||D|log2|Di||D|,其中 n是特征A取值的個數。

不過對于信息增益比,其也存在對可取值數目較少的屬性有所偏好的問題

決策樹的生成

接下來會介紹決策樹生成的算法,包括ID3, C4.5算法。

ID3算法

ID3算法的核心是在決策樹各個結點上應用信息增益準則選擇特征,遞歸地構建決策樹。具體步驟如下所示:

ID3的算法思路總結如下:
1. 首先是針對當前的集合,計算每個特征的信息增益
2. 然后選擇信息增益最大的特征作為當前節點的決策決策特征
3. 根據特征不同的類別劃分到不同的子節點(比如年齡特征有青年,中年,老年,則劃分到3顆子樹)
4. 然后繼續對子節點進行遞歸,直到所有特征都被劃分

C4.5算法

C4.5算法繼承了ID3算法的優點,并在以下幾方面對ID3算法進行了改進:

  • 用信息增益率來選擇屬性,克服了用信息增益選擇屬性時偏向選擇取值多的屬性的不足;
  • 在樹構造過程中進行剪枝;
  • 能夠完成對連續屬性的離散化處理;
  • 能夠對不完整數據進行處理。

C4.5算法有如下優點:產生的分類規則易于理解,準確率較高。

其缺點是:在構造樹的過程中,需要對數據集進行多次的順序掃描和排序,因而導致算法的低效。此外,C4.5只適合于能夠駐留于內存的數據集,當訓練集大得無法在內存容納時程序無法運行。

算法的實現過程如下:

實際上由于信息增益比的缺點,C4.5算法并沒有直接選擇信息增益比最大的候選劃分屬性,而是先從候選劃分屬性中找出信息增益高于平均水平的屬性,再從中選擇信息增益比最高的。

剪枝

在生成樹的過程中,如果沒有剪枝的操作的話,就會長成每一個葉都是單獨的一類的樣子。這樣對我們的訓練集是完全擬合的,但是對測試集則是非常不友好的,泛化能力不行。因此,我們要減掉一些枝葉,使得模型泛化能力更強。
根據剪枝所出現的時間點不同,分為預剪枝和后剪枝。預剪枝是在決策樹的生成過程中進行的;后剪枝是在決策樹生成之后進行的。

決策樹的剪枝往往是通過極小化決策樹整體的損失函數或代價函數來實現的。簡單來說,就是對比剪枝前后整體樹的損失函數或者是準確率大小來判斷是否需要進行剪枝。

決策樹剪枝算法有多種,具體參考決策樹剪枝算法這篇文章。

CART

分類回歸樹(Classification And Regression Tree)是一個決策二叉樹,在通過遞歸的方式建立,每個節點在分裂的時候都是希望通過最好的方式將剩余的樣本劃分成兩類,這里的分類指標:

  • 分類樹:基尼指數最小化(gini_index)
  • 回歸樹:平方誤差最小化
  • 分類樹的生成步驟如下所示:

    簡單總結如下:

  • 首先是根據當前特征計算他們的基尼增益
  • 選擇基尼增益最小的特征作為劃分特征
  • 從該特征中查找基尼指數最小的分類類別作為最優劃分點
  • 將當前樣本劃分成兩類,一類是劃分特征的類別等于最優劃分點,另一類就是不等于
  • 針對這兩類遞歸進行上述的劃分工作,直達所有葉子指向同一樣本目標或者葉子個數小于一定的閾值
  • 基尼指數的計算公式為Gini(p)=1?Kk=1p2k。K是類別的數目, pk表示樣本屬于第k類的概率值。它可以用來度量分布不均勻性(或者說不純),總體的類別越雜亂,GINI指數就越大(跟熵的概念很相似)。

    給定一個數據集D,在特征A的條件下,其基尼指數定義為Gini(D,A)=ni=1|Di||D|Gini(Di)

    回歸樹:

    回歸樹是以平方誤差最小化的準則劃分為兩塊區域

  • 遍歷特征計算最優的劃分點s,
    使其最小化的平方誤差是:min{min(R1i((yi?c1)2))+min(R2i((yi?c2)2))}
    計算根據s劃分到左側和右側子樹的目標值與預測值之差的平方和最小,這里的預測值是兩個子樹上輸入xi樣本對應yi的均值

  • 找到最小的劃分特征j以及其最優的劃分點s,根據特征j以及劃分點s將現有的樣本劃分為兩個區域,一個是在特征j上小于等于s,另一個在在特征j上大于s

    R1(j)={x|x(j)s}R2(j)={x|x(j)>s}

  • 進入兩個子區域按上述方法繼續劃分,直到到達停止條件

  • 關于CART剪枝的方法可以參考決策樹系列(五)——CART。

    停止條件

  • 直到每個葉子節點都只有一種類型的記錄時停止,(這種方式很容易過擬合)
  • 另一種是當葉子節點的樣本數目小于一定的閾值或者節點的信息增益小于一定的閾值時停止
  • 關于特征與目標值

  • 特征離散 目標值離散:可以使用ID3,cart
  • 特征連續 目標值離散:將連續的特征離散化 可以使用ID3,cart
  • 決策樹的分類與回歸

    • 分類樹
      輸出葉子節點中所屬類別最多的那一類
    • 回歸樹
      輸出葉子節點中各個樣本值的平均值

    理想的決策樹

  • 葉子節點數盡量少
  • 葉子節點的深度盡量小(太深可能會過擬合)
  • 解決決策樹的過擬合

  • 剪枝
  • 前置剪枝:在分裂節點的時候設計比較苛刻的條件,如不滿足則直接停止分裂(這樣干決策樹無法到最優,也無法得到比較好的效果)
  • 后置剪枝:在樹建立完之后,用單個節點代替子樹,節點的分類采用子樹中主要的分類(這種方法比較浪費前面的建立過程)
  • 交叉驗證
  • 隨機森林
  • 優缺點

    優點:

  • 計算量簡單,可解釋性強,比較適合處理有缺失屬性值的樣本,能夠處理不相關的特征;
  • 缺點:

  • 單顆決策樹分類能力弱,并且對連續值變量難以處理;
  • 容易過擬合(后續出現了隨機森林,減小了過擬合現象);
  • 代碼實現

    使用sklearn中決策樹函數的簡單代碼例子如下所示:

    #Import Library #Import other necessary libraries like pandas, numpy...from sklearn import tree #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset# Create tree object model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini # model = tree.DecisionTreeRegressor() for regression# Train the model using the training sets and check score model.fit(X, y) model.score(X, y)#Predict Output predicted= model.predict(x_test)

    決策樹的代碼在開源庫OpenCV中有實現,具體的源碼分析可以參考Opencv2.4.9源碼分析——Decision Trees,這篇文章也比較詳細總結了決策樹的知識點以及對OpenCV中決策樹部分的源碼進行了分析。

    總結

    以上是生活随笔為你收集整理的机器学习算法总结--决策树的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。