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、初始权重,所有样本权重一样都是 , m表示样本数量
2、接下来,进行for循环遍历k = 1,2,3,…k,表示k棵树
a) 使用具有权重 的样本集来训练数据,得到弱学习器
b) 计算训练集上的最大误差
c) 计算每个样本的相对误差
如果是线性误差,则:
如果是平方误差,则:
如果是指数误差,则:
d) 计算回归误差率
e) 计算弱学习器的权重
f) 更新样本权重分布
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]
'''