成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

決策樹之ID3算法

malakashi / 2901人閱讀

摘要:前言決策樹算法,是指一類通過對數(shù)據(jù)集中特征的選擇,構造一個樹,實現(xiàn)對數(shù)據(jù)的分類的算法。算法首先,讓我們以例子來看看算法的實現(xiàn)過程。假設我們現(xiàn)在要做一次決策判斷一個人會買什么類型的保險。個人理解信息熵就是描述給出的這組數(shù)據(jù)的分類有多不確定。

前言
決策樹算法,是指一類通過對數(shù)據(jù)集中特征的選擇,構造一個樹,實現(xiàn)對數(shù)據(jù)的分類的算法。
這棵樹的每一個節(jié)點都是選中的其中一種特征,而該節(jié)點的邊則是這種特征的分類。
更詳細的定義可以Google之。
ID3算法

首先,讓我們以例子來看看ID3算法的實現(xiàn)過程。
假設我們現(xiàn)在要做一次決策:判斷一個人會買什么類型的保險。在這個例子中有如下特征:

性別(男、女)

年齡(<21、>=21and=<25、>25)

婚姻狀況(已婚、未婚)

而根據(jù)這些特征,我們會有最終每個人購買的保險類型(A、B、C),以下給出數(shù)據(jù):

接下來,ID3算法根據(jù)每個特征的重要程度(該值通過信息熵來判斷,但是信息熵這個概念等下具體實現(xiàn)時候再說XD),構造如下的一個樹:
對于如上格式的每個樣例,首先判斷性別(男或女),如果是男的,就需要用婚姻狀況來判斷;如果是女的,則需要用年齡來判斷。這樣迭代判斷直到到達葉子節(jié)點,也就得出了可能選擇的保險類型。


那么,此時重點來了,我們該如何判斷選擇哪個特征最合適呢??

實現(xiàn)

經(jīng)過許多大神的不懈研究,借鑒了物理學上的熵的概念,信息領域提出了如下幾個定義:

信息熵(Entropy)

    用于描述一組數(shù)據(jù)的混亂、不確定程度
    計算公式如下:
    

用上述例子來說,p(Xi)指所有數(shù)據(jù)中A、B、C這三個各自出現(xiàn)的概率,就是A、B、C各自的個數(shù)/總個數(shù)。
個人理解信息熵就是描述給出的這組數(shù)據(jù)的分類有多不確定。就比如預測明天下不下雨這一問題,信息熵就很大;而預測每一個人明天吃不吃飯這一問題,信息熵就很小。因為絕大部分人,明天肯定是要吃飯的orz。。。。

條件熵

     用于描述一組數(shù)據(jù)的子數(shù)據(jù)的混亂、不確定程度

這是什么意思呢?個人理解就是確定數(shù)據(jù)的某一特征之后,在這一特征上的數(shù)據(jù)分類的不確定程度。比如依舊是預測明天下不下雨這一問題,如果現(xiàn)在明確告訴你,明天云的情況(多云、少云、沒有云),那么在明天云情況這一特征上的每個分類都能計算相應的信息熵。

信息增益

       用于描述某一特征對整體的重要程度
       根據(jù)定義,可以知道,信息增益就是總信息熵減去某個特征上各個分類的條件熵,如下:
       
       

1、被減數(shù)就是總信息熵。
2、減數(shù)中的value(T)是指在某一個特征的一種分類,如性別就包含兩個分類(男、女),entropy(Sv)就是在該特征的某個分類上的條件熵。
3、S是指所有數(shù)據(jù)個數(shù)
4、Sv是指在該特征的一種分類下數(shù)據(jù)個數(shù)。


在了解了這些定義后,我們回到最開始的問題:如何判斷哪個特征最合適你?

上面說到,信息熵越大,數(shù)據(jù)集就越混亂,就越難得到準確的結果,所以我們要選擇的特征應該能使得在
確定這個特征后的信息熵越小,也就是條件熵越小,亦即信息增益最大。
因此,具體實現(xiàn)思路如下:
**遍歷所有特征,根據(jù)遍歷的每個特征進行數(shù)據(jù)集分類,算出每個特征下的條件熵,然后取條件熵最小
的,信息增益最大的特征。接著,根據(jù)選擇的特征進行分類,得到的子數(shù)據(jù)在刪除選擇的特征后,遞歸
選擇下一個特征**   
代碼
#coding=utf-8
import csv
import pandas as pd
import math
import drewTree

def readData(path):
    df=pd.read_csv(path)
    return df.values.tolist(),df.columns.values.tolist()

