国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

機器學習python實戰之決策樹

2020-02-16 10:33:47
字體:
來源:轉載
供稿:網友

決策樹原理:從數據集中找出決定性的特征對數據集進行迭代劃分,直到某個分支下的數據都屬于同一類型,或者已經遍歷了所有劃分數據集的特征,停止決策樹算法。

  每次劃分數據集的特征都有很多,那么我們怎么來選擇到底根據哪一個特征劃分數據集呢?這里我們需要引入信息增益和信息熵的概念。

一、信息增益

  劃分數據集的原則是:將無序的數據變的有序。在劃分數據集之前之后信息發生的變化稱為信息增益。知道如何計算信息增益,我們就可以計算根據每個特征劃分數據集獲得的信息增益,選擇信息增益最高的特征就是最好的選擇。首先我們先來明確一下信息的定義:符號xi的信息定義為 l(xi)=-log2 p(xi),p(xi)為選擇該類的概率。那么信息源的熵H=-∑p(xi)·log2 p(xi)。根據這個公式我們下面編寫代碼計算香農熵

def calcShannonEnt(dataSet): NumEntries = len(dataSet) labelsCount = {} for i in dataSet:  currentlabel = i[-1]  if currentlabel not in labelsCount.keys():   labelsCount[currentlabel]=0  labelsCount[currentlabel]+=1 ShannonEnt = 0.0 for key in labelsCount:  prob = labelsCount[key]/NumEntries  ShannonEnt -= prob*log(prob,2) return ShannonEnt

上面的自定義函數我們需要在之前導入log方法,from math import log。 我們可以先用一個簡單的例子來測試一下

def createdataSet(): #dataSet = [['1','1','yes'],['1','0','no'],['0','1','no'],['0','0','no']] dataSet = [[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,0,'no']] labels = ['no surfacing','flippers'] return dataSet,labels

這里的熵為0.811,當我們增加數據的類別時,熵會增加。這里更改后的數據集的類別有三種‘yes'、‘no'、‘maybe',也就是說數據越混亂,熵就越大。

分類算法出了需要計算信息熵,還需要劃分數據集。決策樹算法中我們對根據每個特征劃分的數據集計算一次熵,然后判斷按照哪個特征劃分是最好的劃分方式。

def splitDataSet(dataSet,axis,value): retDataSet = [] for featVec in dataSet:  if featVec[axis] == value:   reducedfeatVec = featVec[:axis]   reducedfeatVec.extend(featVec[axis+1:])   retDataSet.append(reducedfeatVec) return retDataSet

axis表示劃分數據集的特征,value表示特征的返回值。這里需要注意extend方法和append方法的區別。舉例來說明這個區別

下面我們測試一下劃分數據集函數的結果:

axis=0,value=1,按myDat數據集的第0個特征向量是否等于1進行劃分。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 自治县| 耒阳市| 蒙城县| 东平县| 托克托县| 芒康县| 翼城县| 安庆市| 平顶山市| 忻城县| 石嘴山市| 客服| 筠连县| 明溪县| 无为县| 隆子县| 禹城市| 潞西市| 亳州市| 临海市| 罗江县| 天水市| 鄂尔多斯市| 永德县| 白沙| 迁安市| 保亭| 祁东县| 潞城市| 长汀县| 汉川市| 石棉县| 城口县| 信丰县| 鹤岗市| 万源市| 徐汇区| 海门市| 东乌珠穆沁旗| 萨嘎县| 福鼎市|