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

Python機(jī)器學(xué)習(xí)之決策樹算法

 更新時(shí)間:2017年12月22日 09:37:43   作者:自在逍遙  
這篇文章主要為大家詳細(xì)介紹了Python機(jī)器學(xué)習(xí)之決策樹算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、決策樹原理

決策樹是用樣本的屬性作為結(jié)點(diǎn),用屬性的取值作為分支的樹結(jié)構(gòu)。
決策樹的根結(jié)點(diǎn)是所有樣本中信息量最大的屬性。樹的中間結(jié)點(diǎn)是該結(jié)點(diǎn)為根的子樹所包含的樣本子集中信息量最大的屬性。決策樹的葉結(jié)點(diǎn)是樣本的類別值。決策樹是一種知識(shí)表示形式,它是對(duì)所有樣本數(shù)據(jù)的高度概括決策樹能準(zhǔn)確地識(shí)別所有樣本的類別,也能有效地識(shí)別新樣本的類別。 

決策樹算法ID3的基本思想:

首先找出最有判別力的屬性,把樣例分成多個(gè)子集,每個(gè)子集又選擇最有判別力的屬性進(jìn)行劃分,一直進(jìn)行到所有子集僅包含同一類型的數(shù)據(jù)為止。最后得到一棵決策樹。

J.R.Quinlan的工作主要是引進(jìn)了信息論中的信息增益,他將其稱為信息增益(information gain),作為屬性判別能力的度量,設(shè)計(jì)了構(gòu)造決策樹的遞歸算法。

舉例子比較容易理解:

對(duì)于氣候分類問題,屬性為:
天氣(A1) 取值為: 晴,多云,雨
氣溫(A2)  取值為: 冷 ,適中,熱
濕度(A3)  取值為: 高 ,正常
風(fēng) (A4)  取值為: 有風(fēng), 無風(fēng)

每個(gè)樣例屬于不同的類別,此例僅有兩個(gè)類別,分別為P,N。P類和N類的樣例分別稱為正例和反例。將一些已知的正例和反例放在一起便得到訓(xùn)練集。
由ID3算法得出一棵正確分類訓(xùn)練集中每個(gè)樣例的決策樹,見下圖。

決策樹葉子為類別名,即P 或者N。其它結(jié)點(diǎn)由樣例的屬性組成,每個(gè)屬性的不同取值對(duì)應(yīng)一分枝。
若要對(duì)一樣例分類,從樹根開始進(jìn)行測(cè)試,按屬性的取值分枝向下進(jìn)入下層結(jié)點(diǎn),對(duì)該結(jié)點(diǎn)進(jìn)行測(cè)試,過程一直進(jìn)行到葉結(jié)點(diǎn),樣例被判為屬于該葉結(jié)點(diǎn)所標(biāo)記的類別。
現(xiàn)用圖來判一個(gè)具體例子,
某天早晨氣候描述為:
天氣:多云
氣溫:冷
濕度:正常
風(fēng): 無風(fēng)

它屬于哪類氣候呢?-------------從圖中可判別該樣例的類別為P類。 

ID3就是要從表的訓(xùn)練集構(gòu)造圖這樣的決策樹。實(shí)際上,能正確分類訓(xùn)練集的決策樹不止一棵。Quinlan的ID3算法能得出結(jié)點(diǎn)最少的決策樹。

ID3算法:

     1. 對(duì)當(dāng)前例子集合,計(jì)算各屬性的信息增益;
     2. 選擇信息增益最大的屬性Ak;
     3. 把在Ak處取值相同的例子歸于同一子集,Ak取幾個(gè)值就得幾個(gè)子集;
     4.對(duì)既含正例又含反例的子集,遞歸調(diào)用建樹算法;
     5. 若子集僅含正例或反例,對(duì)應(yīng)分枝標(biāo)上P或N,返回調(diào)用處。

一般只要涉及到樹的情況,經(jīng)常會(huì)要用到遞歸。 

對(duì)于氣候分類問題進(jìn)行具體計(jì)算有:
1、 信息熵的計(jì)算: 其中S是樣例的集合, P(ui)是類別i出現(xiàn)概率:

|S|表示例子集S的總數(shù),|ui|表示類別ui的例子數(shù)。對(duì)9個(gè)正例和5個(gè)反例有:
P(u1)=9/14
P(u2)=5/14
H(S)=(9/14)log(14/9)+(5/14)log(14/5)=0.94bit 

2、信息增益的計(jì)算:

