亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python實(shí)現(xiàn)決策樹C4.5算法的示例

 更新時(shí)間:2018年05月30日 09:22:03   作者:WOTGL  
本篇文章主要介紹了Python實(shí)現(xiàn)決策樹C4.5算法的示例,詳解的介紹了決策樹C4.5算法的原理和實(shí)現(xiàn)代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

為什么要改進(jìn)成C4.5算法

原理

C4.5算法是在ID3算法上的一種改進(jìn),它與ID3算法最大的區(qū)別就是特征選擇上有所不同,一個(gè)是基于信息增益比,一個(gè)是基于信息增益。

之所以這樣做是因?yàn)樾畔⒃鲆鎯A向于選擇取值比較多的特征(特征越多,條件熵(特征劃分后的類別變量的熵)越小,信息增益就越大);因此在信息增益下面加一個(gè)分母,該分母是當(dāng)前所選特征的熵,注意:這里而不是類別變量的熵了。

這樣就構(gòu)成了新的特征選擇準(zhǔn)則,叫做信息增益比。為什么加了這樣一個(gè)分母就會(huì)消除ID3算法傾向于選擇取值較多的特征呢?

因?yàn)樘卣魅≈翟蕉?,該特征的熵就越大,分母也就越大,所以信息增益比就?huì)減小,而不是像信息增益那樣增大了,一定程度消除了算法對(duì)特征取值范圍的影響。

實(shí)現(xiàn)

在算法實(shí)現(xiàn)上,C4.5算法只是修改了信息增益計(jì)算的函數(shù)calcShannonEntOfFeature和最優(yōu)特征選擇函數(shù)chooseBestFeatureToSplit。

calcShannonEntOfFeature在ID3的calcShannonEnt函數(shù)上加了個(gè)參數(shù)feat,ID3中該函數(shù)只用計(jì)算類別變量的熵,而calcShannonEntOfFeature可以計(jì)算指定特征或者類別變量的熵。

chooseBestFeatureToSplit函數(shù)在計(jì)算好信息增益后,同時(shí)計(jì)算了當(dāng)前特征的熵IV,然后相除得到信息增益比,以最大信息增益比作為最優(yōu)特征。

在劃分?jǐn)?shù)據(jù)的時(shí)候,有可能出現(xiàn)特征取同一個(gè)值,那么該特征的熵為0,同時(shí)信息增益也為0(類別變量劃分前后一樣,因?yàn)樘卣髦挥幸粋€(gè)取值),0/0沒有意義,可以跳過該特征。

#coding=utf-8
import operator
from math import log
import time
import os, sys
import string

def createDataSet(trainDataFile):
 print trainDataFile
 dataSet = []
 try:
 fin = open(trainDataFile)
 for line in fin:
  line = line.strip()
  cols = line.split('\t')
  row = [cols[1], cols[2], cols[3], cols[4], cols[5], cols[6], cols[7], cols[8], cols[9], cols[10], cols[0]]
  dataSet.append(row)
  #print row
 except:
 print 'Usage xxx.py trainDataFilePath'
 sys.exit()
 labels = ['cip1', 'cip2', 'cip3', 'cip4', 'sip1', 'sip2', 'sip3', 'sip4', 'sport', 'domain']
 print 'dataSetlen', len(dataSet)
 return dataSet, labels

#calc shannon entropy of label or feature
def calcShannonEntOfFeature(dataSet, feat):
 numEntries = len(dataSet)
 labelCounts = {}
 for feaVec in dataSet:
 currentLabel = feaVec[feat]
 if currentLabel not in labelCounts:
  labelCounts[currentLabel] = 0
 labelCounts[currentLabel] += 1
 shannonEnt = 0.0
 for key in labelCounts:
 prob = float(labelCounts[key])/numEntries
 shannonEnt -= prob * log(prob, 2)
 return shannonEnt

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
 
def chooseBestFeatureToSplit(dataSet):
 numFeatures = len(dataSet[0]) - 1 #last col is label
 baseEntropy = calcShannonEntOfFeature(dataSet, -1)
 bestInfoGainRate = 0.0
 bestFeature = -1
 for i in range(numFeatures):
 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 *calcShannonEntOfFeature(subDataSet, -1) #calc conditional entropy
 infoGain = baseEntropy - newEntropy
    iv = calcShannonEntOfFeature(dataSet, i)
 if(iv == 0): #value of the feature is all same,infoGain and iv all equal 0, skip the feature
 continue
    infoGainRate = infoGain / iv
 if infoGainRate > bestInfoGainRate:
  bestInfoGainRate = infoGainRate
  bestFeature = i
 return bestFeature
  
#feature is exhaustive, reture what you want label
def majorityCnt(classList):
 classCount = {}
 for vote in classList:
 if vote not in classCount.keys():
  classCount[vote] = 0
 classCount[vote] += 1
 return max(classCount)  
 
