task_5

Task05:adaboost的分类和回归

AdaBoost:
  • 优点:泛化错误率低, 码,可以应用在大部分分类器上,无参数调 。

  • 缺点:对离 点敏 。

  • 适用数据类型:数值型和标 型数据。

AdaBoost的一般流程:

能否使用弱分类器和多个实例来构建一个强分类器?这是一个非常有趣的理论问题。这里的“弱”意味着分类器的性能比随机猜测要略好,但是也不会好太多。这就是说,在二分类情况下弱分类器的错误率会高于5 0 %,而 “强”分类器的错误率将会低很多。AdaBoost运行过程如下:训练数据中的每个样本,并赋予其一个权重,这些权重构成了向量乃。一开始,这些权重都初始化成相等值。首 先在训练数据上训练出一个弱分类器并计算该分类器的错误率,然后在同一数据集上再次训练弱分类器。在分类器的第二次训练当中,将会重新调整每个样本的权重,其中第一次分对的样本的权重将会降低,而第一次分错的样本的权重将会提高。为了从所有弱分类器中得到最终的分类结果 ,AdaBoost为每个分类器都分配了一个权重值alpha,这些alpha值是基于每个弱分类器的错误率进行计算的。
在这里插入图片描述
在这里插入图片描述

class AdaBoost:
    def __init__(self, n_estimators=100):
        self.clf_num = n_estimators
    
    def init_args(self, X, y):
        
        self.X = X
        self.y = y
        M, _ = X.shape
        
        self.models = []
        self.alphas = []
        self.weights = np.ones(M) / M # 1
    
    def fit(self, X, y):
        self.init_args(X, y)
        
        for n in range(self.clf_num):
            cla = DecisionTreeClassifier(max_depth=1) # weak cla
            cla.fit(X, y, sample_weight=self.weights) # 2(a)
            P = cla.predict(X) 
            
            err = self.weights.dot(P != y) # 2(b) 8.1
            alpha = 0.5*(np.log(1 - err) - np.log(err)) # 2(c) 8.2
            
            self.weights = self.weights * np.exp(-alpha * y * P)
            self.weights = self.weights / self.weights.sum() # 2(d) 8.3, 8.4, 8.5
            
            self.models.append(cla)
            self.alphas.append(alpha)
            
        return 'Done!'
    
    def predict(self, x):
        N, _ = x.shape
        FX = np.zeros(N)
        
        for alpha, cla in zip(self.alphas, self.models):
            FX += alpha * cla.predict(x)

        return np.sign(FX)
    
    def score(self, X_test, y_test):
        p = self.predict(X_test)
        r = np.sum(p == y_test)
        
        return r/len(X_test)
    
    def _weights(self):
        return self.alphas, self.weights, self.models

    adaboost = AdaBoost()
adab
oost.fit(X_train, y_train)
#输出 'Done!'
adaboost.score(X_test, y_test)
#输出 1.0
sklearn.ensemble.AdaBoostClassifier、AdaBoostRegressor参数总结:
  • algorithm:这个参数只有AdaBoostClassifier有。主要原因是scikit-learn实现了两种Adaboost分类算法,SAMME和SAMME.R。两者的主要区别是弱学习器权重的度量,SAMME使用了和我们的原理篇里二元分类Adaboost算法的扩展,即用对样本集分类效果作为弱学习器权重,而SAMME.R使用了对样本集分类的预测概率大小来作为弱学习器权重。由于SAMME.R使用了概率度量的连续值,迭代一般比SAMME快,因此AdaBoostClassifier的默认算法algorithm的值也是SAMME.R。我们一般使用默认的SAMME.R就够了,但是要注意的是使用了SAMME.R, 则弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器。SAMME算法则没有这个限制。
  • n_estimators: AdaBoostClassifier和AdaBoostRegressor都有,就是我们的弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
  • learning_rate: AdaBoostClassifier和AdaBoostRegressor都有,即每个弱学习器的权重缩减系数ν
  • base_estimator:AdaBoostClassifier和AdaBoostRegressor都有,即我们的弱分类学习器或者弱回归学习器。理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。我们常用的一般是CART决策树或者神经网络MLP。

【练习】左侧公式的第二个等号是由于当样本分类正确时,…,当样本分类错误时, …请说明原因。

????不太理解

【练习】对公式进行化简,写出K=2K=2时的SAMME算法流程,并与李航《统计学习方法》一书中所述的Adaboost二分类算法对比是否一致。

【练习】在sklearn源码中找出算法流程中每一行对应的处理代码。

【练习】算法2第12行中给出了ff输出的迭代方案,但在sklearn包的实现中使用了I{G∗(x)=S(y)}I{G∗(x)=S(y)}来代替b∗(m)(x)b∗(m)(x)。请根据本文的实现,对sklearn包的源码进行修改并构造一个例子来比较它们的输出是否会不同。(提示:修改AdaboostClassifier类中的decision_function函数和staged_decision_function函数)

待补

并构造一个例子来比较它们的输出是否会不同。(提示:修改AdaboostClassifier类中的decision_function函数和staged_decision_function函数)*

待补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值