欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實現(xiàn)決策樹C4.5算法詳解(在ID3基礎(chǔ)上改進)

 更新時間:2017年05月31日 08:47:23   投稿:jingxian  
下面小編就為大家?guī)硪黄猵ython實現(xiàn)決策樹C4.5算法詳解(在ID3基礎(chǔ)上改進)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、概論

C4.5主要是在ID3的基礎(chǔ)上改進,ID3選擇(屬性)樹節(jié)點是選擇信息增益值最大的屬性作為節(jié)點。而C4.5引入了新概念“信息增益率”,C4.5是選擇信息增益率最大的屬性作為樹節(jié)點。

二、信息增益

以上公式是求信息增益率(ID3的知識點)

三、信息增益率

信息增益率是在求出信息增益值在除以。

例如下面公式為求屬性為“outlook”的值:

四、C4.5的完整代碼

from numpy import *
from scipy import *
from math import log
import operator

#計算給定數(shù)據(jù)的香濃熵:
def calcShannonEnt(dataSet):
 numEntries = len(dataSet) 
 labelCounts = {} #類別字典(類別的名稱為鍵,該類別的個數(shù)為值)
 for featVec in dataSet:
  currentLabel = featVec[-1] 
  if currentLabel not in labelCounts.keys(): #還沒添加到字典里的類型
   labelCounts[currentLabel] = 0;
  labelCounts[currentLabel] += 1;
 shannonEnt = 0.0 
 for key in labelCounts: #求出每種類型的熵
  prob = float(labelCounts[key])/numEntries #每種類型個數(shù)占所有的比值
  shannonEnt -= prob * log(prob, 2)
 return shannonEnt; #返回熵

#按照給定的特征劃分?jǐn)?shù)據(jù)集
def splitDataSet(dataSet, axis, value):
 retDataSet = [] 
 for featVec in dataSet: #按dataSet矩陣中的第axis列的值等于value的分?jǐn)?shù)據(jù)集
  if featVec[axis] == value:  #值等于value的,每一行為新的列表(去除第axis個數(shù)據(jù))
   reducedFeatVec = featVec[:axis]
   reducedFeatVec.extend(featVec[axis+1:]) 
   retDataSet.append(reducedFeatVec) 
 return retDataSet #返回分類后的新矩陣

#選擇最好的數(shù)據(jù)集劃分方式
def chooseBestFeatureToSplit(dataSet): 
 numFeatures = len(dataSet[0])-1 #求屬性的個數(shù)
 baseEntropy = calcShannonEnt(dataSet)
 bestInfoGain = 0.0; bestFeature = -1 
 for i in range(numFeatures): #求所有屬性的信息增益
  featList = [example[i] for example in dataSet] 
  uniqueVals = set(featList) #第i列屬性的取值(不同值)數(shù)集合
  newEntropy = 0.0 
  splitInfo = 0.0;
  for value in uniqueVals: #求第i列屬性每個不同值的熵*他們的概率
   subDataSet = splitDataSet(dataSet, i , value) 
   prob = len(subDataSet)/float(len(dataSet)) #求出該值在i列屬性中的概率
   newEntropy += prob * calcShannonEnt(subDataSet) #求i列屬性各值對于的熵求和
   splitInfo -= prob * log(prob, 2);
  infoGain = (baseEntropy - newEntropy) / splitInfo; #求出第i列屬性的信息增益率
  print infoGain; 
  if(infoGain > bestInfoGain): #保存信息增益率最大的信息增益率值以及所在的下表(列值i)
   bestInfoGain = infoGain 
   bestFeature = i 
 return bestFeature 

#找出出現(xiàn)次數(shù)最多的分類名稱
def majorityCnt(classList): 
 classCount = {} 
 for vote in classList: 
  if vote not in classCount.keys(): classCount[vote] = 0 
  classCount[vote] += 1 
 sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True)
 return sortedClassCount[0][0] 

#創(chuàng)建樹
def createTree(dataSet, labels): 
 classList = [example[-1] for example in dataSet]; #創(chuàng)建需要創(chuàng)建樹的訓(xùn)練數(shù)據(jù)的結(jié)果列表(例如最外層的列表是[N, N, Y, Y, Y, N, Y])
 if classList.count(classList[0]) == len(classList): #如果所有的訓(xùn)練數(shù)據(jù)都是屬于一個類別,則返回該類別
  return classList[0]; 
 if (len(dataSet[0]) == 1): #訓(xùn)練數(shù)據(jù)只給出類別數(shù)據(jù)(沒給任何屬性值數(shù)據(jù)),返回出現(xiàn)次數(shù)最多的分類名稱
  return majorityCnt(classList);

 bestFeat = chooseBestFeatureToSplit(dataSet); #選擇信息增益最大的屬性進行分(返回值是屬性類型列表的下標(biāo))
 bestFeatLabel = labels[bestFeat] #根據(jù)下表找屬性名稱當(dāng)樹的根節(jié)點
 myTree = {bestFeatLabel:{}} #以bestFeatLabel為根節(jié)點建一個空樹
 del(labels[bestFeat]) #從屬性列表中刪掉已經(jīng)被選出來當(dāng)根節(jié)點的屬性
 featValues = [example[bestFeat] for example in dataSet] #找出該屬性所有訓(xùn)練數(shù)據(jù)的值(創(chuàng)建列表)
 uniqueVals = set(featValues) #求出該屬性的所有值得集合(集合的元素不能重復(fù))
 for value in uniqueVals: #根據(jù)該屬性的值求樹的各個分支
  subLabels = labels[:] 
  myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels) #根據(jù)各個分支遞歸創(chuàng)建樹
 return myTree #生成的樹

