实数域的序

by admin on 2019年1月26日

设给定三个就是 a b,假若任取一个数e >0, 数a 数b
都能放在同一个有理数s
与 s’之间: // s’ > a > s, s’ > b > s,//那对数的差小于 e://
s’ – s <
e,”则数a 与 数b 必须相等

在宫颈腺癌数据集上的测试与表现

有了算法,大家当然想做一定的测试看一看算法的显现。那里自己拔取了威斯康辛女性滴虫性阴道炎的数额。

数量总共有9列,每一列分别表示,以逗号分割

1 Sample
code number (病人ID)
2 Clump
Thickness 肿块厚度
3
Uniformity of Cell Size 细胞大小的均匀性
4
Uniformity of Cell Shape 细胞形状的均匀性
5
Marginal Adhesion 边缘粘
6 Single
Epithelial Cell Size 单上皮细胞的高低
7 Bare
Nuclei 裸核
8 Bland
Chromatin 乏味染色体
9 Normal
Nucleoli 正常核
10
Mitoses 有丝不一致
11 Class:
2 for benign, 4 formalignant(恶性或良性分类)

[from
Toby]

合计700条左右的数目,选择最后80条作为测试集,前边作为磨炼集,举行学习。

接纳分类器的代码如下:

import treesID3 as id3
import treePlot as tpl
import pickle

def classify(Tree, featnames, X):
    classLabel = "未知"
    root = list(Tree.keys())[0]
    firstGen = Tree[root]
    featindex = featnames.index(root)  #根节点的属性下标
    for key in firstGen.keys():   #根属性的取值,取哪个就走往哪颗子树
        if X[featindex] == key:
            if type(firstGen[key]) == type({}):
                classLabel = classify(firstGen[key],featnames,X)
            else:
                classLabel = firstGen[key]
    return classLabel

def StoreTree(Tree,filename):
    fw = open(filename,'wb')
    pickle.dump(Tree,fw)
    fw.close()

def ReadTree(filename):
    fr = open(filename,'rb')
    return pickle.load(fr)

if __name__ == '__main__':
    filename = "D:\\MLinAction\\Data\\breastcancer.txt"
    dataSet,featnames = id3.DataSetPredo(filename,[0,1,2,3,4,5,6,7,8])
    Tree = id3.createDecisionTree(dataSet[:620],[1.0 for i in range(len(dataSet))],featnames)
    tpl.createPlot(Tree)
    storetree = "D:\\MLinAction\\Data\\decTree.dect"
    StoreTree(Tree,storetree)
    #Tree = ReadTree(storetree)
    i = 1
    cnt = 0
    for lis in dataSet[620:]:
        judge = classify(Tree,featnames,lis[:-1])
        shouldbe = lis[-1]
        if judge == shouldbe:
            cnt += 1
        print("Test %d was classified %s, it's class is %s %s" %(i,judge,shouldbe,"=====" if judge==shouldbe else ""))
        i += 1
    print("The Tree's Accuracy is %.3f" % (cnt / float(i)))

教练出的决策树如下:

图片 1

末尾的正确率可以观望:

图片 2

正确率约为96%左右,算是不差的分类器了。

本人的细菌性阴道炎数据见:http://7xt9qk.com2.z0.glb.clouddn.com/breastcancer.txt

迄今甘休,决策树算法ID3的落到实处得了,上边考虑基于基尼指数和音信增益率举行划分选取,以及考虑落成剪枝进度,因为我们得以见到上面操练出的决策树还留存着不少冗余分支,是因为完成进程中,由于数据量太大,每个分支都不完全纯净,所以会创建往下的道岔,然而分支投票的结果又是同一的,而且数据量再大,特征数再多的话,决策树会非常大格外复杂,所以剪枝一般是必做的一步。剪枝分为先剪枝和后剪枝,即使细说的话可以写很多了。

