SeeYoubwin亚洲必赢5566 2017

本文对裁定树算法举行简短的统计和梳理,并对有名的决策树算法ID3(Iterative
Dichotomiser
迭代二分器)举行落实,实现拔取Python语言,一句老梗,“人生苦短,我用Python”,Python确实可以省很多言语方面的事,从而能够让我们注意于问题和解决问题的逻辑。

不知不觉离上次写SeeYou2016
整整一年了,这一年过的可快啊!还从将来得及回顾和考虑就这么过去了,
每每想到是怎么涨工资怎么才能挣更多钱,怎么才能更快去做完这么些系列,在丢魂失魄和激励的点子中写代码。

遵照不同的数额,我实现了两个本子的ID3算法,复杂度逐渐提高:

忆起这一年做了五个项目,从上年写blog的时候是优铺app,通过类似6个月的时候才得到尾款,那一个时候曾经是到了先天的十一月份了,
优铺真的付出良多,还找了众多好的体验方面,
首先是动画片,为首页添加了动态数字显示,搜索框中键盘操作,activity中右滑删除,
再有cookiejar的发现,建立地方的cooker。okhttp的选择,已经对其卷入对okgo框架体验真正很好。
这是类别,真的要好很用心去做的。

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

再有一段时间自己去做一个shopapp 这么些的确坏极了,但是它下边的mvc
情势真的很好,直接修改界面就可以了。在哪些时候我才
发觉自家界面写的确实很烂,自己独立写一个并未网络请求的界面,真的很难,倘使没有从零支付,真的很难发现自己真的成了搬运工了。
于是乎我回绝当帮运工,依然自己写了一有些界面。最终幼教项目来了,界面是住家做的,我只是连接网络请求部分。我想这么对本人来说太好了。

2.一连值和标称值混合且无缺失数据集

这么我就足以看来外面外包项目,人家是怎么飞快做出来的,真的,人家界面真的做的急速,不管三七二十一,先把所有的activity
创立起来,然后在把各个界面
中的串联起来,然后主攻单个界面的意义,然后对封装titlerbar 和dialog
有了新的认识,原来能够这样写,发现写代码的,应该是一个新的大方,他们相应是体系化学习的,
此处好多学问连串很好,每个点都能用到,可是不足之处就是,懒惰,没有再一次再去看,还有总体把握不够。也许如故刚毕业小孩做的啊。想想自己也是
android的一名小学生,就这样吗,在一点一点的改动吧。

3.接连值和标称值混合,有缺失数据集

就这样幼教开启了擦屁股的劳作,还好的是我擦的很好,项目作完了。
还没有完结就来了一个货车app,所有这六个品类是还要拓展的。所以,我继续了事先的思绪,先把所有的界面搭建成功,然后在对每个界面举办不同程度的改动,然后在再一次修改和添加界面,以及地点的功效,还好的时候,我们来了一个测试人士,和测试人员开端协调主动性出击工作,把项目截止掉。

先是个算法参考了《机器学习实战》的大多数代码,第二、四个算法基于前边的落实举办模块的增多。

此处自己大多学会了怎么样让自己开班开展什么的付出形式了。想把温馨的笔触都有了一个总体的规划图了,先想出去有所的坚守,界面上也搭建完,然后,
把她串联起来,自己把百折不回不懈的每个步骤都要记下。在平等去修改,去调节,这前用dubug情势真的很好,现在log和debug同时举办真的很好,log走一回没有问题,最好,然后大错误就找debug。真的很有用。

决策树简介

核定树算法不用说我们应该都了然,是机器学习的一个名牌算法,由澳大阿伯丁知名遐迩总结机数学家罗丝Quinlan发表。

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

bwin亚洲必赢5566 1此决定树用来判断一个具备纹理,触感,密度的西瓜是否是“好瓜”。

当有这般一个西瓜,纹理清晰,密度为0.333,触感硬滑,那么要你判定是否是一个“好瓜”,这时假若通过决策树来判定,彰着可以一贯本着纹理->清晰->密度<=0.382->否,即此瓜不是“好瓜”,几次裁决就这样成功了。正因为决策树决策很便宜,并且准确率也较高,所以不时被用来做分类器,也是“机器学习十大算法”之一C4.5的基本思想。

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

考虑最好的气象,一起首接纳某个特征,就把多少集划分成功,即在该特征上取某个值的全是一类。

