摘要:前言決策樹算法,是指一類通過對數(shù)據(jù)集中特征的選擇,構造一個樹,實現(xiàn)對數(shù)據(jù)的分類的算法。算法首先,讓我們以例子來看看算法的實現(xiàn)過程。假設我們現(xiàn)在要做一次決策判斷一個人會買什么類型的保險。個人理解信息熵就是描述給出的這組數(shù)據(jù)的分類有多不確定。
前言
決策樹算法,是指一類通過對數(shù)據(jù)集中特征的選擇,構造一個樹,實現(xiàn)對數(shù)據(jù)的分類的算法。 這棵樹的每一個節(jié)點都是選中的其中一種特征,而該節(jié)點的邊則是這種特征的分類。 更詳細的定義可以Google之。ID3算法
首先,讓我們以例子來看看ID3算法的實現(xiàn)過程。
假設我們現(xiàn)在要做一次決策:判斷一個人會買什么類型的保險。在這個例子中有如下特征:
性別(男、女)
年齡(<21、>=21and=<25、>25)
婚姻狀況(已婚、未婚)
而根據(jù)這些特征,我們會有最終每個人購買的保險類型(A、B、C),以下給出數(shù)據(jù):
接下來,ID3算法根據(jù)每個特征的重要程度(該值通過信息熵來判斷,但是信息熵這個概念等下具體實現(xiàn)時候再說XD),構造如下的一個樹:
對于如上格式的每個樣例,首先判斷性別(男或女),如果是男的,就需要用婚姻狀況來判斷;如果是女的,則需要用年齡來判斷。這樣迭代判斷直到到達葉子節(jié)點,也就得出了可能選擇的保險類型。
那么,此時重點來了,我們該如何判斷選擇哪個特征最合適呢??
實現(xiàn)經(jīng)過許多大神的不懈研究,借鑒了物理學上的熵的概念,信息領域提出了如下幾個定義:
信息熵(Entropy)
用于描述一組數(shù)據(jù)的混亂、不確定程度 計算公式如下:
用上述例子來說,p(Xi)指所有數(shù)據(jù)中A、B、C這三個各自出現(xiàn)的概率,就是A、B、C各自的個數(shù)/總個數(shù)。
個人理解信息熵就是描述給出的這組數(shù)據(jù)的分類有多不確定。就比如預測明天下不下雨這一問題,信息熵就很大;而預測每一個人明天吃不吃飯這一問題,信息熵就很小。因為絕大部分人,明天肯定是要吃飯的orz。。。。
條件熵
用于描述一組數(shù)據(jù)的子數(shù)據(jù)的混亂、不確定程度
這是什么意思呢?個人理解就是確定數(shù)據(jù)的某一特征之后,在這一特征上的數(shù)據(jù)分類的不確定程度。比如依舊是預測明天下不下雨這一問題,如果現(xiàn)在明確告訴你,明天云的情況(多云、少云、沒有云),那么在明天云情況這一特征上的每個分類都能計算相應的信息熵。
信息增益
用于描述某一特征對整體的重要程度 根據(jù)定義,可以知道,信息增益就是總信息熵減去某個特征上各個分類的條件熵,如下:
1、被減數(shù)就是總信息熵。
2、減數(shù)中的value(T)是指在某一個特征的一種分類,如性別就包含兩個分類(男、女),entropy(Sv)就是在該特征的某個分類上的條件熵。
3、S是指所有數(shù)據(jù)個數(shù)
4、Sv是指在該特征的一種分類下數(shù)據(jù)個數(shù)。
在了解了這些定義后,我們回到最開始的問題:如何判斷哪個特征最合適你?
上面說到,信息熵越大,數(shù)據(jù)集就越混亂,就越難得到準確的結果,所以我們要選擇的特征應該能使得在 確定這個特征后的信息熵越小,也就是條件熵越小,亦即信息增益最大。 因此,具體實現(xiàn)思路如下: **遍歷所有特征,根據(jù)遍歷的每個特征進行數(shù)據(jù)集分類,算出每個特征下的條件熵,然后取條件熵最小 的,信息增益最大的特征。接著,根據(jù)選擇的特征進行分類,得到的子數(shù)據(jù)在刪除選擇的特征后,遞歸 選擇下一個特征**代碼
#coding=utf-8 import csv import pandas as pd import math import drewTree def readData(path): df=pd.read_csv(path) return df.values.tolist(),df.columns.values.tolist() #計算信息熵 def countEntropy(data): sumEg=len(data) labelCount={} #計算不同保險類別的數(shù)量 for example in data: if example[-1] not in labelCount.keys(): labelCount[example[-1]]=0 labelCount[example[-1]]+=1 #開始計算信息熵 ent=0 for key in labelCount: prop=float(labelCount[key])/sumEg ent-=prop*math.log(prop,2) return ent #根據(jù)特征分類劃分數(shù)據(jù)集 def splitData(data,featureNum): res={} for example in data: if example[featureNum] not in res.keys(): res[example[featureNum]]=[] res[example[featureNum]].append(example) return res #移除數(shù)據(jù)中已經(jīng)選擇的特征值 def removeFeature(data,featureNum): res=[] for example in data: example.pop(featureNum) res.append(example) return res #單特征投票 #當所有特征都選擇完時,還有多于1個以上的樣例,則直接根據(jù)保險類型投票,票高者得勝 def vote(classData): count={} for example in classData: if example not in count.keys(): count[example]=0 count[example]+=1 return max(count) #選擇信息增益最大的特征 def selectBestFeature(data,dataLabel): sumEnt=countEntropy(data) sumFeatureNum=len(data[0])-1 minConditionEnt = 999999 bestFeature = [] bfNum = -2 #計算每個特征的信息增益 for i in range(sumFeatureNum): spData=splitData(data,i) num=len(data) conditionEnt=0 for key in spData: conditionEnt+=float(len(spData[key]))/num*countEntropy(spData[key]) if (conditionEnt < minConditionEnt): minConditionEnt = conditionEnt bestFeature =dataLabel[i] bfNum=i return bestFeature,bfNum def createTree(data,dataLabel): #只剩保險類型時,根據(jù)剩余的數(shù)據(jù)集進行投票 if len(data[0])==1: return vote(example[-1] for example in data) bestFeature,bfNum=selectBestFeature(data,dataLabel) dicisionTree={bestFeature:{}} bestFeatureData=splitData(data,bfNum) label=dataLabel temp=label.pop(bfNum) #剩余特征進行遞歸構造決策樹 for key in bestFeatureData: rmFData=removeFeature(bestFeatureData[key],bfNum) dicisionTree[bestFeature][key]=createTree(rmFData,label) label.insert(bfNum,temp) return dicisionTree #調(diào)用 data,dataLabel=readData("./ID3New.csv") res=createTree(data,dataLabel)
參考博客:http://blog.csdn.net/wzmsltw/...
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/41072.html
摘要:后剪枝先創(chuàng)建完整的決策樹,然后再嘗試消除多余的節(jié)點,也就是采用減枝的方法。 起步 決策樹(decision tree)是一個樹結構,可以是二叉樹或非二叉樹,也可以把他看作是 if-else 規(guī)則的集合,也可以認為是在特征空間上的條件概率分布。 決策樹的結構 以一個簡單的用于是否買電腦預測的決策樹為例子: showImg(https://segmentfault.com/img/remo...
摘要:根據(jù)這個訓練集,運用樸素貝葉斯分類和決策樹分類則可以得到一個數(shù)據(jù)模型,然后通過輸入一條測試數(shù)據(jù)來判斷是否回去打網(wǎng)球。一樸素貝葉斯分類大學概率論的貝葉斯定理實現(xiàn)了通過計算概率求出假設推理的結論。 今年畢業(yè)時的畢設是有關大數(shù)據(jù)及機器學習的題目。因為那個時間已經(jīng)步入前端的行業(yè)自然選擇使用JavaScript來實現(xiàn)其中具體的算法。雖然JavaScript不是做大數(shù)據(jù)處理的最佳語言,相比還沒有優(yōu)...
閱讀 1680·2021-10-13 09:39
閱讀 2113·2021-09-07 10:20
閱讀 2698·2019-08-30 15:56
閱讀 2960·2019-08-30 15:56
閱讀 944·2019-08-30 15:55
閱讀 645·2019-08-30 15:46
閱讀 3507·2019-08-30 15:44
閱讀 2567·2019-08-30 11:15