此文亦可见:这里
参考资料:《机器学习》《机器学习实战》通过这次实战也意识了那两本书中的一些谬误之处。

lz初学机器学习不久,如有错漏之处请多担待提出照旧各位有怎么着想法或意见欢迎评论去报告自己:)

由分划 A|A’ 及 B|B’ 所确定的的二无理数 a 及 b
• 有理数域的稠密性
若 a>b,则必能球的一数c , 使// a > c,且 c > b

ID3算法落成(纯标称值)

只要样本全体是标称值即离散值的话,会比较不难。

代码:

图片 3图片 4

from math import log
from operator import itemgetter
def createDataSet():            #创建数据集
    dataSet = [[1,1,'yes'],
               [1,1,'yes'],
               [1,0,'no'],
               [0,1,'no'],
               [0,1,'no']]
    featname = ['no surfacing', 'flippers']
    return dataSet,featname
def filetoDataSet(filename):
    fr = open(filename,'r')
    all_lines = fr.readlines()
    featname = all_lines[0].strip().split(',')[1:-1]
    print(featname)
    dataSet = []
    for line in all_lines[1:]:
        line = line.strip()
        lis = line.split(',')[1:]
        dataSet.append(lis)
    fr.close()
    return dataSet,featname
def calcEnt(dataSet):           #计算香农熵
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet:
        label = featVec[-1]
        if label not in labelCounts.keys():
            labelCounts[label] = 0
        labelCounts[label] += 1
    Ent = 0.0
    for key in labelCounts.keys():
        p_i = float(labelCounts[key]/numEntries)
        Ent -= p_i * log(p_i,2)
    return Ent
def splitDataSet(dataSet, axis, value):   #划分数据集,找出第axis个属性为value的数据
    returnSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
    return returnSet
def chooseBestFeat(dataSet):
    numFeat = len(dataSet[0])-1
    Entropy = calcEnt(dataSet)
    DataSetlen = float(len(dataSet))
    bestGain = 0.0
    bestFeat = -1
    for i in range(numFeat):
        allvalue = [featVec[i] for featVec in dataSet]
        specvalue = set(allvalue)
        nowEntropy = 0.0
        for v in specvalue:
            Dv = splitDataSet(dataSet,i,v)
            p = len(Dv)/DataSetlen
            nowEntropy += p * calcEnt(Dv)
        if Entropy - nowEntropy > bestGain:
            bestGain = Entropy - nowEntropy
            bestFeat = i
    return bestFeat
def Vote(classList):
    classdic = {}
    for vote in classList:
        if vote not in classdic.keys():
            classdic[vote] = 0
        classdic[vote] += 1
    sortedclassDic = sorted(classdic.items(),key=itemgetter(1),reverse=True)
    return sortedclassDic[0][0]
def createDecisionTree(dataSet,featnames):
    featname = featnames[:]              ################
    classlist = [featvec[-1] for featvec in dataSet]  #此节点的分类情况
    if classlist.count(classlist[0]) == len(classlist):  #全部属于一类
        return classlist[0]
    if len(dataSet[0]) == 1:         #分完了,没有属性了
        return Vote(classlist)       #少数服从多数
    # 选择一个最优特征进行划分
    bestFeat = chooseBestFeat(dataSet)
    bestFeatname = featname[bestFeat]
    del(featname[bestFeat])     #防止下标不准
    DecisionTree = {bestFeatname:{}}
    # 创建分支,先找出所有属性值,即分支数
    allvalue = [vec[bestFeat] for vec in dataSet]
    specvalue = sorted(list(set(allvalue)))  #使有一定顺序
    for v in specvalue:
        copyfeatname = featname[:]
        DecisionTree[bestFeatname][v] = createDecisionTree(splitDataSet(dataSet,bestFeat,v),copyfeatname)
    return DecisionTree
if __name__ == '__main__':
    filename = "D:\\MLinAction\\Data\\西瓜2.0.txt"
    DataSet,featname = filetoDataSet(filename)
    #print(DataSet)
    #print(featname)
    Tree = createDecisionTree(DataSet,featname)
    print(Tree)

