19- Adaboost多分类与回归 (集成算法) (算法)

Adaboost 多分类算法:

from sklearn.ensemble import AdaBoostClassifier
# 多分类问题,不是+1、-1  类别0,1,2
ada = AdaBoostClassifier(n_estimators=3,algorithm='SAMME',learning_rate=1.0)
ada.fit(X_train,y_train)  # 算法,工作:从X_train---y_train寻找规律

Adaboost 回归算法:

from sklearn.ensemble import AdaBoostRegressor
ada = AdaBoostRegressor(n_estimators=3,loss = 'linear',   # 线性,误差绝对值
                                 learning_rate=1)    # learning_rate 学习率
ada.fit(X,y)   # 训练

1、Adaboost多分类算例

1.1、导包

import numpy as np
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import tree
import graphviz

 1.2、加载数据

X,y = datasets.load_iris(return_X_y = True)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,
                                                 random_state = 1024)

1.3、建模

# 多分类问题,不是+1、-1
# 类别0,1,2
ada = AdaBoostClassifier(n_estimators=3,algorithm='SAMME',learning_rate=1.0)
ada.fit(X_train,y_train) #算法,工作:从X_train---y_train寻找规律
y_ = ada.predict(X_test)
proba_ = ada.predict_proba(X_test)
accuracy = ada.score(X_test,y_test)
print('--------------------算法准确率:',accuracy)
display(y_,proba_)

2、Adaboost回归算例

2.1、加载数据

import numpy as np
from sklearn.ensemble import AdaBoostRegressor
from sklearn import datasets
from sklearn import tree
import graphviz

X,y = datasets.load_boston(return_X_y=True)

2.2、建模

ada = AdaBoostRegressor(n_estimators=3,loss = 'linear',# 线性,误差绝对值
                                 learning_rate=1)#learning_rate 学习率
ada.fit(X,y)#训练
y_ = ada.predict(X)#预测
print(y_[:10])

2.3、模型可视化

dot_data = tree.export_graphviz(ada[0],filled=True)
graph = graphviz.Source(dot_data)
graph

2.4、回归树算法流程

1、初始权重,所有样本权重一样都是 ​\bg_white \small \frac{1}{m}, m表示样本数量

w_{(1)} = [w_{11},w_{12},..., w_{1m}],w_{1i} = \frac{1}{m},i = 1,2,...,m

2、接下来,进行for循环遍历k = 1,2,3,…k,表示k棵树

a) 使用具有权重 ​​\bg_white \small w_{(k)} 的样本集来训练数据,得到弱学习器​​G_k(x)

b) 计算训练集上的最大误差

E_k = max|y_i - G_k(x_i)|,i = 1,2,...,m

c) 计算每个样本的相对误差

如果是线性误差,则:​​​​e_{ki} = \frac{|y_i - G_k(x_i)|}{E_k}

如果是平方误差,则:​​​e_{ki} = \frac{(y_i - G_k(x_i))^2}{E_k^2}

如果是指数误差,则:​​​​e_{ki} = 1 - exp({-\frac{|y_i - G_k(x_i)|}{E_k}})

d) 计算回归误差率

​​e_k = \sum\limits_{i = 1}^mw_{ki}e_{ki}

e) 计算弱学习器的权重

​​beta = \frac{e_k}{1 - e_k}

​​\alpha_k = ln\frac{1}{beta}

f) 更新样本权重分布

​​w_{(k + 1)i} = w_{ki} \times beta^{1 - e_{ki}}

​​w_{(k + 1)i} = w_{(k + 1)i} / \sum\limits_{i=1}^mw_{(k+1)i}

2.4、第一棵树构建

w1 = np.full(shape = 506,fill_value=1/506)
y1_ = ada[0].predict(X)

# 计算预测值和目标值的误差
error_vector = np.abs(y1_ - y)
error_max = error_vector.max()
if error_max != 0:
    error_vector /= error_max # 归一化0~1

