集成学习中笔记03 boosting思路和adaboost算法

集成学习中笔记03 boosting思路和adaboost算法

boosting算法与bagging算法不同,主要在通过不断的训练,减小预测偏差。具体开源学习内容可参考:datawhale

1.boosting方法的基本思路

boosting算法简单来说,是对一系列弱分类器的结果进行组合,构成一个强分类器,以减少模型预测的偏差。大多数的boosting方法都是通过改变训练数据集的概率分布(训练数据不同样本的权值),针对不同概率分布的数据调用弱分类算法学习一系列的弱分类器。
与bagging算法不同的是,boosting训练的一直都是同一组数据集

2.Adaboost算法

adaboost算法是boosting算法的一种,通过对多个弱分类器的分类结果进行权重组合,使分类错误率较低的弱分类器在表决中起到较大的作用。
adaboost中,最终分类器的权重之和并不等于1

2.1 基本原理

从adaboost的计算过程中可以看出它的基本原理:

  • 首先确定长度为N的二分类数据各自的权重,初始化一般设定权重为1/N
  • 确定权重之后,按现有权重计算弱分类器的分类误差率(这里可以随意选择分类器,常用的有随机森林、决策树等
  • 根据弱分类器的分类误差率,更新训练数据集的权重分布。权重更新遵循:被错误分类的样本,增大权重
  • 重复以上步骤M次,可得到M个不同的分类器,对这些分类器进行线性组合,可得到最终的分类器

2.2 案例

以下通过鸢尾花数据对adaboost的算法进行建模:

# 引入数据科学相关工具包:
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
plt.style.use("ggplot")
%matplotlib inline
import seaborn as sns

# 加载训练数据:鸢尾花数据
from sklearn import datasets
iris = datasets.load_iris()
irisFeatures = iris["data"]
irisFeaturesName = iris["feature_names"]
irisLabels = iris["target"]
#这里需要注意,鸢尾花的标签为0、1、2,属于多分类问题

X=irisFeatures
y=irisLabels

# 将分类标签变成二进制编码:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)

# 按8:2分割训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=1,stratify=y) 
# stratify参数代表了按照y的类别等比例抽样

# 使用单一决策树建模
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(criterion='entropy',random_state=1,max_depth=1)#
from sklearn.metrics import accuracy_score
tree = tree.fit(X_train,y_train)
y_train_pred = tree.predict(X_train)
y_test_pred = tree.predict(X_test)
tree_train = accuracy_score(y_train,y_train_pred)
tree_test = accuracy_score(y_test,y_test_pred)
print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test))

Decision tree train/test accuracies 0.667/0.667
但当决策树使用默认参数时:Decision tree train/test accuracies 1.000/0.967

# 使用sklearn实现Adaboost(基分类器为决策树)
'''
AdaBoostClassifier相关参数:
base_estimator:基本分类器,默认为DecisionTreeClassifier(max_depth=1)
n_estimators:终止迭代的次数
learning_rate:学习率
algorithm:训练的相关算法,{'SAMME','SAMME.R'},默认='SAMME.R'
random_state:随机种子
'''
from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier(base_estimator=tree)
ada = ada.fit(X_train,y_train)
y_train_pred = ada.predict(X_train)
y_test_pred = ada.predict(X_test)
ada_train = accuracy_score(y_train,y_train_pred)
ada_test = accuracy_score(y_test,y_test_pred)
print('Adaboost train/test accuracies %.3f/%.3f' % (ada_train,ada_test))

Adaboost train/test accuracies 1.000/0.967

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值