AdaBoost.M1算法

1. 算法思想

        AdaBoost.M1算法是基于AdaBoost算法的一个改进版本,当然还有第二个,称之为AdaBoost.M2算法,两种算法详情请参阅论文《Experiments with a New Boosting Algorithm》。

        最早的AdaBoost算法是一种二分类算法,类标签为{+1,-1},该算法计算基分类器的分类误差率和权重参数都是基于此类标签的指示函数进行调整的。策略为:依据当前分类器的分类错误率,调整样本权值分布,保证错误分类样本的权重增大,正确分类样本的权重减小;且调整当前分类器在最终决策的权重。

        AdaBoost.M1将其改进为多分类的算法,类标签为{1,2,3,...C},基于此在串行集成的策略前提下,AdaBoost算法的分类错误率、决策权重计算方式以及决策函数将不再适用,所以该算法对这三处的计算公式进行改进。当然,此时的策略为:依据当前分类器的分类错误率,调整样本权值分布,保证错误分类样本的权重不变(与AdaBoost不同),正确分类样本的权重减小;且调整当前分类器在最终决策的权重(与AdaBoost的调整公式是相同的)。

2. 算法流程

 

è¿éåå¾çæè¿°

    以上为两种写法,个人认为第二种写法更清晰明了一点。

3. 代码实现

1. 本实验采用的是田纳西-伊斯曼过程数据集(当然也可以采用别的多分类数据集,都已尝试过);

2. 对比实验 仅使用softmax分类器、自编AdaBoost.M1以及sklearn库中的AdaBoostClassifer;

# -*-coding:utf-8 -*-
import numpy as np
import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

def load_TE_set(data_path,label_path):
    X = pd.read_csv(data_path,header=None)
    Y = pd.read_csv(label_path,header=None)
    return np.array(X).T,np.array(Y).squeeze()

class AdaBoost:
    # 基分类器默认为多分类的逻辑回归
    def __init__(self,m,\
        clf=LogisticRegression(multi_class="multinomial", solver="lbfgs", C=10)):
        # 基分类器数量
        self.m = m
        # 基分类器模型
        self.clf = clf
        # 缓存基分类器和权重参数
        self.clf_arr = []
        self.alpha_arr = []

    # 指定训练数据集、基分类器、迭代次数
    def fit(self,X,Y):
        num = X.shape[0]
        # 初始化样本权重
        W = np.ones(num) / num

        # 迭代
        for i in range(self.m):
            # 基分类器预测
            self.clf.fit(X, Y, sample_weight=W)
            self.clf_arr.extend([self.clf])
            Y_pred = self.clf.predict(X)

            # 分类误差率
            indic_arr = [1 if Y_pred[i] != Y[i] else 0 for i in range(num)]
            err = np.dot(W, np.array(indic_arr))
            print("classify error rate is ",err)

            # 分类器系数
            alpha = (1-err)/err
            self.alpha_arr.extend([alpha])

            # 更新权重
            temp = W * (alpha**[1-i for i in indic_arr])
            W = temp / np.sum(temp)
        return self

    def predict(self, X):
        num = X.shape[0]
        mulit_idx_pred = []
        mulit_Y_pred = []
        for i in range(self.m):
            Y_pred = self.clf_arr[i].predict(X)
            mulit_Y_pred.append(Y_pred.tolist())

            indic_arr = [1 if Y_pred[i] == Y[i] else 0 for i in range(num)]
            temp = [np.log(self.alpha_arr[i])*k for k in indic_arr]
            mulit_idx_pred.append(temp)
        # 保存各个基分类器预测的最大索引
        max_idx_pred = np.array(mulit_idx_pred).argmax(axis=0)
        # 保存各个基分类器的预测值
        mulit_Y_pred = np.array(mulit_Y_pred).T
        # 获取最大索引对应的预测标签
        result = np.array([x[max_idx_pred[i]] for i,x in enumerate(mulit_Y_pred)],dtype=np.float64)
        return result

    def score(self,X,Y):
        Y_pred = self.predict(X)
        count = 0.
        for i in range(Y.shape[0]):
            if Y_pred[i]==Y[i]:
                count +=1
        return count/np.float(Y.shape[0])

if __name__=="__main__":
    # 读取三分类数据集
    data_path = "X_src.csv"
    label_path = "Y_src.csv"
    X,Y = load_TE_set(data_path, label_path)
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.4,random_state=0)
    print("the shape of dataset is ",Y_train.shape,Y_test.shape)

    # softmax基分类器三分类
    clf = LogisticRegression(multi_class="multinomial", solver="lbfgs", C=10)
    num = X_train.shape[0]
    # 初始化样本权重
    W = np.ones(num) / num
    clf.fit(X_train,Y_train,sample_weight=W)
    print("train accuracy is ",clf.score(X_train,Y_train))
    print("test accuracy is ",clf.score(X_test,Y_test))

    # 自编Adaboost
    # adaboost = AdaBoost(2)
    # adaboost.fit(X_train,Y_train)
    # print("train accuracy is ",adaboost.score(X_train,Y_train))
    # print("test accuracy is ",adaboost.score(X_test,Y_test))

    # sklearn AdaBoostClassifier
    # adaboost = AdaBoostClassifier(base_estimator=LogisticRegression(),n_estimators=3)
    # adaboost.fit(X_train,Y_train)
    # print("train accuracy is ",adaboost.score(X_train,Y_train))
    # print("test accuracy is ",adaboost.score(X_test,Y_test))

 

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值