最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python機(jī)器學(xué)習(xí)之決策樹算法實(shí)例詳解

 更新時(shí)間:2017年12月06日 11:45:27   作者:candice廷  
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)之決策樹算法,較為詳細(xì)的分析了實(shí)例詳解機(jī)器學(xué)習(xí)中決策樹算法的概念、原理及相關(guān)Python實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了Python機(jī)器學(xué)習(xí)之決策樹算法。分享給大家供大家參考,具體如下:

決策樹學(xué)習(xí)是應(yīng)用最廣泛的歸納推理算法之一,是一種逼近離散值目標(biāo)函數(shù)的方法,在這種方法中學(xué)習(xí)到的函數(shù)被表示為一棵決策樹。決策樹可以使用不熟悉的數(shù)據(jù)集合,并從中提取出一系列規(guī)則,機(jī)器學(xué)習(xí)算法最終將使用這些從數(shù)據(jù)集中創(chuàng)造的規(guī)則。決策樹的優(yōu)點(diǎn)為:計(jì)算復(fù)雜度不高,輸出結(jié)果易于理解,對(duì)中間值的缺失不敏感,可以處理不相關(guān)特征數(shù)據(jù)。缺點(diǎn)為:可能產(chǎn)生過度匹配的問題。決策樹適于處理離散型和連續(xù)型的數(shù)據(jù)。

在決策樹中最重要的就是如何選取用于劃分的特征

在算法中一般選用ID3,D3算法的核心問題是選取在樹的每個(gè)節(jié)點(diǎn)要測試的特征或者屬性,希望選擇的是最有助于分類實(shí)例的屬性。如何定量地衡量一個(gè)屬性的價(jià)值呢?這里需要引入熵和信息增益的概念。熵是信息論中廣泛使用的一個(gè)度量標(biāo)準(zhǔn),刻畫了任意樣本集的純度。

假設(shè)有10個(gè)訓(xùn)練樣本,其中6個(gè)的分類標(biāo)簽為yes,4個(gè)的分類標(biāo)簽為no,那熵是多少呢?在該例子中,分類的數(shù)目為2(yes,no),yes的概率為0.6,no的概率為0.4,則熵為 :

其中value(A)是屬性A所有可能值的集合,是S中屬性A的值為v的子集,即。上述公式的第一項(xiàng)為原集合S的熵,第二項(xiàng)是用A分類S后熵的期望值,該項(xiàng)描述的期望熵就是每個(gè)子集的熵的加權(quán)和,權(quán)值為屬于的樣本占原始樣本S的比例。所以Gain(S, A)是由于知道屬性A的值而導(dǎo)致的期望熵減少。

完整的代碼:

# -*- coding: cp936 -*-
from numpy import *
import operator
from math import log
import operator
def createDataSet():
  dataSet = [[1,1,'yes'],
    [1,1,'yes'],
    [1,0,'no'],
    [0,1,'no'],
    [0,1,'no']]
  labels = ['no surfacing','flippers']
  return dataSet, labels
def calcShannonEnt(dataSet):
  numEntries = len(dataSet)
  labelCounts = {} # a dictionary for feature
  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:
    #print(key)
    #print(labelCounts[key])
    prob = float(labelCounts[key])/numEntries
    #print(prob)
    shannonEnt -= prob * log(prob,2)
  return shannonEnt
#按照給定的特征劃分?jǐn)?shù)據(jù)集
#根據(jù)axis等于value的特征將數(shù)據(jù)提出
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
#選取特征,劃分?jǐn)?shù)據(jù)集,計(jì)算得出最好的劃分?jǐn)?shù)據(jù)集的特征
def chooseBestFeatureToSplit(dataSet):
  numFeatures = len(dataSet[0]) - 1 #剩下的是特征的個(gè)數(shù)
  baseEntropy = calcShannonEnt(dataSet)#計(jì)算數(shù)據(jù)集的熵,放到baseEntropy中
  bestInfoGain = 0.0;bestFeature = -1 #初始化熵增益
  for i in range(numFeatures):
    featList = [example[i] for example in dataSet] #featList存儲(chǔ)對(duì)應(yīng)特征所有可能得取值
    uniqueVals = set(featList)
    newEntropy = 0.0
    for value in uniqueVals:#下面是計(jì)算每種劃分方式的信息熵,特征i個(gè),每個(gè)特征value個(gè)值
      subDataSet = splitDataSet(dataSet, i ,value)
      prob = len(subDataSet)/float(len(dataSet)) #特征樣本在總樣本中的權(quán)重
      newEntropy = prob * calcShannonEnt(subDataSet)
    infoGain = baseEntropy - newEntropy #計(jì)算i個(gè)特征的信息熵
    #print(i)
    #print(infoGain)
    if(infoGain > bestInfoGain):
      bestInfoGain = infoGain
      bestFeature = i
  return bestFeature