其中A是屬性,Value(A)是屬性A取值的集合,v是A的某一屬性值,Sv是S中A的值為v的樣例集合,| Sv |為Sv中所含樣例數(shù)。

以屬性A1為例,根據(jù)信息增益的計(jì)算公式,屬性A1的信息增益為

S=[9+,5-] //原樣例集中共有14個(gè)樣例,9個(gè)正例,5個(gè)反例
S晴=[2+,3-]//屬性A1取值晴的樣例共5個(gè),2正,3反
S多云=[4+,0-] //屬性A1取值多云的樣例共4個(gè),4正,0反
S雨=[3+,2-] //屬性A1取值晴的樣例共5個(gè),3正,2反
故 

3、結(jié)果為

屬性A1的信息增益最大,所以被選為根結(jié)點(diǎn)。

4、建決策樹的根和葉子

ID3算法將選擇信息增益最大的屬性天氣作為樹根,在14個(gè)例子中對(duì)天氣的3個(gè)取值進(jìn)行分枝,3 個(gè)分枝對(duì)應(yīng)3 個(gè)子集,分別是:

其中S2中的例子全屬于P類,因此對(duì)應(yīng)分枝標(biāo)記為P,其余兩個(gè)子集既含有正例又含有反例,將遞歸調(diào)用建樹算法。

5、遞歸建樹

分別對(duì)S1和S3子集遞歸調(diào)用ID3算法,在每個(gè)子集中對(duì)各屬性求信息增益.
(1)對(duì)S1,濕度屬性信息增益最大,以它為該分枝的根結(jié)點(diǎn),再向下分枝。濕度取高的例子全為N類,該分枝標(biāo)記N。取值正常的例子全為P類,該分枝標(biāo)記P。
(2)對(duì)S3,風(fēng)屬性信息增益最大,則以它為該分枝根結(jié)點(diǎn)。再向下分枝,風(fēng)取有風(fēng)時(shí)全為N類,該分枝標(biāo)記N。取無風(fēng)時(shí)全為P類,該分枝標(biāo)記P。

二、PYTHON實(shí)現(xiàn)決策樹算法分類

本代碼為machine learning in action 第三章例子,親測(cè)無誤。
 1、計(jì)算給定數(shù)據(jù)shangnon數(shù)據(jù)的函數(shù):

def calcShannonEnt(dataSet): 
 #calculate the shannon value 
 numEntries = len(dataSet) 
 labelCounts = {} 
 for featVec in dataSet:  #create the dictionary for all of the data 
  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 
  shannonEnt -= prob*log(prob,2) #get the log value 
 return shannonEnt 

 2. 創(chuàng)建數(shù)據(jù)的函數(shù)

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 

3.劃分?jǐn)?shù)據(jù)集,按照給定的特征劃分?jǐn)?shù)據(jù)集

def splitDataSet(dataSet, axis, value): 
 retDataSet = [] 
 for featVec in dataSet: 
  if featVec[axis] == value:  #abstract the fature 
   reducedFeatVec = featVec[:axis] 
   reducedFeatVec.extend(featVec[axis+1:]) 
   retDataSet.append(reducedFeatVec) 
 return retDataSet 

4.選擇最好的數(shù)據(jù)集劃分方式

def chooseBestFeatureToSplit(dataSet): 
 numFeatures = len(dataSet[0])-1 
 baseEntropy = calcShannonEnt(dataSet) 
 bestInfoGain = 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 * calcShannonEnt(subDataSet) 
  infoGain = baseEntropy - newEntropy 
  if(infoGain > bestInfoGain): 
   bestInfoGain = infoGain 
   bestFeature = i 
 return bestFeature 

5.遞歸創(chuàng)建樹

用于找出出現(xiàn)次數(shù)最多的分類名稱的函數(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)建樹的函數(shù)代碼

def createTree(dataSet, labels): 
 classList = [example[-1] for example in dataSet] 
 # the type is the same, so stop classify 
 if classList.count(classList[0]) == len(classList): 
  return classList[0] 
 # traversal all the features and choose the most frequent feature 
 if (len(dataSet[0]) == 1): 
  return majorityCnt(classList) 
 bestFeat = chooseBestFeatureToSplit(dataSet) 
 bestFeatLabel = labels[bestFeat] 
 myTree = {bestFeatLabel:{}} 
 del(labels[bestFeat]) 
 #get the list which attain the whole properties 
 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 

然后是在python 名利提示符號(hào)輸入如下命令:

