我的《機器學習實戰》讀書筆記(3)

我是綠色大米呀發表於2017-11-21

上一篇,主要是在說給一個分類‘打分’。這篇來講一個分類的方法。
《機器學習實戰》書中叫做‘決策樹’。我理解的意思就是,滿足條件A的就是A類,剩下的物件們再比較條件B,滿足條件B的就是B,如果還有剩下的,就再比較條件C,條件D……以此類推。
舉個例子:有5種海洋生物,判斷是否是魚類。這裡有2個條件“不浮出水面是否可以生存”和“是否有腳蹼”。

圖1.png
圖1.png

用到的“決策樹”如下:
圖2.png
圖2.png

我們這裡只討論第一步“滿足條件A的就是A類”。
把上面的資料轉化為能被程式理解的結構:
圖3.png
圖3.png

#給資料分類
def splitDataSet(dataSet , axis ,value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis] #取每行的第0個到第axis-1個的資料
            reducedFeatVec.extend(featVec[axis+1:]) #取每行的第axis+1個到最後一個的資料
            # 上面兩行,正好去掉了featVec[axis]這個資料
            retDataSet.append(reducedFeatVec)
    return retDataSet複製程式碼

這裡說一下3個引數的意義,dataSet 是原始的資料;axis 的意思使用哪個條件,是“不浮出水面是否可以生存”還是“是否有腳蹼”,也就是資料中的第0列還是第1列;value是比較的值。

呼叫一下:splitDataSet(dataSet , 0,1),意思是取出所有dataSet 中第0列值等於1的資料。即取出“不浮出水面可以生存”的生物。很明顯結果是:[[1, 'yes'], [1, 'yes'], [0, 'no']],然後這裡就用到了上一篇講的夏農熵,計算出夏農熵(0.9182958340544896),然後作為此種分類與其他分類孰優孰劣的比較依據。
我們再試一下另一種分類條件
splitDataSet(dataSet , 0,0),即取出“不浮出水面不可以生存”的生物。結果是[[1, 'no'], [1, 'no']],計算出夏農熵(0.0)。

很明顯第二種的夏農熵比第一種小,所以劃分的結果更理想。
我們這裡只使用了第一個條件,但是為了找到最優的劃分分類的方法,我們最好還是做一個遍歷。遍歷每一條件,和該條件的每個生物的值做比較。看看使用哪個條件做劃分比較好。

# 分割資料集
def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1
    baseEntropy = calcShannonEnt(dataSet) # 整個資料集的原始夏農熵
    bestInfoGain = 0.0;bestFeature = -1
    for i in range(numFeatures):
        # 拿出第i列的資料
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)
        newEntropy = 0.0
        # 拿該列中的每一個值去做分割
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet,i,value)
            prob = len(subDataSet)/float(len(dataSet))
            # 計算夏農熵的和
            newEntropy += prob* calcShannonEnt(subDataSet)
        # 如果夏農熵減少的多,說明越好,就要儲存下來這個值(儲存下來第i列)
        infoGain = baseEntropy - newEntropy
        if(infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature複製程式碼

程式碼執行結果是:0,也就是使用第0列劃分的最優的。即第0列的值是1的是一類(兩個屬於魚類,一個屬於非魚類),第0列的值是0的是另一類(完全屬於非魚類)。

我們再目測一下如果使用第1列進行分類,第一組有2個是魚類,2個是非魚類,另一組只有一個,是非魚類。

明顯,使用第0列進行分類比較好。雖然這仍然不是最優的結果,因為還是有一些非魚類‘混進’了魚類。但是注意,我們這裡只進行了‘決策樹’的第一步‘滿足條件A的就是A類’。下一步就需要‘遞迴構建決策樹’了。

相關文章