#如上面是決策樹所有的功能模塊
#得到原始數(shù)據(jù)集之后基于最好的屬性值進(jìn)行劃分,每一次劃分之后傳遞到樹分支的下一個(gè)節(jié)點(diǎn)
#遞歸結(jié)束的條件是程序遍歷完成所有的數(shù)據(jù)集屬性,或者是每一個(gè)分支下的所有實(shí)例都具有相同的分類
#如果所有實(shí)例具有相同的分類,則得到一個(gè)葉子節(jié)點(diǎn)或者終止快
#如果所有屬性都已經(jīng)被處理,但是類標(biāo)簽依然不是確定的,那么采用多數(shù)投票的方式
#返回出現(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]#將最后一行的數(shù)據(jù)放到classList中,所有的類別的值
  if classList.count(classList[0]) == len(classList): #類別完全相同不需要再劃分
    return classList[0]
  if len(dataSet[0]) == 1:#這里為什么是1呢?就是說特征數(shù)為1的時(shí)候
    return majorityCnt(classList)#就返回這個(gè)特征就行了,因?yàn)榫瓦@一個(gè)特征
  bestFeat = chooseBestFeatureToSplit(dataSet)
  print('the bestFeatue in creating is :')
  print(bestFeat)
  bestFeatLabel = labels[bestFeat]#運(yùn)行結(jié)果'no surfacing'
  myTree = {bestFeatLabel:{}}#嵌套字典,目前value是一個(gè)空字典
  del(labels[bestFeat])
  featValues = [example[bestFeat] for example in dataSet]#第0個(gè)特征對(duì)應(yīng)的取值
  uniqueVals = set(featValues)
  for value in uniqueVals: #根據(jù)當(dāng)前特征值的取值進(jìn)行下一級(jí)的劃分
    subLabels = labels[:]
    myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
  return myTree
#對(duì)上面簡單的數(shù)據(jù)進(jìn)行小測試
def testTree1():
  myDat,labels=createDataSet()
  val = calcShannonEnt(myDat)
  print 'The classify accuracy is: %.2f%%' % val
  retDataSet1 = splitDataSet(myDat,0,1)
  print (myDat)
  print(retDataSet1)
  retDataSet0 = splitDataSet(myDat,0,0)
  print (myDat)
  print(retDataSet0)
  bestfeature = chooseBestFeatureToSplit(myDat)
  print('the bestFeatue is :')
  print(bestfeature)
  tree = createTree(myDat,labels)
  print(tree)

對(duì)應(yīng)的結(jié)果是:

>>> import TREE
>>> TREE.testTree1()
The classify accuracy is: 0.97%
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
[[1, 'yes'], [1, 'yes'], [0, 'no']]
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
[[1, 'no'], [1, 'no']]
the bestFeatue is :
0
the bestFeatue in creating is :
0
the bestFeatue in creating is :
0
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

最好再增加使用決策樹的分類函數(shù)

同時(shí)因?yàn)闃?gòu)建決策樹是非常耗時(shí)間的,因?yàn)樽詈檬菍?gòu)建好的樹通過 python 的 pickle 序列化對(duì)象,將對(duì)象保存在磁盤上,等到需要用的時(shí)候再讀出

def classify(inputTree,featLabels,testVec):
  firstStr = inputTree.keys()[0]
  secondDict = inputTree[firstStr]
  featIndex = featLabels.index(firstStr)
  key = testVec[featIndex]
  valueOfFeat = secondDict[key]
  if isinstance(valueOfFeat, dict):
    classLabel = classify(valueOfFeat, featLabels, testVec)
  else: classLabel = valueOfFeat
  return classLabel