#實用決策樹進行分類
def classify(inputTree, featLabels, testVec): 
 firstStr = inputTree.keys()[0] 
 secondDict = inputTree[firstStr] 
 featIndex = featLabels.index(firstStr) 
 for key in secondDict.keys(): 
  if testVec[featIndex] == key: 
   if type(secondDict[key]).__name__ == 'dict': 
    classLabel = classify(secondDict[key], featLabels, testVec) 
   else: classLabel = secondDict[key] 
 return classLabel 

#讀取數(shù)據(jù)文檔中的訓(xùn)練數(shù)據(jù)(生成二維列表)
def createTrainData():
 lines_set = open('../data/ID3/Dataset.txt').readlines()
 labelLine = lines_set[2];
 labels = labelLine.strip().split()
 lines_set = lines_set[4:11]
 dataSet = [];
 for line in lines_set:
  data = line.split();
  dataSet.append(data);
 return dataSet, labels


#讀取數(shù)據(jù)文檔中的測試數(shù)據(jù)(生成二維列表)
def createTestData():
 lines_set = open('../data/ID3/Dataset.txt').readlines()
 lines_set = lines_set[15:22]
 dataSet = [];
 for line in lines_set:
  data = line.strip().split();
  dataSet.append(data);
 return dataSet

myDat, labels = createTrainData() 
myTree = createTree(myDat,labels) 
print myTree
bootList = ['outlook','temperature', 'humidity', 'windy'];
testList = createTestData();
for testData in testList:
 dic = classify(myTree, bootList, testData)
 print dic

五、C4.5與ID3的代碼區(qū)別

如上圖,C4.5主要在第52、53行代碼與ID3不同(ID3求的是信息增益,C4.5求的是信息增益率)。

六、訓(xùn)練、測試數(shù)據(jù)集樣例

訓(xùn)練集:

 outlook temperature humidity windy 
 ---------------------------------------------------------
 sunny  hot    high   false   N
 sunny  hot    high   true   N
 overcast hot    high   false   Y
 rain  mild   high   false   Y
 rain  cool   normal  false   Y
 rain  cool   normal  true   N
 overcast cool   normal  true   Y

測試集
 outlook temperature humidity windy 
 -----------------------------------------------  
 sunny  mild   high   false   
 sunny  cool   normal  false   
 rain   mild   normal  false  
 sunny  mild   normal  true   
 overcast mild   high   true   
 overcast hot    normal  false   
 rain   mild   high   true  

以上這篇python實現(xiàn)決策樹C4.5算法詳解(在ID3基礎(chǔ)上改進)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python3爬蟲中關(guān)于Ajax分析方法的總結(jié)

    Python3爬蟲中關(guān)于Ajax分析方法的總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于Python3爬蟲中關(guān)于Ajax分析方法的總結(jié),需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • python 刪除指定時間間隔之前的文件實例

    python 刪除指定時間間隔之前的文件實例

    下面小編就為大家分享一篇python 刪除指定時間間隔之前的文件實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Pytorch如何加載部分權(quán)重

    Pytorch如何加載部分權(quán)重

    這篇文章主要介紹了Pytorch如何加載部分權(quán)重問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 虛擬環(huán)境及venv和virtualenv的區(qū)別說明

    虛擬環(huán)境及venv和virtualenv的區(qū)別說明

    這篇文章主要介紹了虛擬環(huán)境及venv和virtualenv的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Pytorch固定隨機數(shù)種子的方法小結(jié)

    Pytorch固定隨機數(shù)種子的方法小結(jié)

    在對神經(jīng)網(wǎng)絡(luò)模型進行訓(xùn)練時,有時候會存在對訓(xùn)練過程進行復(fù)現(xiàn)的需求,然而,每次運行時 Pytorch、Numpy 中的隨機性將使得該目的變得困難重重,基于此,本文記錄了 Pytorch 中的固定隨機數(shù)種子的方法,需要的朋友可以參考下
    2023-12-12
  • Python淺析迭代器Iterator的使用

    Python淺析迭代器Iterator的使用

    這篇文章主要介紹了Python?迭代器Iterator詳情,迭代器可以幫助我們解決面對復(fù)雜的數(shù)據(jù)場景時,快速簡便的獲取數(shù)據(jù),下文關(guān)于其詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-07-07
  • 解決python通過cx_Oracle模塊連接Oracle亂碼的問題

    解決python通過cx_Oracle模塊連接Oracle亂碼的問題

    今天小編就為大家分享一篇解決python通過cx_Oracle模塊連接Oracle亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python實現(xiàn)提取jira bug列表的方法示例

    python實現(xiàn)提取jira bug列表的方法示例

    公司要求內(nèi)部每日整理jira bug發(fā)郵件,手動執(zhí)行了一段時間,想著用自動化的方式實現(xiàn),所以本文主要介紹了python實現(xiàn)提取jira bug列表,感興趣的可以了解一下
    2021-05-05
  • Python wordcloud庫安裝方法

    Python wordcloud庫安裝方法

    Wordcloud庫的基本使用非常簡單,只需要導(dǎo)入庫并調(diào)用WordCloud類即可,這篇文章主要介紹了Python wordcloud庫,需要的朋友可以參考下
    2024-01-01
  • Python的Django框架中模板碎片緩存簡介

    Python的Django框架中模板碎片緩存簡介

    這篇文章主要介紹了Python的Django框架中模板碎片緩存,包括給cache標(biāo)簽傳遞參數(shù)等方法,需要的朋友可以參考下
    2015-07-07

最新評論