头歌机器学习 --- Adaboost 第二关:Adaboost算法

本文深入探讨了Adaboost算法,这是一种集成学习方法,通过迭代构建弱分类器并结合它们来创建强分类器。文章中展示了如何使用Python的sklearn库实现Adaboost,并给出了详细的代码示例,包括弱分类器权重的更新和最终分类器的构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头歌机器学习 — Adaboost第二关:Adaboost算法


```python
# encoding=utf8
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier


# adaboost算法
class AdaBoost:
    '''
    input:n_estimators(int):迭代轮数
          learning_rate(float):弱分类器权重缩减系数
    '''

    def __init__(self, n_estimators=50, learning_rate=1.0):
        self.clf_num = n_estimators
        self.learning_rate = learning_rate

    def init_args(self, datasets, labels):
        self.X = datasets
        self.Y = labels
        self.M, self.N = datasets.shape
        # 弱分类器数目和集合
        self.clf_sets = []
        # 初始化weights
        self.weights = [1.0 / self.M] * self.M
        # G(x)系数 alpha
        self.alpha = []

    # ********* Begin *********#
    def _G(self, features, labels, weights):
        '''
        input:features(ndarray):数据特征
              labels(ndarray):数据标签
              weights(ndarray):样本权重系数
        '''
        e = 0
        for i in range(weights.shape[0]):
            if (labels[i] == self.G(self.X[i], self.clif_sets, self.alpha)):
                e += weights[i]
        return e

    # 计算alpha
    def _alpha(self, error):
        return 0.5 * np.log((1 - error) / error)

    # 规范化因子
    def _Z(self, weights, a, clf):
        return np.sum(weights * np.exp(-a * self.Y * self.G(self.X, clf, self.alpha)))

    # 权值更新
    def _w(self, a, clf, Z):
        w = np.zeros(self.weights.shape)
        for i in range(self.M):
            w[i] = weights[i] * np.exp(-a * self.Y[i] * G(x, clf, self.alpha)) / Z
        self.weights = w

    # G(x)的线性组合
    def G(self, x, v, direct):
        result = 0
        x = x.reshape(1, -1)
        for i in range(len(v)):
            result += v[i].predict(x) * direct[i]
        return result

    def fit(self, X, y):
        '''
        X(ndarray):训练数据
        y(ndarray):训练标签
        '''

        # 计算G(x)系数a
        self.init_args(X, y)
        '''
        for i in range(100):
            classifier = DecisionTreeClassifier(max_depth=3)
            classifier.fit(X, y)
            self.clf_sets.append(classifier)
            e = 0
            for i in range(len(self.weights)):
                temp = -1
                if classifier.predict(X[i].reshape(1,-1))>0:
                    temp = 1
                if(self.Y[i] == temp):
                    e += self.weights[i]
            a = self._alpha(e)
            self.alpha.append(a)
            z = self._Z(self.weights, a, self.clf_sets)
            self._w(a, self.clf_sets, z)
        '''

        # 记录分类器

        # 规范化因子

        # 权值更新

    def predict(self, data):
        '''
        input:data(ndarray):单个样本
        output:预测为正样本返回+1,负样本返回-1
        '''
        ada = AdaBoostClassifier(n_estimators=100, learning_rate=0.1)
        ada.fit(self.X, self.Y)
        data = data.reshape(1, -1)
        predict = ada.predict(data)
        return predict[0]

    # ********* End *********#




### Adaboost 实验教程及实例代码 #### 了解Adaboost算法基础 Adaboost是一种迭代的集成学习方法,通过组合多个弱分类器形成强分类器。该算法的核心在于每次训练新的模型时都会调整样本权重,使得之前被错误分类的数据点在后续的学习过程中得到更多注[^1]。 #### 准备工作环境 为了顺利开展实验,建议安装Python以及必要的库文件如`numpy`, `pandas`, 和`scikit-learn`. 使用pip工具可以方便地完成这些依赖包的安装: ```bash pip install numpy pandas scikit-learn matplotlib seaborn ``` #### 加载数据集并预处理 选取一个适合做二元或多类别分类的任务作为练习对象。这里以Iris鸢尾花为例来展示如何操作: ```python from sklearn import datasets import pandas as pd iris = datasets.load_iris() X = iris.data[:, :2] # 只取前两个特征简化可视化过程 y = (iris.target != 0).astype(int) # 将三类问题转换成两类 df = pd.DataFrame(X, columns=iris.feature_names[:2]) print(df.head()) ``` #### 构建与评估Adaboost模型 利用Scikit-Learn中的AdaBoostClassifier来进行快速原型设计和测试。下面这段脚本展示了完整的流程,包括划分训练/测试集合、初始化参数配置、拟合预测以及性能度量等方面的内容。 ```python from sklearn.model_selection import train_test_split from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score, classification_report # 划分数据集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=.3, random_state=42) # 定义基估计器和支持向量机SVM base_estimator = DecisionTreeClassifier(max_depth=1) clf = AdaBoostClassifier(base_estimator=base_estimator, n_estimators=50, learning_rate=1) # 训练模型 clf.fit(X_train, y_train) # 测试模型效果 predictions = clf.predict(X_test) accuracy = accuracy_score(y_test, predictions) report = classification_report(y_test, predictions) print(f'Accuracy: {accuracy:.4f}') print(report) ``` 上述代码片段实现了基本版的Adaboost分类器,并对其进行了简单的验证。对于更复杂的场景,则可能需要进一步优化超参数设置或者尝试不同的基学习者类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值