设想最坏的事态,不断选取特征,划分后的多寡集总是杂乱无章,就二分拣任务的话,总是有正类有负类,一贯到特征全部用完了,划分的数量集合仍然有正有负,这时只好用投票法,正类多就选正类作为叶子,否则选负类。

为此得出了相似结论:
随着划分的开展,我们盼望采用一个特性,使得子节点包含的样书尽可能属于同一档次,即“纯度”越高越好。

依照“纯度”的正统不同,有两种算法:

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

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

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

就如此那一个冬日病逝了,没有去参加集体移动,没有去畅游,只有在温馨公司和家两点一线来回走动,回家时候和二零一八年差不多时间,最让自己吃惊的是从未有过2018年更多疲倦的感觉,我学会怎么去解决自己的乏力,分散自己工作和学习中的压力,然后把注意力转移走,然后在回过来继续做事。

ID3算法简介

音讯熵是新闻论中的一个最首要概念,也叫“香农熵”,香农先生的事迹相相比较很三人都听过,一个人创办了一门理论,牛的相当。香农理论中一个很要紧的特点就是”熵“,即”消息内容的不确定性“,香农在展开信息的定量测算的时候,明确地把消息量定义为随意不定性程度的缩减。这就标明了他对音讯的了解:信息是用来收缩随意不定性的东西。或者发布为香农逆定义:音信是明确的增多。这也证实了决策树以熵作为划分接纳的心气标准的不利,即我们想更快捷地从数额中获取更多音讯,我们就应当快速下跌不确定性,即缩小”熵“。

消息熵定义为:

bwin亚洲必赢5566 2

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

下边要采纳某个属性举办分割,要挨个考虑每个属性,如果当前设想属性a,a的取值有|V|种,那么我们期待取a作为划分属性,划分到|V|个子节点后,所有子节点的音信熵之和即划分后的音讯熵可以有很大的收缩,减小的最多的百般属性就是大家采纳的性质。

划分后的音讯熵定义为:

bwin亚洲必赢5566 3 

从而用属性a对样本集D举办分割的音信增益就是原来的音信熵减去划分后的音讯熵:

bwin亚洲必赢5566 4

ID3算法就是这样每一次拔取一个特性对样本集进行分割,知道两种情况使这个过程结束:

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

(2)属性都用完了,这时候如若实节点样本如故不等同,那么只好少数遵循多数了

bwin亚洲必赢5566 5(图片来自网络)

bwin亚洲必赢5566 6

ID3算法实现(纯标称值)

一经样本全体是标称值即离散值的话,会相比较简单。

代码:

bwin亚洲必赢5566 7bwin亚洲必赢5566 8

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,对转移的决策树举办可视化,可视化结果如下:

bwin亚洲必赢5566 9

 

鉴于数量太少,没有安装测试数据以验证其准确度,但是自己背后会依据乳腺增生的事例举办准确度的测试的,下边进入下部分:

下半年,从代码上
开头转换了一下思路,自己再也搭建了组件化程序,分开了一有的机能。
自定义了有的代码和功能。对解耦和职能分其它办法,对界面和代码能很快去修补。紧要针对高速变化的需求变动做回应。同时也对新的想法的增长,以及新的框架的尝尝,这或许是自身待下去的来由吧。更多的是祥和有独立学代码和写blog的年月。

有连续值的图景

有连续值的情况如 西瓜数据集3.0 

一个性能有很多种取值,我们肯定不可能每个取值都做一个支行,这时候需要对连日属性举办离散化,有二种艺术供采用,其中两种是:

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

2.C4.5施用的二分法,排序离散属性,取每多少个的正中作为划分点的候选点,总结以每个划分点划分数据集的音讯增益,取最大的不胜划分点将连接属性化为两类成为离散属性,用该属性举办划分的音信增益就是刚刚总结的最大音信增益。公式如下:

bwin亚洲必赢5566 10

这边运用第两种,并在就学前对连续属性举行离散化。扩展拍卖的代码如下:

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,对数据集提前离散化,然后再展开学习,学习代码类似。输出的决策树如下:

bwin亚洲必赢5566 11

继之会添加部分插件化的东西,以及新框架的尝试,还有更多美观的项目学习。

有缺失值的情景

数据有缺失值是大面积的景观,我们糟糕直接放弃这么些多少,因为如此会损失大量数据,不划算,不过缺失值我们也无力回天判定它的取值。如何做吧,办法依旧有的。

考虑六个问题: 

1.有缺失值时咋样开展剪切拔取

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

