「機械学習の式の導出とコードの実装」第 10 章 - AdaBoost

「機械学習の公式導出とコード実装」の学習ノート、自分の学習プロセスを記録します。詳細な内容については、著者の本を購入してください。

エイダブースト

複数の単一モデルを組み合わせて包括的なモデルを作成する方法は、長い間、最新の機械学習モデルで採用されている主流の方法です - ( 集成模型) ensemble learningAdaBoost は、統合学習におけるブースティング フレームワークの古典的な代表です。

1 ブースト

集成学习弱分类器複数のクラスを 1 つに結合する强分类器この強分類器は、すべての弱分類器を利用して比較的最適なパフォーマンスを実現します。Boostingこれは、ブースティング アルゴリズム とも呼ばれる、弱分類器を強分類器に昇格させるアルゴリズムのクラスとして理解します提升算法簡単に言うと、ブースティングとは、一連の弱分類器を連続的にトレーニングするプロセスです。これにより、以前の弱分類器によって誤分類されたサンプルがフォローアップでより多くの注目を集め、最終的にこれらの分類器を最適な強分類器に結合します。

2 AdaBoost アルゴリズムの原理

AdaBoostフルネームAdaptive Boosting、翻訳すると自适应提升算法AdaBoost は、複数の弱分類器を学習し、トレーニング サンプルの重みを変更することでそれらを線形的に組み合わせて強分類器にするブースティング アルゴリズムです。
Boosting 法には 2 つの重要な問題があります。1 つはトレーニング中にサンプルの重みまたは確率分布を変更する方法、もう 1 つは複数の弱分類器を組み合わせて 1 つの強分類器にする方法です。
AdaBoost1 つは、前のラウンドで弱分類器によって誤分類されたサンプルの重みを増やし、正しく分類されたサンプルの重みを減らすこと、もう 1 つは複数の弱分類器を線形結合して、良好な分類効果を持つ弱分類器の重みを増やし、重みを減らすことです。分類エラー率が高い弱分類器の重み。モデル、損失関数、アルゴリズム
ここに画像の説明を挿入
ここに画像の説明を挿入
AdaBoost分類学習モデルです。( ) は複数のベースモデルの合計から構築されたモデルです。加性模型指数函数前向分步
加性模型additive model
ここに画像の説明を挿入
ここに画像の説明を挿入

3 AdaBoost アルゴリズムの実装

まず、基本分類子を定義する必要があります。一般に、決定木または决策树桩( dicision stump) を基本分類子として使用できます。決定木スタンプは、単一層の決定構造のみを持つ決定木であり、1 つの層についてのみ分類決定を実行します。特徴。デシジョン ツリーは、多層の意思決定構造を持つツリー分類モデルであり、複数の特徴に対して分類の決定を行うことができます。

# 定义决策树桩类
class DecisionStump: # 作为AdaBoost的弱分类器
    def __init__(self):
        self.label = 1 # 基于划分阈值决定将样本分类为1还是-1
        self.feature_index = None # 特征索引
        self.threshold = None # 特征划分阈值
        self.alpha = None # 基分类器的权重

AdaBoostアルゴリズム フローのクラシック バージョン。权重初始化训练弱分类器计算当前分类误差计算弱分类器的权重および が含まれます更新训练样本权重

import numpy as np
class Adaboost:

    def __init__(self, n_estimators=5): # 弱分类器个数
        self.n_estimators = n_estimators
    
    def fit(self, X, y): # adaboost拟合函数
        m, n = X.shape
        w = np.full(m, (1/m)) # (1)初始化权重分布为均匀分布1/N
        self.estimators = [] # 初始化基分类器列表
        for _ in range(self.n_estimators):
            estimator = DecisionStump() # (2.a) 训练一个弱分类器:决策树桩
            min_error = float('inf') # 设定一个最小化误差
            for i in range(n): # 遍历数据集特征,根据最小分类误差率选择最优特征
                unique_values = np.unique(X[:, i])
                for threshold in unique_values: # 尝试将每一个特征值作为分类阈值
                    p = 1
                    pred = np.ones(np.shape(y)) # 初始化所有预测值为1
                    pred[X[:, i] < threshold] = -1 # 小于分类阈值的预测值为-1
                    error = sum(w[y != pred]) # (2.b) 计算分类误差率
                    if error > 0.5: # 如果分类误差率大于0.5,则进行正负预测反转,例如error = 0.6 => (1 - error) = 0.4
                        error = 1 - error
                        p = -1
                    if error < min_error: # 一旦获得最小误差,则保存相关参数配置
                        estimator.label = p
                        estimator.threshold = threshold
                        estimator.feature_index = i
                        min_error = error
                        
            estimator.alpha = 0.5 * np.log((1.0 - min_error) / (min_error + 1e-9)) # (2.c)计算基分类器的权重
            preds = np.ones(np.shape(y)) # 初始化所有预测值为1
            negative_idx = (estimator.label * X[:, estimator.feature_index] < estimator.label * estimator.threshold) # 获取所有小于阈值的负类索引
            preds[negative_idx] = -1 # 将负类设为-1
            w *= np.exp(-estimator.alpha * y * preds) # (10-5)
            w /= np.sum(w)
            self.estimators.append(estimator) # 保存该弱分类器

    def predict(self, X): # 定义adaboost预测函数
        m = len(X)
        y_pred = np.zeros((m, 1))
        for estimator in self.estimators: # 计算每个基分类器的预测值
            predictions = np.ones(np.shape(y_pred)) # 初始化所有预测值为1
            negative_idx = (estimator.label * X[:, estimator.feature_index] < estimator.label * estimator.threshold) # 获取所有小于阈值的负类索引
            predictions[negative_idx] = -1 # 将负类设为-1
            y_pred += estimator.alpha * predictions # 对每个基分类器的预测结果进行加权
        y_pred = np.sign(y_pred) # 返回最终预测结果
        return y_pred
from sklearn.model_selection import train_test_split
from sklearn.datasets._samples_generator import make_blobs # 导入模拟二分类数据生成模块
from sklearn.metrics import accuracy_score
X, y = make_blobs(n_samples=150, n_features=2, centers=2, cluster_std=1.2, random_state=40) # 生成模拟二分类数据集
y_ = y.copy()
y_[y_==0] = -1
y_ = y_.astype(float)
X_train, X_test, y_train, y_test = train_test_split(X, y_, test_size=0.3, random_state=40)
clf = Adaboost(n_estimators=5)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(accuracy)
0.9777777777777777

4. sklearnに基づいてAdaBoostアルゴリズムを実装する

AdaBoost分類モデルはsklearnensembleモジュールの下で呼び出されますAdaBoostClassifier

from sklearn.ensemble import AdaBoostClassifier
clf_ = AdaBoostClassifier(n_estimators=5, random_state=40)
y_pred_ = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(accuracy)
0.9777777777777777

最も広く使用されている弱分類器はデシジョン ツリーとニューラル ネットワークで、デシジョン ツリーは CART を使用します。
Notebook_Github アドレス

おすすめ

転載: blog.csdn.net/cjw838982809/article/details/131231711