AdaBoost实战
AdaBoost原理
Ensemble Learning(集成学习)
集成学习是指集合多个弱分类器以形成一个集成的强分类器。集成学习的框架可以通过下图来反映
也就是说,集成学习是一种集合了多个机器学习模型的“意见”,已完成最后决策的机制。
常见的集成学习策略有三种:
- Bagging
- Boosting
- Stacking
Bagging和Boosting的不同可以通过下面这张图来理解
Bagging对数据集进行随机采样,构成 N N N 组,然后每组使用模型单独训练,最后进行表决,是一种类似于串联的结构。而Boosting则是不改变训练集的情况下,不断调整样本权重来调优弱分类器性能,实际上是一种串行的思路。
而我们接下来要探讨的AdaBoost是属于Boosting策略型集成算法的一种。
AdaBoost工作机制
分类器实现
准备工作
以下是我们需要用的工具
import numpy as np
import pandas as pd
from random import seed
from random import randrange
from math import sqrt
from math import exp
from math import pi
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score, RepeatedStratifiedKFold
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
import operator
import plotly.express as px
from plotly.offline import init_notebook_mode
init_notebook_mode(connected=True)
import plotly.graph_objects as go
from plotly.subplots import make_subplots
基本接口调用
从最简单的开始,我们调用sklearn的AdaBoost分类器接口,完成最基本的实现。
# 随机创建一个预测问题
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)
# 调用AdaBoost分类策略
model = AdaBoostClassifier()
# 交叉检验
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# 计算准确率
n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
print('准确率: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
该问题的输出结果类似以下:
准确率: 0.806 (0.041)
更换元分类器
最常见的AdaBoost元分类器是决策树,这也是sklearn中默认的元分类器,如果我们不传入任何参数进入AdaBoostClassifier,那么它就会默认使用一层的决策树来作为它的元分类器。但是实际上,AdaBoost接受所有能够样本赋权的分类器作为其的元分类器,而我们最常见的赋权分类器有两种,即决策树和支持向量机(SVM)。在这个部分我们尝试在一个分类问题中找到一个较优的元分类器。
首先,我们先尝试以不同层数的决策树作为元分类器来看看AdaBoost的效果
def get_dataset(iris=True):
"""
获取研究的数据集
@是否用鸢尾花数据集进行测试
"""
if iris == True:
data = load_iris()
X = data.data
y = data.target
else:
X, y = make_classification(n_samples=1000, n_features