# 计算算法误差
estimator_error = (w1 * error_vector).sum()
print('第一棵树误差:',estimator_error)
print('算法误差:',ada.estimator_errors_)

# 计算算法权重
beta = estimator_error / (1. - estimator_error)
estimator_weight =  np.log(1. / beta)
print('第一棵树权重:',estimator_weight)
print('算法权重:', ada.estimator_weights_)

# 根据第一棵树更新权重
w2 = w1 * np.power(beta, (1. - error_vector))
w2 /= w2.sum()
# 输出
'''
第一棵树误差: 0.11315306016068988
算法误差: [0.11315306 0.11657419 0.18593167]
第一棵树权重: 2.0589309911688427
算法权重: [2.05893099 2.02527945 1.47666508]
'''

2.5、第二棵树构建

y2_ = ada[1].predict(X)

# 计算预测值和目标值的误差
error_vector = np.abs(y2_ - y)
error_max = error_vector.max()
if error_max != 0:
    error_vector /= error_max # 归一化

# 计算算法误差
estimator_error = (w2 * error_vector).sum()
print('第二棵树误差:',estimator_error)
print('算法误差:',ada.estimator_errors_)

# 计算算法权重
beta = estimator_error / (1. - estimator_error)
estimator_weight =  np.log(1. / beta)
print('第二棵树权重:',estimator_weight)
print('算法权重:', ada.estimator_weights_)

# 权重更新
w3 = w2 * np.power(beta, (1. - error_vector))
w3 /= w3.sum()
# 输出
'''
第二棵树误差: 0.11657418722530435
算法误差: [0.11315306 0.11657419 0.18593167]
第二棵树权重: 2.0252794479876193
算法权重: [2.05893099 2.02527945 1.47666508]
'''

2.6、第三棵树构建

y3_ = ada[2].predict(X)

# 计算预测值和目标值的误差
error_vector = np.abs(y3_ - y)
error_max = error_vector.max()
if error_max != 0:
    error_vector /= error_max

# 计算算法误差
estimator_error = (w3 * error_vector).sum()
print('第三棵树误差:',estimator_error)
print('算法误差:',ada.estimator_errors_)

# 计算算法权重
beta = estimator_error / (1. - estimator_error)
estimator_weight =  np.log(1. / beta)
print('第三棵树权重:',estimator_weight)
print('算法权重:', ada.estimator_weights_)
# 输出
'''
第三棵树误差: 0.1859316681718044
算法误差: [0.11315306 0.11657419 0.18593167]
第三棵树权重: 1.4766650774202654
算法权重: [2.05893099 2.02527945 1.47666508]
'''

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Adaboost回归是一种集成学习算法,用于解决回归问题。它的基本思想是通过串行训练多个弱回归模型,并根据它们的表现来调整每个模型的权重,从而得到一个强的回归模型。 在Adaboost回归中,首先初始化训练集中每个样本的权重。然后,通过多次迭代,每次迭代选择权重最高的样本,训练一个弱回归模型,并计算该模型的误差。在每次迭代中,被错误预测的样本的权重会被增加,而被正确预测的样本的权重会被减小。接下来,根据每个弱回归模型的误差率来计算对应模型的权重,并将其用于最终的强回归模型。 Adaboost回归的优点在于它能够处理复杂的非线性回归任务,并且对异常值有一定的鲁棒性。由于弱回归模型的串行训练,Adaboost回归在每次迭代中都会调整样本的权重,使得模型对于错误样本的关注度变高,从而提高了回归模型的准确性。 然而,Adaboost回归也存在一些缺点。首先,它对于噪声较大的数据集比较敏感。其次,它的训练过程耗时较长,因为每次迭代都需要重新调整样本的权重和训练模型。此外,Adaboost回归在处理多标签回归问题时可能性能不佳。 总结来说,Adaboost回归是一种集成学习算法,通过串行训练多个弱回归模型,并根据它们的表现来调整每个模型的权重,得到一个强的回归模型。它在处理复杂非线性回归任务时表现优秀,但对于噪声较大的数据集敏感,并且训练过程较耗时。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值