机器学习实战之Adaboost之机器学习作业记录(三)

原创 2018年04月15日 12:18:43

好久没更新作业了,,,

主要是李航统计学习方法的第八章,准确率80% 总感觉不对,先记录到这,,,

其中关于概念的理解参考了以下博客,觉得对我很有帮助,记录一下:
1
2
3
4
这篇
尤其这篇
还有这篇
这篇
这篇
这篇
这篇
这篇
这篇

然后我的代码放在这里啦:

# -*- coding: utf-8 -*-
"""
Created on Sat Apr 14 20:46:00 2018

@author: xuanxuan
"""

#the second problem to the homework

import matplotlib.pyplot as plt
import math
import numpy as np





#每一次迭代,划分样本点,每一个s对应一个分类器
def splits(): 

    S=[]  #切分点集合
    for i in range(3):
        a=i+0.5
        S.append(a)
    return S    



#其实每一个s对应了本次迭代中的一个弱分类器,不断改变s的值就可以得到本次迭代中一系列分类器
#比较每一个分类器的错分率,选择错分率最小的作为本次迭代的最优弱分类器   
#(是本次迭代产生了好多个分类器,第一次使用哪个还需要判断)

def classifier1(X,L,W): #X是划分数据集,L是对应数据的标签,s是该分类器使用该值作为划分点


    S=splits()   #得到一系列分类点存成的列表
    Em=[] #存放本次迭代 各个分类器的错分样本率 选择最小的那个作为最优的

    for s in S:  #本次迭代,根据s的不同会产生一系列的分类器,需要选一个误分类样本率最小的那个作为本次迭代最优的弱分类器
        em=0  #该s值对应的弱分类器错分样本率 其实就是错分样本的样本权重累加
        n=0
        for x in X:
            if x<=s:
                L_pre=-1
            else:
                L_pre=1
            if L_pre!=L[n]:
                em=em+W[n]   #就是该分类器错分样本概率

            n+=1
        Em.append(em)   #Em中存放了一系列分类器的误分样本率
    #print("本轮迭代对于不同的s得到的各弱分类器的错分样本率分别为:\n{}".format(Em))
    mi_em,mi_s=find_min(Em,S)  #返回的是本次迭代中错分样本率最小的分类器(mis)以及相应的错分率miem   

    α=0.5*math.log((1-mi_em)/mi_em)  #本轮迭代之后该分类器的系数,仅由该分类器对样本的误分率决定


    W_new0=[]#存放本次迭代结束后的更新样本权重,方便下一轮迭代
    k=0
    L_preall=[]  #存放被该分类器预测的函数值
    for x in X:  #对于每一个样本 根据该样本是否被每轮迭代的最优分类器误分 来更新样本权重
        if x<=mi_s:
            L_pre=-1
        else:
            L_pre=1
        L_preall.append(L_pre)  #是被该分类器预测的值存成一个列表
        if L_pre==L[k]:
            value=W[k]*np.exp(-α)  #代表每一轮迭代后更新的样本权重,由该样本被本轮最优弱分类器是否误分决定该样本权重是增大还是减小
            W_new0.append(value)  #存储的仅是分子(还未进行归一化)
        else:
            value=W[k]*np.exp(α)
            W_new0.append(value)
        k+=1
    W_new=W_new0/np.sum(W_new0)   #存放本次迭代更新的归一化样本权重值,方便进行下一次迭代
    return W_new,mi_em,mi_s,α,L_preall    


#对于每一次迭代得到的各弱分类器,比较他们错分样本率 选择最小的作为本次迭代最优弱分类器
def find_min(Em,S):  

    miem=Em[0]
    loc=0
    for i in range(len(Em)):
        if miem>Em[i]:
            miem=Em[i]
            loc=i
    return miem,S[loc]  #返回本次迭代错分样本最小的分类器s以及样本错分率 方便计算该分类器的权重



