简介:
adaBoost(自适应增强)的缩写,他的自适应在于:前一个基本分类器被错误分类的样本的权值会增大,而正确的分类样本的权值会减少,并再次用来训练下一个分类器,同时,在每一轮迭代中,加如一个新的若分类器,直到达到某一个预定的足够小的错误率,或达到预先指定的最大迭代次数才能确定最终的强分类器
adaboost算法可以简述为三个步骤:
1.首先,是初始化训练数据的权值分布D1.假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值: w1 = 1/N
2.然后,训练弱分类器hi.具体训练的过程是:如果某个训练样本点,被若分类器hi准确的分类,那么在构造下一个训练集中,它对应的权值要减少相反,如果某个训练样本点被错误分类,那么他的权值就应该增大,权值更性过的样本集被用于训练下一个分类其,整个训练过程如此迭代地进行下去.
3.最后,将各个训练得到的弱分类器组合成一个强分类器,各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用
换而言之,误差率低的弱分类器在最终分类中占的权重较大,否之较小
adaboost算法流程:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
from sklearn.metrics import classification_report
#生成2维正太分布,生成的数据按分位数分为两类,500个样本,2个样本特征
x1,y1 = make_gaussian_quantiles(n_samples = 500,n_features=2,n_classes=2)
#生成2维正太分布,生成的数据按分位数分为两类,400个样本,2个样本特征均值都为3
x2,y2 = make_gaussian_quantiles(mean = (3,3),n_samples = 500,n_features=2,n_classes=2)
#将两组数据合成一组数据
x_data = np.concatenate((x1,x2))
y_data = np.concatenate((y1,-y2 + 1))
plt.scatter(x_data[:,0],x_data[:,1],c = y_data)
# 决策树模型
model = tree.DecisionTreeClassifier(max_depth = 3)
# 输入数据建立模型
model.fit(x_data,y_data)
#获取数据值所在的范围
x_min,x_max = x_data[:,0].min() - 1,x_data[:,0].max()+1
y_min,y_max = x_data[:,1].min() - 1,x_data[:,1].max()+1
#生成网格矩阵
xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),
np.arange(y_min,y_max,0.02))
z = model.predict(np.c_[xx.ravel(),yy.ravel()]) # ravel与flatten类似,多维数据转一维.flatten不会改变原始数据,ravel会改变原始数据
z = z.reshape(xx.shape)
# 登高线图
cs = plt.contourf(xx,yy,z)
plt.scatter(x_data[:,0],x_data[:,1],c = y_data)
plt.show()
# 模型准确率
model.score(x_data,y_data)
# adaboost模型 传入决策树模型
model = AdaBoostClassifier(DecisionTreeClassifier(max_depth = 3),n_estimators=10)
model.fit(x_data,y_data)
#获取数据值所在的范围
x_min,x_max = x_data[:,0].min() - 1,x_data[:,0].max()+1
y_min,y_max = x_data[:,1].min() - 1,x_data[:,1].max()+1
#生成网格矩阵
xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),
np.arange(y_min,y_max,0.02))
z = model.predict(np.c_[xx.ravel(),yy.ravel()]) # ravel与flatten类似,多维数据转一维.flatten不会改变原始数据,ravel会改变原始数据
z = z.reshape(xx.shape)
# 登高线图
cs = plt.contourf(xx,yy,z)
plt.scatter(x_data[:,0],x_data[:,1],c = y_data)
plt.show()
model.score(x_data,y_data)
stacking ,自行去了解这个算法