集成学习中笔记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