View Code

解释一下多少个函数:

filetoDataSet(filename)
 将文件中的数据整理成数据集

calcEnt(dataSet)    
总计香农熵

splitDataSet(dataSet, axis, value)    
划分数据集,选择出第axis个属性的取值为value的保有数据集,即D^v,并去掉第axis个特性,因为不须要了

chooseBestFeat(dataSet)    
 根据音信增益,选取一个最好的习性

Vote(classList)      
 即便属性用完,系列仍不同,投票决定

createDecisionTree(dataSet,featnames)    
递归成立决策树


用西瓜数据集2.0对算法进行测试,西瓜数据集见 西瓜数据集2.0,输出如下:

['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']
{'纹理': {'清晰': {'根蒂': {'蜷缩': '是', '硬挺': '否', '稍蜷': {'色泽': {'青绿': '是', '乌黑': {'触感': {'硬滑': '是', '软粘': '否'}}}}}}, '稍糊': {'触感': {'硬滑': '否', '软粘': '是'}}, '模糊': '否'}}

为了可以浮现决策树的优越性即决定方便,那里按照matplotlib模块编写可视化函数treePlot,对转移的决策树举办可视化,可视化结果如下:

图片 5

 

由于数量太少,没有安装测试数据以证实其准确度,不过我背后会依照乳房缺少症的事例举办准确度的测试的,上面进入下一些:

2 接济命题 建立实数域的稠密性
═════════════════════════════

正文对裁定树算法进行简易的总括和梳理,并对有名的决定树算法ID3(Iterative
Dichotomiser
迭代二分器)举行落实,完结利用Python语言,一句老梗,“人生苦短,我用Python”,Python确实能够省很多语言方面的事,从而可以让大家注意于问题和化解问题的逻辑。

2.1 引理1
────

决策树简介

核定树算法不用说大家应该都知情,是机械学习的一个知名算法,由澳大汉诺威大名鼎鼎统计机地理学家罗斯(Rose)Quinlan公布。

决策树是一种监督学习的分类算法,目的是学习出一颗决策树,该树中间节点是数码特征,叶子节点是种类,实际分类时根据树的布局,一步一步依据当下数量特征取值拔取进入哪一颗子树,直到走到叶子节点,叶子节点的种类就是此决策树对此数据的学习结果。下图就是一颗简单的决策树:

图片 6此决定树用来判定一个兼有纹理,触感,密度的西瓜是不是是“好瓜”。

当有这么一个西瓜,纹理清晰,密度为0.333,触感硬滑,那么要你认清是或不是是一个“好瓜”,那时固然经过决策树来判断,明显可以一向本着纹理->清晰->密度<=0.382->否,即此瓜不是“好瓜”,三回表决如同此成功了。正因为决策树决策很便利,并且准确率也较高,所以时常被用来做分类器,也是“机器学习十大算法”之一C4.5的骨干考虑。

学学出一颗决策树主要考虑一个题目,即 根据数据集构建当前树应该拔取哪一类特性作为树根,即划分标准? 

设想最好的状态,一初叶拔取某个特征,就把数量集划分成功,即在该特征上取某个值的全是一类。

设想最坏的情状,不断选用特征,划分后的数目集总是一无可取,就二分类任务的话,总是有正类有负类,平素到特征全体用完了,划分的多少集合依然有正有负,这时只可以用投票法,正类多就选正类作为叶子,否则选负类。

故此得出了貌似结论:
随着划分的进展,大家意在接纳一个特征,使得子节点包括的范本尽可能属于同一档次,即“纯度”越高越好。

据悉“纯度”的业内各异,有二种算法:

1.ID3算法(Iterative
Dichotomiser
迭代二分器),也是本文要兑现的算法,基于消息增益即新闻熵来度量纯度