if __name__=="__main__":

    X=[0,0,1,1,1,0,1,0,1,1]   #方便绘制散点图
    Y=[1,3,2,1,2,1,3,2,1,1]
    Z=[3,1,2,3,3,2,1,1,2,1]
    L=[-1,-1,-1,-1,-1,-1,-1,-1,1,1] 
    W=[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]
    alpha=[]
    L_prefinal=[]
    #第一轮迭代更新的输出(使用竖直特征构建分类器)
    for t in range(3):
        W_new,em,s,α,L_preall=classifier1(X,L,W)  #经过一次迭代之后得到的样本权重,样本误分率以及分类切分点
        print("本轮迭代之后样本权重更新为:\n{}\n最优弱分类器的误分样本率为:\n{}\n该最优弱分类器划分切分点为:\n{}\n该分类器的权重为:\n{}\n,该分类器预测的值:\n{}\n".format(W_new,em,s,α,L_preall))
        #print(α,L_preall)
        print("********************************************")
        alpha.append(α)
        L_prefinal.append(L_preall)


        #使用y作为划分特征(使用水平特征构建分类器)
        W_new1,em1,s1,α1,L_preall1=classifier1(Y,L,W_new)  #经过第二次迭代之后得到的样本权重,样本误分率以及分类切分点
        print("本轮迭代之后样本权重更新为:\n{}\n最优弱分类器的误分样本率为:\n{}\n该最优弱分类器划分切分点为:\n{}\n该分类器的权重为:\n{}\n,该分类器预测的值:\n{}\n".format(W_new1,em1,s1,α1,L_preall1))
        #print(α1,L_preall1)
        print("********************************************")
        alpha.append(α1)
        L_prefinal.append(L_preall1)


        W_new2,em2,s2,α2,L_preall2=classifier1(Z,L,W_new1)  #经过第二次迭代之后得到的样本权重,样本误分率以及分类切分点
        print("本轮迭代之后样本权重更新为:\n{}\n最优弱分类器的误分样本率为:\n{}\n该最优弱分类器划分切分点为:\n{}\n该分类器的权重为:\n{}\n该分类器预测的值:\n{}\n".format(W_new2,em2,s2,α2,L_preall2))
        #print(α2,L_preall2)
        alpha.append(α2)
        L_prefinal.append(L_preall2)

        W=W_new2

    finalvalue=0
    num=0

    for i in range(10):
        for j in range(3):
            finalvalue+=alpha[j]*L_prefinal[j][i]
        if finalvalue>0:
            finalvalue1=1
        else:
            finalvalue1=-1
        if finalvalue1==L[i]:
            num+=1
    print("正确率为:\n{}".format(num/10))

加油~

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiaowosiye/article/details/79948165

机器学习之机器学习绪论

-
  • 1970年01月01日 08:00

《机器学习实战》7:Adaboost

已经有三个月的时间没有写博文了,书倒是一直在看。实战看完了,看大数据,大数据看的差不多了,最近开始看《统计学习方法》,就是没有很好的记录下来,惭愧......   之前的几章都讲的是具体的分类器,...
  • zoufangyingzi
  • zoufangyingzi
  • 2014-12-22 11:21:57
  • 1368

机器学习实战之adaboost

1.概念定义 (1)元算法(meta-algorithm)/集成方法(ensemble method): 是对其他算法进行组合的一种方式.有多种集成方式: 不同算法的集成;同一算法在不同设置下...
  • sinat_17451213
  • sinat_17451213
  • 2016-04-04 11:15:54
  • 636

py2.7 : 《机器学习实战》 Adaboost 2.24号:ROC曲线的绘制和AUC计算函数

前言:可以将不同的分类器组合,这种组合结果被称为集成方法  、 元算法 使用:1.不同算法的集成 2.同一算法下的不同设置集成 3.不同部分分配给不同分类器的集成 算法介绍:AdaBoost 优点:泛...
  • qq_33638791
  • qq_33638791
  • 2017-02-21 17:17:13
  • 782

《机器学习实战》AdaBoost算法的分析与实现

=====================================================================   《机器学习实战》系列博客是博主阅读《机器学习实战》这本书...
  • Gamer_gyt
  • Gamer_gyt
  • 2016-05-11 10:41:52
  • 6757

《机器学习实战》adaboost代码matlab实现

  • 2014年09月12日 19:14
  • 3KB
  • 下载

《机器学习实战》(七)—— AdaBoost(提升树)

AdaBoost提升树例子将“身体”设为A,“业务”设为B,“潜力”设为C。对该题做大致的求解:这里我们只计算到了f2,相信读者也知道如何继续往下计算。这里特征的取值较少,所以直接使用是否等于某个取值...
  • u011239443
  • u011239443
  • 2017-08-17 09:50:20
  • 676

【机器学习实战-python3】Adaboost元算法提高分类性能

工具:PythonCharm 书中的代码是python2的,而我用的python3,结合实践过程,这里会标注实践时遇到的问题和针对python3的修改。 实践代码和训练测试数据可以参考这里 h...
  • sinat_17196995
  • sinat_17196995
  • 2017-03-16 21:46:09
  • 964

机器学习实战笔记7(Adaboost)

1:简单概念描述        Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都是分类器,首先我们需要简单介绍几个概念。 1:弱学习器:在二分情况下弱分类器的错误率会高于...
  • Lu597203933
  • Lu597203933
  • 2014-08-18 21:26:57
  • 8955

【读书笔记】机器学习实战 第7章 基于单层决策树的adaboost

机器学习实战 第7章 7.3-7.5 基于单层决策树的adaboost #!/usr/bin/python # -*- coding: utf-8 -*-from numpy import *de...
  • xiaxzhou
  • xiaxzhou
  • 2017-06-05 22:43:08
  • 851
收藏助手
不良信息举报
您举报文章:机器学习实战之Adaboost之机器学习作业记录(三)
举报原因:
原因补充:

(最多只允许输入30个字)