欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用sklearn做手写数字识别 模型:AdaBoostClassifier

程序员文章站 2022-03-22 17:13:39
...

1.加载数据集 导包

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets,cross_validation,ensemble

def load_classification_data():
    '''
    加载分类模型使用的数据集
    return 一个元组,依次为:训练样本集 测试样本集 测试样本的标记 测试样本的标记
    '''
    digits=datasets.load_digits()
    return cross_validation.train_test_split(digits.data,digits.target,test_size=0.25,random_state=0,stratify=digits.target)

AdaBoostClassifier这个模型中,几个比较重要的参数:学习器的数量,学习率,选用何种分类器,选用哪种算法。

2.测试AdaBoostClassifier的预测性能随基础分类器的数量的影响

def test_AdaBoostClassifier(*data):
    '''
    测试AdaBoostClassifier的用法 ,绘制测试AdaBoostClassifier的预测性能随基础分类器的数量的影响
    param data 可变参数 一个元组 训练样本集.测试样本集,训练样本的标记.测试样本的标记
    return None
    '''
    x_train,x_test,y_train,y_test=data
    clf = ensemble.AdaBoostClassifier(learning_rate=0.1)#参数 学习率
    clf.fit(x_train,y_train)
    #绘图
    fig = plt.figure()
    ax=fig.add_subplot(111)
    estimators_nums=len(clf.estimators_)#学习器的数量
    x=range(1,estimators_nums+1)
    ax.plot(list(x),list(clf.staged_score(x_train,y_train)),label='train score')#返回X,y的分阶段分数。
    ax.plot(list(x),list(clf.staged_score(x_test,y_test)),label='test score')
    ax.set_xlabel('estimators num')
    ax.set_ylabel('score')
    ax.legend(loc='best')
    ax.set_title('AdaBoostClassifier')
    plt.show()


X_train,X_test,y_train,y_test=load_classification_data()#获取分类数据
test_AdaBoostClassifier(X_train,X_test,y_train,y_test)

使用sklearn做手写数字识别 模型:AdaBoostClassifier

总结:随着算法的推进,每一轮迭代都产生一个新的个体分类器被集成。此时集成分类器的训练误差和测试误差都在下降。当个体分类,数量达到一定值时,集成分类器的预测准确率再一定范围内波动比较稳定,这证明:集成学习能很好地抵抗过拟合 训练集和测试集表现相似

3.考察不同类型的个体分类器的影响  策树个体分类器以及高斯分布贝叶斯分类器的差别

def test_AdaBoostClassifier_base_classifier(*data):
    '''
    测试AdaBoostClassifier的用法,绘制测试AdaBoostClassifier的预测性能随基础分类器数量的影响
    
    :param data:可变参数。它是一个元组,这里要求其元素依次为:训练样本集.测试样本集,训练样本的标记.测试样本的标记
    return: None
    '''
    from sklearn.naive_bayes import GaussianNB  #朴素贝叶斯分类器
    X_train,X_test,y_train,y_test=data
    fig=plt.figure(figsize=(10,20))
    ax=fig.add_subplot(2,1,1)
    ###############默认的个体分类器################
    clf=ensemble.AdaBoostClassifier(learning_rate=0.1)
    clf.fit(X_train,y_train)
    #绘图
    estimators_num=len(clf.estimators_)#学习器数量
    X=range(1,estimators_num+1)
    ax.plot(list(X),list(clf.staged_score(X_train,y_train)),label='Traing score')
    ax.plot(list(X),list(clf.staged_score(X_test,y_test)),label='Testing score')
    ax.set_xlabel('estimators num')
    ax.set_ylabel('score')
    ax.legend(loc='lower right')
    ax.set_ylim(0,1)
    ax.set_title('AdaBoostClassifier with Decision Tree')
    ###############Gaussian  Naive  Bayes  个体分类器  ######
    ax=fig.add_subplot(2,1,2)
    clf=ensemble.AdaBoostClassifier(learning_rate=0.1,base_estimator=GaussianNB())
    clf.fit(X_train,y_train)
    #绘图
    estimators_num=len(clf.estimators_)#学习器数量
    X=range(1,estimators_num+1)
    ax.plot(list(X),list(clf.staged_score(X_train,y_train)),label='Traing score')
    ax.plot(list(X),list(clf.staged_score(X_test,y_test)),label='Testing score')
    ax.set_xlabel('estimators num')
    ax.set_ylabel('score')
    ax.legend(loc='lower right')
    ax.set_ylim(0,1)
    ax.set_title('AdaBoostClassifier with Decision Tree')
    plt.show()

test_AdaBoostClassifier_base_classifier(X_train,X_test,y_train,y_test)

总结:默认分类器是决策树,后来使用高斯朴素贝叶斯,由于高斯分布bayes个体分类器本身就是强分类器,所以它没有一个明显的预测准确率提升的过程,整体曲线都比较平缓

4.学习率 默认采用了SAMME.R算法

def test_AdaBoostClassifier_learn_rate(*data):
    '''
    测试AdaBoostClassifier 分类器数量一定的情况下 不同的学习率的影响
    param data 可变参数。它是一个元组,这里要求其元素依次为:训练样本集.测试样本集,训练样本的标记.测试样本的标记
    return None
    '''
    x_train,x_test,y_train,y_test = data
    learn_rates=np.linspace(0.01,1)
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    train_score = []
    test_score=[]
    for rate in learn_rates:
        clf = ensemble.AdaBoostClassifier(learning_rate=rate,n_estimators=500)
        clf.fit(x_train,y_train)
        train_score.append(clf.score(x_train,y_train))
        test_score.append(clf.score(x_test,y_test))
    ax.plot(learn_rates,train_score,label="train_score")
    ax.plot(learn_rates,test_score,label="test_score")
    ax.set_xlabel("learn_rate")
    ax.set_ylabel("score")
    ax.legend(loc="best")
    ax.set_title("AdaBoostClassifier")
    plt.show()
    
test_AdaBoostClassifier_learn_rate(X_train,X_test,y_train,y_test)

总结:当学习率较小时 测试准确率和训练准确率随着学习率的增大而缓慢上升,但超过0.7后迅速下降 通常较小的学习率会要求更多的弱学习器,比较小的学习率更能带来更小的测试误差 推荐<=1 同时选择一个很大的学习器数量

5.SAMME算法 

def test_AdaBoostClassifier_learn_rate(*data):
    '''
    测试AdaBoostClassifier 分类器数量一定的情况下 不同的学习率的影响
    param data 可变参数。它是一个元组,这里要求其元素依次为:训练样本集.测试样本集,训练样本的标记.测试样本的标记
    return None
    '''
    x_train,x_test,y_train,y_test = data
    learn_rates=np.linspace(0.01,1)
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    train_score = []
    test_score=[]
    for rate in learn_rates:
        clf = ensemble.AdaBoostClassifier(learning_rate=rate,n_estimators=500,algorithm='SAMME')
        clf.fit(x_train,y_train)
        train_score.append(clf.score(x_train,y_train))
        test_score.append(clf.score(x_test,y_test))
    ax.plot(learn_rates,train_score,label="train_score")
    ax.plot(learn_rates,test_score,label="test_score")
    ax.set_xlabel("learn_rate")
    ax.set_ylabel("score")
    ax.legend(loc="best")
    ax.set_title("AdaBoostClassifier")
    plt.show()
    
test_AdaBoostClassifier_learn_rate(X_train,X_test,y_train,y_test)

 

相关标签: sklearn