2.C4.5算法(Classifier
4.5),ID3 的后继算法,也是昆兰提议

3.CART算法(Classification
And Regression Tree),基于基尼指数度量纯度。

1 实数域的序
════════════

3.两次三番值和标称值混合,有缺失数据集

jimmy221b
━━━━━━━━━━━

ID3算法简介

音信熵是音讯论中的一个主要概念,也叫“香农熵”,香农先生的史事相比较很几个人都听过,一个人创制了一门理论,牛的更加。香农理论中一个很主要的特色就是”熵“,即”信息内容的不确定性“,香农在开展音讯的定量测算的时候,明确地把新闻量定义为随意不定性程度的缩减。那就标明了他对新闻的接头:音信是用来裁减自由不定性的东西。或者公布为香农逆定义:音讯是显明的加码。这也印证了决策树以熵作为划分选用的心地标准的正确性,即咱们想更高速地从数额中拿走更加多音讯,我们就应当神速下落不确定性,即缩减”熵“。

信息熵定义为:

图片 7

D表示数据集,序列总数为|Y|,pk代表D中第k类样本所占的比重。依照其定义,Ent的值越小,新闻纯度越高。Ent的限定是[0,log|Y|]

上边要选拔某个属性举行剪切,要依次考虑每个属性,假使当前设想属性a,a的取值有|V|种,那么我们期待取a作为划分属性,划分到|V|个子节点后,所有子节点的新闻熵之和即划分后的消息熵可以有很大的减弱,减小的最多的老大属性就是我们选取的性能。

分开后的新闻熵定义为:

图片 8 

因此用属性a对样本集D举行划分的新闻增益就是原来的音信熵减去划分后的音信熵:

图片 9

ID3算法就是这么每一趟接纳一个属性对样本集举行私分,知道三种状态使这一个进度为止:

(1)某个子节点样本全体属于一类

(2)属性都用完了,那时候如果实节点样本照旧不平等,那么只好少数坚守多数了

图片 10(图片来源于网络)

由分划 A|A’ 及 B|B’ 所确定的的二无理数 a 及 b,当且仅当二分划为恒等时,
始认为相等//若A组整个包罗B组并且不与它重合, 则算做 a >b
• 任一对(实)数a 与 b 之间必有 且 仅有下列两种关系之一:
1) a = b
2) a >b
3) a <b
• 由 a >b , b >c 推出 a > c

基于区其他多寡,我完结了多少个本子的ID3算法,复杂度逐步提高:

2.2 引理2
────

有缺失值的情景

数码有缺失值是大规模的景观,大家不佳直接丢掉那个数据,因为如此会损失大量数量,不划算,可是缺失值我们也无能为力断定它的取值。如何做吧,办法仍旧有些。

设想四个问题: 

1.有缺失值时怎么进展剪切选取

2.已采取划分属性,有缺失值的样本划不分开,怎么着分割?

问题1:有缺失值时怎么进展分割接纳**

主干考虑是进行最优属性接纳时,先只考虑无缺失值样本,然后再乘以相应比例,获得在一切样本集上的大体情形。连带考虑到第四个问题的话,考虑给每一个样本一个权重,此时每个样本不再总是被用作一个单独样本,那样方便首个问题的化解:即若样本在属性a上的值缺失,那么将其当做是所有值都取,只但是取每个值的权重不雷同,每个值的权重参考该值在无缺失值样本中的比例,不难地说,比如在无缺失值样本集中,属性a取去几个值1和2,并且取1的权重和占所有权重和1/3,而取2的权重和占2/3,那么按照该属性对样本集举行私分时,际遇该属性上有缺失值的样书,那么我们认为该样本取值2的可能更大,于是将该样本的权重乘以2/3归到取值为2的范本集中继续开展分割构造决策树,而乘1/3划到取值为1的样本集中继续社团。不知晓自家说清楚没有。

公式如下:

图片 11

