決策樹算法小結(二) C4.5原理及代碼實現


上一節(ID3原理及代碼實現)講到的ID3算法存在不足,用信息增益作為特征選擇標准會偏向取值較多的特征,因為特征的取值越多(該特征數據分的更細)即純度更高,不確定性(條件熵越小\(H(D|A)\))更低,由於\(H(D)\)是一定的,因此信息增益更大,所以偏向取值更多的特征。使用信息增益比可以矯正這一問題,信息增益比就是特征選擇的另一准則——C4.5。

1 C4.5原理

信息增益比表達式:

\[g_{R}(D,A)=\frac{g(D,A)}{H_{A}(D)} \]

其中\(D\)是訓練數據集,\(A\)是樣本特征,\({H_{A}(D)}\)是特征熵,表達式為:

\[{H_{A}(D)}=-\sum_{i=1}^{n}\frac{|D_{i}|}{|D|}log_{2}\frac{|D_{i}|}{|D|} \]

\(n\)表示特征\(A\)的類別個數,\(D_{i}\)表示樣本子集,\(|D_{i}|\) 表示\(D_{i}\)樣本子集的個數。信息增益比本質是在信息增益的基礎上乘一個懲罰參數。特征個數較多時,懲罰參數較小;特征個數較少時,懲罰參數較大。
懲罰參數:數據集\(D\)以特征\(A\)作為隨機變量的熵的倒數,即:將特征A取值相同的樣本划分到同一個子集中。

C4.5算法對ID3算法進行了改進,用信息增益比來選擇特征。
決策樹C4.5算法

輸入: 訓練數據集\(D\),特征集\(A\),閾值$\varepsilon $;

輸出: 決策樹\(T\)

step1\(D\)中所有實例屬於同一類\(C_{k}\),則\(T\)為單結點樹,並將類\(C_{k}\)作為該結點的類標記,返回\(T\)

step2\(A=\Phi\),則\(T\)為單結點樹,並將\(D\)中實例數最大的類\(C_{k}\)作為該結點的類標記,返回\(T\)

step3 否則計算特征集\(A\)中各特征對\(D\)的信息增益比,選擇信息增益最大的特征\(A_{g}\)

step4 如果\(A_{g}\)的信息增益小於閾值\(\varepsilon\),則置\(T\)為單結點樹,並將\(D\)中實例數最大的類\(C_{k}\)作為該結點的類標記,返回\(T\)

step5 否則,對\(A_{g}\)的每一個取值\(A_{gi}\)將對應的樣本輸出\(D\)分成不同的類別\(D_{i}\),每個類別產生一個子節點,對應特征值是\(A_{gi}\),返回增加了結點的樹;

step6 對所有的子結點,以\(D_{i}\)為訓練集,以\(A-{A_{g}}\)為特征集,遞歸調用(1)-(5),得到子樹\(T_{i}\),返回\(T_{i}\).

2 代碼實現

這里只給出信息增益比特征選擇部分,其他代碼與ID3原理及代碼實現一致。

def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1  # the last column is used for the labels
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGainRatio = 0.0;
    bestFeature = -1
    for i in range(numFeatures):  # iterate over all the features
        featList = [example[i] for example in dataSet]  # create a list of all the examples of this feature
        uniqueVals = set(featList)  # get a set of unique values
        newEntropy = 0.0
        splitInfo = 0.0
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet) / float(len(dataSet))
            newEntropy += prob * calcShannonEnt(subDataSet)
            splitInfo += -prob * log(prob, 2)
        infoGain = baseEntropy - newEntropy  # calculate the info gain; ie reduction in entropy
        if (infoGain == 0): #fix the overflow bug
            continue
            infoGainRatio = infoGain / splitInfo
        if (infoGainRatio > bestInfoGainRatio):  # compare this to the best gain so far
            bestInfoGainRatio = infoGainRatio  # if better than current best, set to best
            bestFeature = i
    return bestFeature  # returns an integer

控制台運行效果:

>>> import mytrees
>>> imp.reload(mytrees)
<module 'mytrees' from 'D:\\Python\\Mechine_learning\\Tree\\mytrees.py'>
>>> import treePlotter
>>> myTree = treePlotter.retrieveTree(0)
>>> treePlotter.createPlot(myTree)

3 C4.5小結

缺點:信息增益比偏向取值較少的特征
原因: 當特征取值較少時,\({H_{A}(D)}\)的值較小,因此其倒數較大,因而信息增益比較大。因而偏向取值較少的特征。
使用信息增益比:基於以上缺點,並不是直接選擇信息增益率最大的特征,而是先在候選特征中找出信息增益高於平均水平的特征,然后在這些特征中再選擇信息增益率最高的特征。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM