Adaboost实现鸢尾花分类

1.Aadboost算法

boosting思想算法

boosting算法是将弱学习器提升为强学习器的算法,其思想是用几个仅比随机猜测好的傻子学习器反复进行学习,每次学习时候都更关注上次分类错误的样本,过程如下:

  1. 从初始训练集训练一个基学习器:从训练集D中以无放回抽样方式随机抽取一个训练子集d1,用于弱学习机C1的训练。
  2. 根据基学习器的表现对样本进行调整,使先前分类错误的样本在下一次训练时得到更多的关注。
  3. 基于调整后的样本分布来训练下一个学习器。
  4. 重复进行,直到基学习器数目达到指定值T,将这T个学习器进行投票,组成多个弱学习器。

adaboost算法模型

Adaboost与原始的boosting过程不同,它使用整个训练集来训练弱学习机,其中训练样本在每次迭代中都会被重新赋予一个权重,在上一弱学习机错误的基础上进行学习,进而构建一个更加强大的分类器。

adaboost提高过程

  1. 训练过程:
    -对于每一个新的学习器,AdaBoost改变训练数据的权值,也就是样本的概率分布,其思想是将关注点放在被错误分类的样本上,减小上一轮被正确分类的样本权值,提高那些被错误分类的样本权值。然后,再根据所采用的一些基本机器学习算法进行学习。

  2. 集成过程
    -AdaBoost采用加权多数表决的方法,加大分类误差率小的弱分类器的权重,减小分类误差率大的弱分类器的权重。使正确率更高的分类器有更大的发言权

adaboost集成过程

  1. 在训练集中,给所有样本赋予相同的权重。比如训练集有m个样本,那么每
    个样本的权重都是1/m。
  2. 根据给定的迭代次数n,进行n次循环,其中第j次做如下操作:
  3. 训练一个加权的弱学习机:Cj = train(X, y, W)。W表示所有样本的权重矩阵。
  4. 用这个加权的弱学习机预测样本类标y’ = predict(Cj, X)。
  5. 计算权重错误率:
    ε= W(Y’ != Y)= w1(y1’ != y1) + w2(y2’ != y2) +…+ wn(yn’ != yn) ,
    Y’表示预测结果矩阵,Y表示真实类别矩阵。
    如果弱分类器预测错误,(yj’ != yj) == 1;
    如果弱分类器预测正确,(yj’ != yj) == 0。
    如果权重错误率ε= 0,则跳出循环,不用继续迭代了。
  6. 计算相关系数:αj =0.5*ln((1 - ε) / ε)。错误率越低,相关系数αj越大,这相当于给分类效果好的分类器在最后的投票中赋予更大的权重。
  7. 更新权重:
    W = Wexp(-αj * Y’ * Y),*
    如果某个样本预测错了,则:
    yj’ * yj == -1,-αj * yj’ * yj > 0,exp(-αj * yj’ * yj) > 1
    (exp(x)是计算e的x次方的指数函数),wj * exp(-αj * yj’ * yj) > wj。
    在更新权重这一步,实现了对误分类的样本赋予更高的权重。
  8. 归一化权重,使其和为1。(3)~(8)为一个迭代。
  9. 完成最终的预测:Y’ = sign() ,大于0为1,小于0为-1。

实验过程

导入模块

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.font_manager import FontProperties
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

导入数据
实验数据为鸢尾花

X = iris_data.data[:, [2, 3]]
y = iris_data.target
label_list = ['山鸢尾', '杂色鸢尾', '维吉尼亚鸢尾']

构造决策边界

def plot_decision_regions(X, y, classifier=None):
    marker_list = ['o', 'x', 's']
    color_list = ['r', 'b', 'g']
    cmap = ListedColormap(color_list[:len(np.unique(y))])

    x1_min, x1_max = X[:, 0].min()-1, X[:, 0].max()+1
    x2_min, x2_max = X[:, 1].min()-1, X[:, 1].max()+1
    t1 = np.linspace(x1_min, x1_max, 666)
    t2 = np.linspace(x2_min, x2_max, 666)

    x1, x2 = np.meshgrid(t1, t2)
    y_hat = classifier.predict(np.array([x1.ravel(), x2.ravel()]).T)
    y_hat = y_hat.reshape(x1.shape)
    plt.contourf(x1, x2, y_hat, alpha=0.2, cmap=cmap)
    plt.xlim(x1_min, x1_max)
    plt.ylim(x2_min, x2_max)

    for ind, clas in enumerate(np.unique(y)):
        plt.scatter(X[y == clas, 0], X[y == clas, 1], alpha=0.8, s=50,
                    c=color_list[ind], marker=marker_list[ind], label=label_list[clas])

训练模型

adbt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2, min_samples_split=20, min_samples_leaf=5),
                          algorithm="SAMME", n_estimators=10, learning_rate=0.8)
adbt.fit(X, y)

实验结果

sklearn中的adaboost分类器默认为决策树,其各项参数如下:
base_estimator:基分类器,默认是决策树,在该分类器基础上进行boosting,理论上可以是任意一个分类器,但是如果是其他分类器时需要指明样本权重。
n_estimators:基分类器提升(循环)次数,默认是50次,这个值过大,模型容易过拟合;值过小,模型容易欠拟合。
learning_rate:学习率,表示梯度收敛速度,默认为1,如果过大,容易错过最优值,如果过小,则收敛速度会很慢;该值需要和n_estimators进行一个权衡,当分类器迭代次数较少时,学习率可以小一些,当迭代次数较多时,学习率可以适当放大。
algorithm:boosting算法,也就是模型提升准则,有两种方式SAMME, 和SAMME.R两种,默认是SAMME.R,两者的区别主要是弱学习器权重的度量,前者是对样本集预测错误的概率进行划分的,后者是对样本集的预测错误的比例,即错分率进行划分的,默认是用SAMME.R。
random_state:随机种子设置。

  1. 首先设置基分类器迭代次数为10,学习率为0.8,分类器准确率为:0.9866666666666667,得到决策面如下:
    在这里插入图片描述

在这里插入图片描述
2. 增大基分类器迭代次数到300,保持学习率不变,准确率为:0.9933333333333333。可以发现步长相同的情况下,学习器个数越多效果越好。
3. 继续增大到600,在这里插入图片描述
可以看到,随着基础学习器迭代次数增加,准确率不再发生变化,说明在300时算法已经收敛 了。

发布了17 篇原创文章 · 获赞 0 · 访问量 461

猜你喜欢

转载自blog.csdn.net/yang_live/article/details/103749009