其中,D~表示数据集D在属性a上无缺失值的样本,按照它来判定a属性的优劣,rho(即‘lou’)表示属性a的无缺失值样本占所有样本的百分比,p~_k表示无缺失值样本中第k类所占的百分比,r~_v表示无缺失值样本在属性a上取值为v的样书所占的比重。

在细分样本时,若是有缺失值,则将样本划分到所有子节点,在属性a取值v的子节点上的权重为r~_v
* 原来的权重。

更详实的解读参考《机器学习》P86-87。

基于权重法修改后的ID3算法完结如下:

图片 12图片 13

from math import log
from operator import itemgetter

def filetoDataSet(filename):
    fr = open(filename,'r')
    all_lines = fr.readlines()
    featname = all_lines[0].strip().split(',')[1:-1]
    dataSet = []
    for line in all_lines[1:]:
        line = line.strip()
        lis = line.split(',')[1:]
        if lis[-1] == '2':
            lis[-1] = '良'
        else:
            lis[-1] = '恶'
        dataSet.append(lis)
    fr.close()
    return dataSet,featname

def calcEnt(dataSet, weight):           #计算权重香农熵
    labelCounts = {}
    i = 0
    for featVec in dataSet:
        label = featVec[-1]
        if label not in labelCounts.keys():
            labelCounts[label] = 0
        labelCounts[label] += weight[i]
        i += 1
    Ent = 0.0
    for key in labelCounts.keys():
        p_i = float(labelCounts[key]/sum(weight))
        Ent -= p_i * log(p_i,2)
    return Ent

def splitDataSet(dataSet, weight, axis, value, countmissvalue):   #划分数据集,找出第axis个属性为value的数据
    returnSet = []
    returnweight = []
    i = 0
    for featVec in dataSet:
        if featVec[axis] == '?' and (not countmissvalue):
            continue
        if countmissvalue and featVec[axis] == '?':
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
        if featVec[axis] == value:
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
            returnweight.append(weight[i])
        i += 1
    return returnSet,returnweight

def splitDataSet_for_dec(dataSet, axis, value, small, countmissvalue):
    returnSet = []
    for featVec in dataSet:
        if featVec[axis] == '?' and (not countmissvalue):
            continue
        if countmissvalue and featVec[axis] == '?':
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
        if (small and featVec[axis] <= value) or ((not small) and featVec[axis] > value):
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
    return returnSet

def DataSetPredo(filename,decreteindex):     #首先运行,权重不变为1
    dataSet,featname = filetoDataSet(filename)
    DataSetlen = len(dataSet)
    Entropy = calcEnt(dataSet,[1 for i in range(DataSetlen)])
    for index in decreteindex:     #对每一个是连续值的属性下标
        UnmissDatalen = 0
        for i in range(DataSetlen):      #字符串转浮点数
            if dataSet[i][index] != '?':
                UnmissDatalen += 1
                dataSet[i][index] = int(dataSet[i][index])
        allvalue = [vec[index] for vec in dataSet if vec[index] != '?']
        sortedallvalue = sorted(allvalue)
        T = []
        for i in range(len(allvalue)-1):        #划分点集合
            T.append(int(sortedallvalue[i]+sortedallvalue[i+1])/2.0)
        bestGain = 0.0
        bestpt = -1.0
        for pt in T:          #对每个划分点
            nowent = 0.0
            for small in range(2):   #化为正类(1)负类(0)
                Dt = splitDataSet_for_dec(dataSet, index, pt, small, False)
                p = len(Dt) / float(UnmissDatalen)
                nowent += p * calcEnt(Dt,[1.0 for i in range(len(Dt))])
            if Entropy - nowent > bestGain:
                bestGain = Entropy-nowent
                bestpt = pt
        featname[index] = str(featname[index]+"<="+"%d"%bestpt)
        for i in range(DataSetlen):
            if dataSet[i][index] != '?':
                dataSet[i][index] = "是" if dataSet[i][index] <= bestpt else "否"
    return dataSet,featname