问题1:有缺失值时怎么进展划分选取**

主导思想是进展最优属性拔取时,先只考虑无缺失值样本,然后再乘以相应比例,得到在总体样本集上的光景意况。连带考虑到第二个问题的话,考虑给每一个样本一个权重,此时每个样本不再总是被用作一个独立样本,这样便于第二个问题的缓解:即若样本在属性a上的值缺失,那么将其当做是所有值都取,只可是取每个值的权重不雷同,每个值的权重参考该值在无缺失值样本中的比例,简单地说,比如在无缺失值样本集中,属性a取去六个值1和2,并且取1的权重和占总体权重和1/3,而取2的权重和占2/3,那么依据该属性对样本集举办私分时,遭遇该属性上有缺失值的范本,那么我们觉得该样本取值2的可能性更大,于是将该样本的权重乘以2/3归到取值为2的样本集中继续展开私分构造决策树,而乘1/3划到取值为1的样书集中继续社团。不通晓自己说精晓没有。

公式如下:

bwin亚洲必赢5566 12

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

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

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

据悉权重法修改后的ID3算法实现如下:

bwin亚洲必赢5566 13bwin亚洲必赢5566 14

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

试验结果:

bwin亚洲必赢5566 15

读书

自己通过微信读书这么些软件,从微信登录,看到里面有交大才子艾力先生的一本《你一年的8760时辰》。先河对时间把握,不过还好的是,里面讲到咋样团结调节压力的,每个人都在干活,确实工作很累,然则我们的大脑在另一个区域确实闲的,所有大家要把现行的模块休息一下,接着要把尚未工作的模块去办事,去体验生活,会面到不同的功力。

还好的是这本书真的很好,我也以为很有道理,作者艾力,是一个从浙大到目前的新东方的良师,真的历经的破产和成功,看着也挺感动的。看完了,发现读书app里面没有太多论文和随笔,并且有空就看看一下,一口气看完了八本书一共。
有《Steve.乔布斯(乔布斯(Jobs))传》《居里夫人自传》《季羡林自传》《比尔(比尔(Bill))盖茨传》《人工智能》《从您的五洲路过》《把时间作为朋友》。

这几本书,看乔布斯(Jobs)的时候,50年代到20世纪,美利坚联邦合众国电子产品发展真正很好的年份,对终端环境暴发了翻天覆地的变更,再到现在的互联网时代,而自我想知道当时的炎黄的确做什么样?发现了才子季先生,从而起首了看她的小说自传。真的,从而思考到中国生成很快和很不同。

季先生在二战期间在德意志联邦共和国,所以自己想领会其他国在二战期间,是怎么的情景,居里夫人恰好在特别年代,第二次大战期间,在经济最窘迫的时候依旧做出巨大的随笔和发现镭元素。这么些伟大的妇人,不仅让自家看来他这股热情和科研精神,还让自身看齐无私奉献精神,真的太棒了。所以对非凡时候的南美洲,是一个很好的认识,接着看到是拿破仑和梵高的一些东西,还不曾看完,又来看U.S.的富兰克林(Franklin)和华盛顿,接着渐进的看出了不一致的世界,接着还会众多,所有算了不想了,也不看了,仍然对眼前的打听下,所以看完了比尔(比尔)盖茨。

写的也很好,感觉差乔布斯的撰稿人太远了,这一个作者写的才叫一个棒,对桥帮主价值观和人格魅力都显现出来了。

读书所以既让自身学会了有些表明能力,也让我全心全意看到局部事物,才使得自己并未浪费一个钟头的上班和下班的时间。
当时平常下班,我的思考都是相比较活跃的,因为编码的活泼的毕竟是的大脑最小的有些,其他一些也是自个儿最初步活跃的有的。

在痛经数据集上的测试与表现

有了算法,大家当然想做肯定的测试看一看算法的展现。这里我接纳了威斯康辛女性柏哲病的数据。

数据总共有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)))

磨炼出的决策树如下:

bwin亚洲必赢5566 16

最后的正确率可以看到:

bwin亚洲必赢5566 17

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

我的早产数据见:http://7xt9qk.com2.z0.glb.clouddn.com/breastcancer.txt

从这之后,决策树算法ID3的实现得了,下边考虑基于基尼指数和信息增益率举办私分拔取,以及考虑实现剪枝过程,因为大家得以看出地点磨炼出的决策树还设有着无数冗余分支,是因为实现过程中,由于数据量太大,每个分支都不完全纯净,所以会创制往下的分段,不过分支投票的结果又是相同的,而且数据量再大,特征数再多的话,决策树会异常大非凡复杂,所以剪枝一般是必做的一步。剪枝分为先剪枝和后剪枝,假若细说的话可以写很多了。

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

