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

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

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

一、決策樹原理

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

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

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

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

舉例子比較容易理解:

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

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

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

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

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

ID3算法:

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

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

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

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

2、信息增益的計算:

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

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

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

3、結(jié)果為

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

4、建決策樹的根和葉子

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

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

5、遞歸建樹

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

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

本代碼為machine learning in action 第三章例子,親測無誤。
 1、計算給定數(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.劃分數(shù)據(jù)集,按照給定的特征劃分數(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 名利提示符號輸入如下命令:

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

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

6.實用決策樹進行分類的函數(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.!!!

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    python requests response值判斷方式

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

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

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

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

    這篇文章主要介紹了Python生成器常見問題及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    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)資料,希望通過本文能幫助到大家,讓大家遇到這樣的問題及時的解決,需要的朋友可以參考下
    2017-10-10
  • python函數(shù)存儲在模塊的優(yōu)點及用法總結(jié)

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

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

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

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

最新評論

罗定市| 红原县| 读书| 静安区| 沙雅县| 普宁市| 昭苏县| 涟源市| 晋宁县| 台北县| 呼图壁县| 清水河县| 大城县| 崇阳县| 密山市| 麦盖提县| 桦南县| 两当县| 双牌县| 岳池县| 铜梁县| 资阳市| 新干县| 庆阳市| 滨州市| 镇巴县| 武汉市| 灵丘县| 岳阳县| 时尚| 泰兴市| 武隆县| 若尔盖县| 蒙城县| 东明县| 手游| 宝鸡市| 依安县| 丹寨县| 银川市| 深州市|