def getUnmissDataSet(dataSet, weight, axis):
    returnSet = []
    returnweight = []
    tag = []
    i = 0
    for featVec in dataSet:
        if featVec[axis] == '?':
            tag.append(i)
        else:
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
        i += 1
    for i in range(len(weight)):
        if i not in tag:
            returnweight.append(weight[i])
    return returnSet,returnweight

def printlis(lis):
    for li in lis:
        print(li)

def chooseBestFeat(dataSet,weight,featname):
    numFeat = len(dataSet[0])-1
    DataSetWeight = sum(weight)
    bestGain = 0.0
    bestFeat = -1
    for i in range(numFeat):
        UnmissDataSet,Unmissweight = getUnmissDataSet(dataSet, weight, i)   #无缺失值数据集及其权重
        Entropy = calcEnt(UnmissDataSet,Unmissweight)      #Ent(D~)
        allvalue = [featVec[i] for featVec in dataSet if featVec[i] != '?']
        UnmissSumWeight = sum(Unmissweight)
        lou = UnmissSumWeight / DataSetWeight        #lou
        specvalue = set(allvalue)
        nowEntropy = 0.0
        for v in specvalue:      #该属性的几种取值
            Dv,weightVec_v = splitDataSet(dataSet,Unmissweight,i,v,False)   #返回 此属性为v的所有样本 以及 每个样本的权重
            p = sum(weightVec_v) / UnmissSumWeight          #r~_v = D~_v / D~
            nowEntropy += p * calcEnt(Dv,weightVec_v)
        if lou*(Entropy - nowEntropy) > bestGain:
            bestGain = Entropy - nowEntropy
            bestFeat = i
    return bestFeat

def Vote(classList,weight):
    classdic = {}
    i = 0
    for vote in classList:
        if vote not in classdic.keys():
            classdic[vote] = 0
        classdic[vote] += weight[i]
        i += 1
    sortedclassDic = sorted(classdic.items(),key=itemgetter(1),reverse=True)
    return sortedclassDic[0][0]

def splitDataSet_adjustWeight(dataSet,weight,axis,value,r_v):
    returnSet = []
    returnweight = []
    i = 0
    for featVec in dataSet:
        if featVec[axis] == '?':
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
            returnweight.append(weight[i] * r_v)
        elif featVec[axis] == value:
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
            returnweight.append(weight[i])
        i += 1
    return returnSet,returnweight

def createDecisionTree(dataSet,weight,featnames):
    featname = featnames[:]              ################
    classlist = [featvec[-1] for featvec in dataSet]  #此节点的分类情况
    if classlist.count(classlist[0]) == len(classlist):  #全部属于一类
        return classlist[0]
    if len(dataSet[0]) == 1:         #分完了,没有属性了
        return Vote(classlist,weight)       #少数服从多数
    # 选择一个最优特征进行划分
    bestFeat = chooseBestFeat(dataSet,weight,featname)
    bestFeatname = featname[bestFeat]
    del(featname[bestFeat])     #防止下标不准
    DecisionTree = {bestFeatname:{}}
    # 创建分支,先找出所有属性值,即分支数
    allvalue = [vec[bestFeat] for vec in dataSet if vec[bestFeat] != '?']
    specvalue = sorted(list(set(allvalue)))  #使有一定顺序
    UnmissDataSet,Unmissweight = getUnmissDataSet(dataSet, weight, bestFeat)   #无缺失值数据集及其权重
    UnmissSumWeight = sum(Unmissweight)      # D~
    for v in specvalue:
        copyfeatname = featname[:]
        Dv,weightVec_v = splitDataSet(dataSet,Unmissweight,bestFeat,v,False)   #返回 此属性为v的所有样本 以及 每个样本的权重
        r_v = sum(weightVec_v) / UnmissSumWeight          #r~_v = D~_v / D~
        sondataSet,sonweight = splitDataSet_adjustWeight(dataSet,weight,bestFeat,v,r_v)
        DecisionTree[bestFeatname][v] = createDecisionTree(sondataSet,sonweight,copyfeatname)
    return DecisionTree