lz初学机器学习不久,如有错漏之处请多包涵指出依旧各位有哪些想法或意见欢迎评论去报告我:)

代码

我上传的gitee.com上,之所以用它是为了看自己所上传的代码有些许,也迫使自己天天都要写一些代码,所有很多上传上去都是个体的,不是为着偷窃自己写的代码,只是为了更好端正自己办事的神态,也对代码哪个地方都足以看,反思自己写的,及时在忙也要探望外面的代码和友好的代码。
下边是团结的代码记录显示图

bwin亚洲必赢5566 18

git图

然则真的很遗憾,没有太多star,自己也写了一部分demo,例如日历滑动,还有底部菜单收集,一句话popwindow。
在简书和掘金上也披露了有的,还好一个礼拜也有100个喜欢。
看了刹那间,一年中所写的blog
真的不得了透了,没有一些革新的事物,更没有好的异样见解。唯有搬砖了,搬的能做项目了。

前半年,我都在搜集和行使它们的主意,都在用,先去github上看有没有砖,拿来就行了。
后半年,我起首封装一部分代码,例如一句话popwindow,还有使用动画片,自定义下来刷新界面和等待界面,以及修改部分源码。此外伊始看内存使用情况,从app
流畅度上起来做一些优化了。

虽说,blog写的不多,不过依然坚定不移写到最后了。 2018加油。

遗憾是,Kotlin Demo
Begin这篇始终没有机会和时间去整理出来和kotlin的读书。
kotlin也是我直接是自己想去学习的事物,真的应该抽出来时间进行学习了。

python 和node
本来是自己下半年要学习的地点,遗憾的node连接数据库的时候就丢弃了。

学了一段从零搭建mvcspring
,真的很好。可是在向里碰碰一下事物的时候,发现太难了。要提到的东西太多了。所有说
我都在躲避困难,要有遗憾,就必须这面困难,这也是对二零一八年对团结说的。

生活

当年倍感去比年好过多,例如对象的心性和孩子的成材,都让自身深感比上年好过多。

目的也学会了咋样去了解人,怎样去应对生活中的琐事了,并从未太多的刻薄要求。这点真正很好。不过本人也想过上还贷的光景,例如房贷。有一个谈得来的温暖的窝。

星期二,我几乎不敢出去,我要和儿女玩,我会背这他散步,可是对象说不用这样惯着,你上班了什么人背。所有我也晓得了,要对照和经常同样。和他绘画,写字,做游戏,看电视。
子女的笑,让自家仿佛恋爱了。

bwin亚洲必赢5566 19

孩子图

自身给本人对象买了卡尔加里(Louis)高校的专科学历,不知晓能无法用到,不过到底能够愿他期待呢,想做哪些就和好去做吧,例如去大商家去上班,她就学能力也不差,为什么不去和上大学的有竞争呢?还让旁人看只是一个不曾读书的吧?路还很长,为何不试一试呢?我对象也允许。
加油2018。

和谐又买了二建的课程,准备每年考试,感觉二建里面工程很好,二建会从法律,投标,到规划,在推行,再到结项,和大家总计机很像,那才是的确的工程师和项目主任。
不管过如故只是,我学到了
基本的法律和总体的流程,以及作为项目总经理的权责,未来自己成为责任人的责任。

将来之期

以前做规划然只是为着求学某个技能,现在自我学会了,综合能力,例如听懂外人的话,端正自己的太多,还有一些学科举办,开端是基础,再去大概教程,再到实战。一步一步举办。现在自我买了mac了,我要学习苹果支付了,下一年的预备。mac一是是我的梦,为何自己看乔布斯(Jobs)传?也是由于那一个缘故,还要备考二建。继续自己的blog,希望写点好的事物,自己愿意有所突破吧。

还得扩展个人收入,毕竟孩子要上幼儿园了,花钱的地方多了。

终极引用苏文忠的《留侯论》中的文字,

“古之所谓豪杰之士者,必有过人之节,人情有所不可以忍者。匹夫见辱,拔剑而起,挺身而斗,此不足为勇也。天下有大勇者,卒然临之而不惊,无故加之而不怒,此其所挟持者甚大,而其志甚远也。”

发表评论

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