概述:通過分析每個資料特徵項在分類過程中所起到的所用比重,將資料劃分為幾個資料子集,如果某個資料子集資料同一型別,則無需再繼續劃分資料分類,如果不屬於同一分類,則需要在對資料子集進行分割。
優點:計算複雜度不高。
缺點:可能會出現由於樣本特徵值對應的樣本數量不統一導致結果偏向於數量多的樣本對應的分類。
在每次劃分資料集時我們會取乙個特徵屬性來進行劃分,那麼這裡有乙個問題,例如訓練樣本裡面有20個特徵值,我們如何從這些特徵中選擇當前用於劃分的最適合的特徵項呢?我們需要找到乙個有效的量化方法來劃分資料。
樣本id
是否需要浮出水面
是否有腳蹼
屬於魚1是是
是2是是
是3是否
是4否是
否5否是
否 我們劃分資料的原則是將無須的資料變得更加有序,這裡有乙個資訊增益的概念:即資料在劃分前後的資訊發生的變化成為資訊增益。因此我們需要計算每個特徵值的資料劃分之後的資訊增益值,選取最大的資訊增益特徵值作為當前資料劃分特徵。集合資訊的度量方式成為熵,我們需要計算我們的資訊集合熵值。
熵的計算公式:h=
−log
2p(x
i)對於集合的熵計算公式:h=
−∑ni
=1p(
xi)l
og2p
(xi)
計算資訊熵演算法
#-*- coding=utf-8 -*-
from numpy import *
from math import log
import operator
defcalcshannonent
(dataset):
labelcounts = {} #統計每個標籤的次數
for line in dataset:
label = line[-1]
labelcounts[label] = labelcounts.get(label, 0) + 1
shannonent = 0.0
#統計資訊熵
for key in labelcounts:
prob = float(labelcounts[key])/len(dataset)
shannonent -= prob * log(prob, 2)
return shannonent
由於是決策樹因此我們需要將集合劃分為不同的子集
#例如上面的通過是否浮出水面劃分資料就能得到兩個子集
#子集1
#是否有腳蹼|屬於魚類
#是 | 是
#是 | 是
#否 | 是
#子集2
#是 | 否
#是 | 否
#axis表示特徵項,value表示需要匹配的特徵值
defsplitdataset
(dataset, axis, value):
resultdataset =
for line in dataset:
if line[axis] == value:
reducevalue = line[:axis]
reducevalue.extend(line[axis+1 : ])
return resultdataset
由於有上面兩個方法作為基礎,我們可以通過下面的**來尋找最適合劃分的特徵值
def
choosebestsplitfeature
(dataset):
featurecount = len(dataset[0]) - 1
#計算當前的熵值
currentshannonent = calcshannonent(dataset)
#定義資訊增益
bestinfogain = 0.0
#定義返回值
bestaxis = -1
#遍歷每個特徵項
for i in range(featurecount):
featurevalues = set([value[i] for value in dataset])
subshannonent = 0.0
for featurevalue in featurevalues:
subdataset = splitdataset(dataset, i, featurevalues)
subdatasetprob = float(subdataset)/len(dataset)
subshannonent += subdatasetprob * calcshannonent(subdataset)
subinfogain = currentshannonent - subshannonent
#判斷當先最優的劃分特徵
if subinfogain > bestinfogain :
bestinfogain = subinfogain
bestaxis = i
return bestaxis
我們可以通過乙個map來表示我們的決策樹
def
createtree
(dataset):
classlist = [value[-1] for value in dataset]
#如果所有的classlist一致則直接返回
if classlist.count(classlist[0]) == len(classlist):
return classlist[0]
if len(dataset[0]) == 1:
##這裡的case場景是,已經沒有可用的特徵項時,針對剩餘的分類如何決定目標分類
#return dataset[0]
#這裡採用取佔比最多的值
return major(dataset)
#選擇分類屬性
axis = choosebestsplitfeature(dataset)
#定義tree樹 屬性 index->map
mytree = }
featurelist = set([value[axis] for value in dataset])
for feature in featurelist :
mytree[axis][feature] = createtree(splitdateset(dataset, axis, feature))
return mytree
#去佔比最多的分類值
defmajor
(dataset):
labelcount={}
for line in dataset:
labelcount[line[-1] = labelcount.get(line[-1], 0) + 1
#排序return sorted(labelcount.iteritems(), key = operator.itemgetter(1), reverse=true)[0][0]
決策樹構建完成之後,我們可以將決策樹序列化到乙個檔案中,以便以後直接使用,這裡就涉及到python的序列化模組pickle
import pickle
defstoretree
(mytree, filename):
fw = open(filename, 'w')
pickle.dumps(mytree, fw)
fw.close()
defreadtree
(filename):
fr = open(filename)
return pickle.load(fr)
機器學習 id3演算法與決策樹
目錄 1 id3簡介與補充 2 例項與資料視覺化 看id3演算法將近一周左右了,其實從數學過程上去理解就只那麼一天,然後從哲學源頭去理解花了一二天,最後寫成程式前前後後用時一周左右。期間還包括用二三天時間學習matplotlib,自繪決策樹,做資料視覺化。所謂,窮則獨善其身,達則兼濟天下。以後在名不...
決策樹 ID3演算法
id3演算法通過計算每個屬性的資訊增益,認為資訊增益越大屬性越優,每次劃分選取資訊增益最大的屬性為劃分標準,重複這個過程,直到構成一棵決策樹。資訊熵是描述事件給我們的驚訝程度,如果所有事件的概率均等,那熵值大,驚訝程度低。如果有一事件的概率極高而其他極低,熵值便低,驚訝程度大。其計算公式如下 資訊增...
決策樹 ID3演算法
一 決策樹基本概念 在機器學習中,決策樹是乙個 模型,它代表的是物件屬性與物件值之間的一種對映關係。本質上決策樹是通 過一系列規則對資料進行分類的過程。下圖為經典決策樹例項。如圖所示,例項是由 屬性 值 對表示的 例項是用一系列固定的屬性和他們的值構成。目標函式具有離散的輸出值 上圖給每個例項賦予乙...