def createTree(dataSet, labels):
 classList = [example[-1] for example in dataSet]
 if classList.count(classList[0]) ==len(classList): #all data is the same label
 return classList[0]
 if len(dataSet[0]) == 1: #all feature is exhaustive
 return majorityCnt(classList)
 bestFeat = chooseBestFeatureToSplit(dataSet)
 bestFeatLabel = labels[bestFeat]
 if(bestFeat == -1): #特征一樣,但類別不一樣,即類別與特征不相關(guān),隨機(jī)選第一個(gè)類別做分類結(jié)果
 return classList[0] 
 myTree = {bestFeatLabel:{}}
 del(labels[bestFeat])
 featValues = [example[bestFeat] for example in dataSet]
 uniqueVals = set(featValues)
 for value in uniqueVals:
 subLabels = labels[:]
 myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
 return myTree
 
def main():
 if(len(sys.argv) < 3):
 print 'Usage xxx.py trainSet outputTreeFile'
 sys.exit()
 data,label = createDataSet(sys.argv[1])
 t1 = time.clock()
 myTree = createTree(data,label)
 t2 = time.clock()
 fout = open(sys.argv[2], 'w')
 fout.write(str(myTree))
 fout.close()
 print 'execute for ',t2-t1
if __name__=='__main__':
 main()

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python基于百度API識(shí)別并提取圖片中文字

    Python基于百度API識(shí)別并提取圖片中文字

    本文主要實(shí)現(xiàn)了利用百度 AI 開發(fā)平臺(tái)的 OCR 文字識(shí)別 API 識(shí)別并提取圖片中的文字。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Python實(shí)現(xiàn)的遠(yuǎn)程文件自動(dòng)打包并下載功能示例

    Python實(shí)現(xiàn)的遠(yuǎn)程文件自動(dòng)打包并下載功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的遠(yuǎn)程文件自動(dòng)打包并下載功能,結(jié)合實(shí)例形式分析了Python使用spawn()方法執(zhí)行ssh、scp 命令實(shí)現(xiàn)遠(yuǎn)程文件的相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • 通過python在PDF中添加條形碼和二維碼的代碼詳解

    通過python在PDF中添加條形碼和二維碼的代碼詳解

    在PDF中添加條碼是一個(gè)常見需求,特別是在需要自動(dòng)化處理、跟蹤或檢索PDF文件時(shí),作為一種機(jī)器可讀的標(biāo)識(shí)符,PDF中的條碼可以包含各種類型的信息,本文介紹了如何使用Python在PDF中添加條形碼或二維碼,需要的朋友可以參考下
    2024-08-08
  • 通俗講解Python中的五種下劃線含義

    通俗講解Python中的五種下劃線含義

    在Python中,下劃線(_)是特殊的,如果您是python程序員,對(duì)于for _ in range(10),以及__init__(self)的語法可能比較熟悉,這篇文章主要給大家介紹了關(guān)于Python中五種下劃線的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • python利用cv2庫讀取和保存視頻的操作步驟

    python利用cv2庫讀取和保存視頻的操作步驟

    這篇文章主要介紹了python利用cv2庫讀取和保存視頻的操作步驟,文中通過代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • Python通過Socket手動(dòng)實(shí)現(xiàn)HTTP協(xié)議

    Python通過Socket手動(dòng)實(shí)現(xiàn)HTTP協(xié)議

    這篇文章主要為大家詳細(xì)介紹了Python如何通過Socket手動(dòng)實(shí)現(xiàn)HTTP協(xié)議,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一
    2024-03-03
  • Python?Matplotlib通過plt.subplots創(chuàng)建子繪圖

    Python?Matplotlib通過plt.subplots創(chuàng)建子繪圖

    這篇文章主要介紹了Python?Matplotlib通過plt.subplots創(chuàng)建子繪圖,plt.subplots調(diào)用后將會(huì)產(chǎn)生一個(gè)圖表和默認(rèn)網(wǎng)格,與此同時(shí)提供一個(gè)合理的控制策略布局子繪圖,更多相關(guān)需要的朋友可以參考下面文章內(nèi)容
    2022-07-07
  • Python實(shí)現(xiàn)抓取網(wǎng)頁并且解析的實(shí)例

    Python實(shí)現(xiàn)抓取網(wǎng)頁并且解析的實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)抓取網(wǎng)頁并且解析的功能實(shí)例,主要以解析百度問答為例說明其原理與方法,需要的朋友可以參考下
    2014-09-09
  • Python利用capstone實(shí)現(xiàn)反匯編

    Python利用capstone實(shí)現(xiàn)反匯編

    Capstone是一個(gè)輕量級(jí)的多平臺(tái)、多架構(gòu)的反匯編框架,該模塊支持目前所有通用操作系統(tǒng),反匯編架構(gòu)幾乎全部支持。本文就將利用他實(shí)現(xiàn)反匯編,感興趣的可以了解下
    2022-04-04
  • python_array[0][0]與array[0,0]的區(qū)別詳解

    python_array[0][0]與array[0,0]的區(qū)別詳解

    今天小編就為大家分享一篇python_array[0][0]與array[0,0]的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評(píng)論