首頁>科技>

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

上一篇,主要是在說給一個分類‘打分’。這篇來講一個分類的方法。

《機器學習實戰》書中叫做‘決策樹’。我理解的意思就是,滿足條件A的就是A類,剩下的物件們再比較條件B,滿足條件B的就是B,如果還有剩下的,就再比較條件C,條件D……以此類推。

舉個例子:有5種海洋生物,判斷是否是魚類。這裡有2個條件“不浮出水面是否可以生存”和“是否有腳蹼”。

圖1.png

用到的“決策樹”如下:

圖2.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類’。下一步就需要‘遞迴構建決策樹’了。

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 未來幾年,機器人市場十大趨勢預測