if __name__ == '__main__':
    filename = "D:\\MLinAction\\Data\\breastcancer.txt"
    DataSet,featname = DataSetPredo(filename,[0,1,2,3,4,5,6,7,8])
    Tree = createDecisionTree(DataSet,[1.0 for i in range(len(DataSet))],featname)
    print(Tree)

View Code

有缺失值的情形如 西瓜数据集2.0alpha

试行结果:

图片 14

Table of Contents
─────────────────

1.纯标称值无缺失数据集

1 实数域的序
2 协理命题 建立实数域的稠密性
.. 2.1 引理1
.. 2.2 引理2

有一连值的景色

有屡次三番值的图景如 西瓜数据集3.0 

一个性能有很多种取值,我们肯定无法每个取值都做一个分支,那时候须要对连续属性举行离散化,有二种艺术供选取,其中两种是:

1.对每一类其他数据集的连天值取平均值,再取各种的平均值的平均值作为划分点,将一而再属性化为两类成为离散属性

2.C4.5选用的二分法,排序离散属性,取每多少个的当心作为划分点的候选点,总计以每个划分点划分数据集的消息增益,取最大的不胜划分点将三番五次属性化为两类成为离散属性,用该属性举行分割的信息增益就是刚刚计算的最大音信增益。公式如下:

图片 15

这边运用第二种,并在求学前对连年属性举行离散化。扩展处理的代码如下:

def splitDataSet_for_dec(dataSet, axis, value, small):
    returnSet = []
    for featVec in dataSet:
        if (small and featVec[axis] <= value) or ((not small) and featVec[axis] > value):
            retVec = featVec[:axis]
            retVec.extend(featVec[axis+1:])
            returnSet.append(retVec)
    return returnSet
def DataSetPredo(filename,decreteindex):
    dataSet,featname = filetoDataSet(filename)
    Entropy = calcEnt(dataSet)
    DataSetlen = len(dataSet)
    for index in decreteindex:     #对每一个是连续值的属性下标
        for i in range(DataSetlen):
            dataSet[i][index] = float(dataSet[i][index])
        allvalue = [vec[index] for vec in dataSet]
        sortedallvalue = sorted(allvalue)
        T = []
        for i in range(len(allvalue)-1):        #划分点集合
            T.append(float(sortedallvalue[i]+sortedallvalue[i+1])/2.0)
        bestGain = 0.0
        bestpt = -1.0
        for pt in T:          #对每个划分点
            nowent = 0.0
            for small in range(2):   #化为正类负类
                Dt = splitDataSet_for_dec(dataSet, index, pt, small)
                p = len(Dt) / float(DataSetlen)
                nowent += p * calcEnt(Dt)
            if Entropy - nowent > bestGain:
                bestGain = Entropy-nowent
                bestpt = pt
        featname[index] = str(featname[index]+"<="+"%.3f"%bestpt)
        for i in range(DataSetlen):
            dataSet[i][index] = "是" if dataSet[i][index] <= bestpt else "否"
    return dataSet,featname

首即使预处理函数DataSetPredo,对数据集提前离散化,然后再拓展学习,学习代码类似。输出的决策树如下:

图片 16

对于无论怎么样的七个实数a 及 b , 其中 a >
b,恒有一个位居他们中间有理数//
r: a > r > b(因而, 那种无理数有无穷七个)
• 附注://
并且可的 在实数a与b之间(若a>b)之间必然存在那有理数

2.老是值和标称值混合且无缺失数据集

━━━━━━━━━━━

先是个算法参考了《机器学习实战》的一大半代码,第二、四个算法基于前边的贯彻举办模块的加码。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图