#計算信息熵
def countEntropy(data):
    sumEg=len(data)
    labelCount={}
    #計算不同保險類別的數(shù)量
    for example in data:
        if example[-1] not in labelCount.keys():
            labelCount[example[-1]]=0
        labelCount[example[-1]]+=1
    #開始計算信息熵
    ent=0
    for key in labelCount:
        prop=float(labelCount[key])/sumEg
        ent-=prop*math.log(prop,2)
    return ent
#根據(jù)特征分類劃分數(shù)據(jù)集
def splitData(data,featureNum):
    res={}
    for example in data:
        if example[featureNum] not in res.keys():
            res[example[featureNum]]=[]
        res[example[featureNum]].append(example)
    return res
#移除數(shù)據(jù)中已經(jīng)選擇的特征值
def removeFeature(data,featureNum):
    res=[]
    for example in data:
        example.pop(featureNum)
        res.append(example)
    return res
#單特征投票
#當所有特征都選擇完時,還有多于1個以上的樣例,則直接根據(jù)保險類型投票,票高者得勝
def vote(classData):
    count={}
    for example in classData:
        if example not in count.keys():
            count[example]=0
        count[example]+=1
    return max(count)
#選擇信息增益最大的特征
def selectBestFeature(data,dataLabel):
    sumEnt=countEntropy(data)
    sumFeatureNum=len(data[0])-1
    minConditionEnt = 999999
    bestFeature = []
    bfNum = -2
    #計算每個特征的信息增益
    for i in range(sumFeatureNum):
        spData=splitData(data,i)
        num=len(data)
        conditionEnt=0
        for key in spData:
            conditionEnt+=float(len(spData[key]))/num*countEntropy(spData[key])
        if (conditionEnt < minConditionEnt):
            minConditionEnt = conditionEnt
            bestFeature =dataLabel[i]
            bfNum=i
    return bestFeature,bfNum

def createTree(data,dataLabel):
    #只剩保險類型時,根據(jù)剩余的數(shù)據(jù)集進行投票
    if len(data[0])==1:
        return vote(example[-1] for example in data)
    bestFeature,bfNum=selectBestFeature(data,dataLabel)
    dicisionTree={bestFeature:{}}
    bestFeatureData=splitData(data,bfNum)
    label=dataLabel
    temp=label.pop(bfNum)
    #剩余特征進行遞歸構造決策樹
    for key in bestFeatureData:
        rmFData=removeFeature(bestFeatureData[key],bfNum)
        dicisionTree[bestFeature][key]=createTree(rmFData,label)
    label.insert(bfNum,temp)
    return dicisionTree
    
#調(diào)用
data,dataLabel=readData("./ID3New.csv")
res=createTree(data,dataLabel)
參考博客:http://blog.csdn.net/wzmsltw/...

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/41072.html

相關文章

  • ID3 算法介紹

    摘要:首先我先來介紹一下算法。算法是澳洲計算機科學家發(fā)明的,全稱是。算法的作用是通過一個數(shù)據(jù)集來生成一棵決策樹。算法的主要應用領域有,機器學習,,自然語言處理。算法的執(zhí)行流程第一步是遞歸地構建決策樹,計算信息增益最大或者熵最小的特征作為最優(yōu)特征。 如果我的朋友說介紹個女生給我認識,那么我會問我朋友女生的條件,然后再決定認不認識。他說他只知道關于女生的這些信息: 《王者榮耀》玩的好不好。 喜...

    ormsf 評論0 收藏0
  • 分類算法決策樹(理論篇)

    摘要:后剪枝先創(chuàng)建完整的決策樹,然后再嘗試消除多余的節(jié)點,也就是采用減枝的方法。 起步 決策樹(decision tree)是一個樹結構,可以是二叉樹或非二叉樹,也可以把他看作是 if-else 規(guī)則的集合,也可以認為是在特征空間上的條件概率分布。 決策樹的結構 以一個簡單的用于是否買電腦預測的決策樹為例子: showImg(https://segmentfault.com/img/remo...

    jzzlee 評論0 收藏0
  • javascript實現(xiàn)樸素貝葉斯分類與決策ID3分類

    摘要:根據(jù)這個訓練集,運用樸素貝葉斯分類和決策樹分類則可以得到一個數(shù)據(jù)模型,然后通過輸入一條測試數(shù)據(jù)來判斷是否回去打網(wǎng)球。一樸素貝葉斯分類大學概率論的貝葉斯定理實現(xiàn)了通過計算概率求出假設推理的結論。 今年畢業(yè)時的畢設是有關大數(shù)據(jù)及機器學習的題目。因為那個時間已經(jīng)步入前端的行業(yè)自然選擇使用JavaScript來實現(xiàn)其中具體的算法。雖然JavaScript不是做大數(shù)據(jù)處理的最佳語言,相比還沒有優(yōu)...

    ernest.wang 評論0 收藏0

發(fā)表評論

0條評論

malakashi

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<