AdaBoostアルゴリズムの簡単な例


Bootstrappingアルゴリズムの主な考え方:
i)1つのサンプルセットDからn個のサンプルを繰り返しサンプリングする
ii)サンプリング毎のサブサンプルセットについて統計学習を行い,仮定Hiを得る.
iii)いくつかの仮説を組み合わせて最終的な仮説Hfinalを形成する
iv)最終的な仮定を特定の分類タスクに用いる
(2)Baggingアルゴリズムの主な考え方:
イ)訓練分類器
全体サンプルセットからn*をサンプリング
ii)分類器は投票を行い,最終的な結果は分類器投票の優勝結果である.
この2つのアルゴリズムは主に構想を提供し、本当の実用性はこの2つのアルゴリズム思想に基づくAdaBoostアルゴリズムである.
AdaBoostアルゴリズムプロセス:






  • これがAdaboostの構造で、最後の分類器YMは数個の弱い分類器(weak classifier)を組み合わせたもので、最後のm個の弱い分類器に相当して投票して分類を決定し、各弱い分類器の「発言権」α違います.
    skit-learndの一例は以下の通りである.
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.metrics import zero_one_loss
    from sklearn.ensemble import  AdaBoostClassifier
    import time
    a=time.time()
     
    n_estimators=400
    learning_rate=1
    X,y=datasets.make_hastie_10_2(n_samples=12000,random_state=1)
    X_test,y_test=X[2000:],y[2000:]
    X_train,y_train=X[:2000],y[:2000]
     
    dt_stump=DecisionTreeClassifier(max_depth=1,min_samples_leaf=1)
    dt_stump.fit(X_train,y_train)
    dt_stump_err=1.0-dt_stump.score(X_test,y_test)
     
    dt=DecisionTreeClassifier(max_depth=9,min_samples_leaf=1)
    dt.fit(X_train,y_train)
    dt_err=1.0-dt.score(X_test,y_test)
     
    ada_discrete=AdaBoostClassifier(base_estimator=dt_stump,learning_rate=learning_rate,n_estimators=n_estimators,algorithm='SAMME')
    ada_discrete.fit(X_train,y_train)
     
    ada_real=AdaBoostClassifier(base_estimator=dt_stump,learning_rate=learning_rate,n_estimators=n_estimators,algorithm='SAMME.R')
    ada_real.fit(X_train,y_train)
     
    fig=plt.figure()
    ax=fig.add_subplot(111)
    ax.plot([1,n_estimators],[dt_stump_err]*2,'k-',label='Decision Stump Error')
    ax.plot([1,n_estimators],[dt_err]*2,'k--',label='Decision Tree Error')
     
    ada_discrete_err=np.zeros((n_estimators,))
    for i,y_pred in enumerate(ada_discrete.staged_predict(X_test)):
        ada_discrete_err[i]=zero_one_loss(y_pred,y_test)    ######zero_one_loss
    ada_discrete_err_train=np.zeros((n_estimators,))
    for i,y_pred in enumerate(ada_discrete.staged_predict(X_train)):
        ada_discrete_err_train[i]=zero_one_loss(y_pred,y_train)
     
     
    ada_real_err=np.zeros((n_estimators,))
    for i,y_pred in enumerate(ada_real.staged_predict(X_test)):
        ada_real_err[i]=zero_one_loss(y_pred,y_test)
    ada_real_err_train=np.zeros((n_estimators,))
    for i,y_pred in enumerate(ada_real.staged_predict(X_train)):
        ada_discrete_err_train[i]=zero_one_loss(y_pred,y_train)
     
    ax.plot(np.arange(n_estimators)+1,ada_discrete_err,label='Discrete AdaBoost Test Error',color='red')
    ax.plot(np.arange(n_estimators)+1,ada_discrete_err_train,label='Discrete AdaBoost Train Error',color='blue')
    ax.plot(np.arange(n_estimators)+1,ada_real_err,label='Real AdaBoost Test Error',color='orange')
    ax.plot(np.arange(n_estimators)+1,ada_real_err_train,label='Real AdaBoost Train Error',color='green')
     
    ax.set_ylim((0.0,0.5))
    ax.set_xlabel('n_estimators')
    ax.set_ylabel('error rate')
     
    leg=ax.legend(loc='upper right',fancybox=True)
    leg.get_frame().set_alpha(0.7)
    b=time.time()
    print('total running time of this example is :',b-a)
    plt.show()