myDat, labels = trees.createDataSet() 
myTree = trees.createTree(myDat,labels) 
print myTree 

結(jié)果是:
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

6.實(shí)用決策樹進(jìn)行分類的函數(shù)

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 

在Python命令提示符,輸入:
trees.classify(myTree,labels,[1,0]) 

得到結(jié)果:
'no'
Congratulation. Oh yeah. You did it.!!!

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

相關(guān)文章

  • python 執(zhí)行終端/控制臺(tái)命令的例子

    python 執(zhí)行終端/控制臺(tái)命令的例子

    今天小編就為大家分享一篇python 執(zhí)行終端/控制臺(tái)命令的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 使用python開發(fā)vim插件及心得分享

    使用python開發(fā)vim插件及心得分享

    Vim 插件是一個(gè) .vim 的腳本文件,定義了函數(shù)、映射、語法規(guī)則和命令,可用于操作窗口、緩沖以及行。一般一個(gè)插件包含了命令定義和事件鉤子。當(dāng)使用 Python 編寫 vim 插件時(shí),函數(shù)外面是使用 VimL 編寫,盡管 VimL 學(xué)起來很快,但 Python 更加靈活
    2014-11-11
  • Python獲取Excel文件行數(shù)的方法

    Python獲取Excel文件行數(shù)的方法

    在數(shù)據(jù)分析和自動(dòng)化辦公領(lǐng)域,Python 因其簡(jiǎn)潔的語法和強(qiáng)大的庫支持而廣受歡迎,特別是當(dāng)涉及到處理 Excel 文件時(shí),Python 提供了多種庫來簡(jiǎn)化這一過程,本文給大家介紹了如何使用Python獲取 Excel 文件的行數(shù),感興趣的小伙伴跟著小編一起來看看吧
    2024-09-09
  • 在Python中os.fork()產(chǎn)生子進(jìn)程的例子

    在Python中os.fork()產(chǎn)生子進(jìn)程的例子

    今天小編就為大家分享一篇在Python中os.fork()產(chǎn)生子進(jìn)程的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python requests response值判斷方式

    python requests response值判斷方式

    這篇文章主要介紹了python requests response值判斷方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python淺析守護(hù)線程與非守護(hù)線程的區(qū)別與使用

    python淺析守護(hù)線程與非守護(hù)線程的區(qū)別與使用

    守護(hù)線程,又稱后臺(tái)線程,它是在后臺(tái)運(yùn)行的,如果所有前臺(tái)線程都死亡,那么后臺(tái)線程就會(huì)自動(dòng)死亡,本章我們來了解守護(hù)線程與非守護(hù)線程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-08-08
  • Python生成器常見問題及解決方案

    Python生成器常見問題及解決方案

    這篇文章主要介紹了Python生成器常見問題及解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 解決出現(xiàn)Incorrect integer value: '''' for column ''id'' at row 1的問題

    解決出現(xiàn)Incorrect integer value: '''' for column ''id'' at row 1

    這篇文章主要介紹了解決出現(xiàn)Incorrect integer value: '' for column 'id' at row 1的問題的相關(guān)資料,希望通過本文能幫助到大家,讓大家遇到這樣的問題及時(shí)的解決,需要的朋友可以參考下
    2017-10-10
  • python函數(shù)存儲(chǔ)在模塊的優(yōu)點(diǎn)及用法總結(jié)

    python函數(shù)存儲(chǔ)在模塊的優(yōu)點(diǎn)及用法總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于python函數(shù)存儲(chǔ)在模塊的優(yōu)點(diǎn)及用法相關(guān)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-10-10
  • python逆向微信指數(shù)爬取實(shí)現(xiàn)步驟

    python逆向微信指數(shù)爬取實(shí)現(xiàn)步驟

    這篇文章主要為大家介紹了python逆向微信指數(shù)爬取的實(shí)現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-02-02

最新評(píng)論

兴义市| 屏山县| 石柱| 玛纳斯县| 兴业县| 镇雄县| 哈密市| 元阳县| 龙陵县| 潼南县| 阿克苏市| 库尔勒市| 临沧市| 蓬溪县| 青阳县| 平定县| 泾阳县| 衡山县| 双鸭山市| 兴隆县| 绥德县| 香河县| 综艺| 铜山县| 红桥区| 柏乡县| 易门县| 普定县| 峡江县| 苗栗市| 鸡泽县| 威远县| 江津市| 河南省| 磴口县| 盐边县| 阿巴嘎旗| 仁寿县| 湛江市| 玉田县| 黑水县|