def storeTree(inputTree,filename):
  import pickle
  fw = open(filename,'w')
  pickle.dump(inputTree,fw)
  fw.close()
def grabTree(filename):
  import pickle
  fr = open(filename)
  return pickle.load(fr)

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 深入理解Python內(nèi)置函數(shù)map filter reduce及與列表推導(dǎo)式對(duì)比

    深入理解Python內(nèi)置函數(shù)map filter reduce及與列表推導(dǎo)式對(duì)比

    這篇文章主要為大家介紹了Python內(nèi)置函數(shù)map filter reduce及與列表推導(dǎo)式對(duì)比方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Python光學(xué)仿真理解Jones矩陣學(xué)習(xí)

    Python光學(xué)仿真理解Jones矩陣學(xué)習(xí)

    這篇文章主要為大家介紹了Python光學(xué)仿真理解Jones矩陣的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • 在Python中采集Prometheus數(shù)據(jù)的詳細(xì)用法教程

    在Python中采集Prometheus數(shù)據(jù)的詳細(xì)用法教程

    Prometheus是一個(gè)開源的監(jiān)控和警報(bào)工具,專門用于記錄和查詢時(shí)間序列數(shù)據(jù),它提供了一個(gè)強(qiáng)大的查詢語言PromQL(Prometheus Query Language),允許用戶根據(jù)不同的標(biāo)簽和指標(biāo)選擇特定的時(shí)間序列數(shù)據(jù),本文將詳細(xì)介紹如何在Python中采集Prometheus數(shù)據(jù)
    2024-07-07
  • 基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析

    基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析

    這篇文章主要介紹了基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 舉例詳解Python中循環(huán)語句的嵌套使用

    舉例詳解Python中循環(huán)語句的嵌套使用

    這篇文章主要介紹了舉例詳解Python中循環(huán)語句的嵌套使用,是Python入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Python生成器實(shí)現(xiàn)簡單

    Python生成器實(shí)現(xiàn)簡單"生產(chǎn)者消費(fèi)者"模型代碼實(shí)例

    這篇文章主要介紹了Python生成器實(shí)現(xiàn)簡單"生產(chǎn)者消費(fèi)者"模型代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • PyCharm2019 安裝和配置教程詳解附激活碼

    PyCharm2019 安裝和配置教程詳解附激活碼

    這篇文章主要介紹了PyCharm2019 安裝和配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • python魔法方法之__setattr__()

    python魔法方法之__setattr__()

    這篇文章主要介紹了python魔法方法之__setattr__(),python提供了諸多的魔法方法,其中__setattr__()方法主要用于類實(shí)例進(jìn)行屬性賦值,接下來請(qǐng)和小編一起進(jìn)入文章來了解更多相關(guān)內(nèi)容吧
    2022-03-03
  • Python pass函數(shù)實(shí)例用法

    Python pass函數(shù)實(shí)例用法

    在本篇文章里小編給大家整理了一篇關(guān)于Python pass函數(shù)實(shí)例用法,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • python爬蟲之遍歷單個(gè)域名

    python爬蟲之遍歷單個(gè)域名

    在本篇文章里小編給大家整理的是一篇關(guān)于python遍歷單個(gè)域名的知識(shí)點(diǎn)和操作方法,有需要的朋友們學(xué)習(xí)下。
    2019-11-11

最新評(píng)論

济阳县| 商南县| 彩票| 嘉禾县| 璧山县| 嘉祥县| 安吉县| 嵩明县| 宁阳县| 永年县| 镇沅| 台山市| 嘉峪关市| 务川| 浙江省| 绥棱县| 托克托县| 沂源县| 杂多县| 满城县| 承德县| 宿州市| 通州区| 凤城市| 新平| 合江县| 和顺县| 抚顺县| 肇庆市| 南京市| 麻江县| 维西| 阳原县| 工布江达县| 新丰县| 横山县| 繁昌县| 孝昌县| 新晃| 华坪县| 富阳市|