代码实战之AdaBoost
尝试用sklearn进行adaboost实战 & SAMME.R算法流程
- 初试AdaBoost
- SAMME.R算法流程
- sklearn之AdaBoostClassifier类
- 完整实战demo
初试AdaBoost
一个简单的例子,来介绍AdaBoostClassifier。
例子放在Github上,可以直接fork。
1 | #coding=utf-8 |
SAMME.R算法流程
1.初始化样本权值:$$ w_i=1/N,i=1,2,…,N $$
2.Repeat for $ m=1,2,…,M $:
2.1 训练一个弱分类器,得到样本的类别预测概率分布 \( p_m(x)=P(y=1|x)∈[0,1] \)
2.2 \(f_m(x)=\frac{1}{2}log\frac{p_m(x)}{1-p_m(x)}\)
2.3 \(w_i=w_iexp[-y_if_m(x_i)]\),同时,要进行归一化使得权重和为1
3.得到强分类模型:\(sign{\sum_{m=1}^{M}f_m(x)}\)
AdaBoostClassifier类
好,现在我们来说点理论的东西。关于AdaBoostClassifier。
sklearn.ensemble.AdaBoostClassifier的构造函数如下:
AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=’SAMME.R’, random_state=None)
各个参数已经在代码里介绍过了,这里不再叙述。有一点要注意,理论上可以选择任何一个弱分类器,不过需要有样本权重。
另外有方法:
Methods | |
---|---|
decision_function(X) | 计算输入X的决策函数值 |
fit(X,y,sample_weight) | 拟合损失函数,构建强预测模型 |
get_params() | 获取模型参数 |
predict() | 获取模型参数 |
predict_log_proba(X) | 计算输入X的类别log概率 |
predict_proba(X) | 计算输入X的类别概率值 |
score(X, y, sample_weight) | 返回给定输入样本集X的平均准确度 |
另外一些方法请见官网sklearn-AdaBoost
完整实战demo
好了,现在再来一个完整的demo,来看看AdaBoost的分类效果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#coding=utf-8
#python 3.5
'''
Created on 2017年11月27日
@author: Scorpio.Lu
'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
#用make_gaussian_quantiles生成多组多维正态分布的数据
#这里生成2维正态分布,设定样本数1000,协方差2
x1,y1=make_gaussian_quantiles(cov=2., n_samples=200, n_features=2, n_classes=2, shuffle=True, random_state=1)
#为了增加样本分布的复杂度,再生成一个数据分布
x2,y2=make_gaussian_quantiles(mean=(3,3), cov=1.5, n_samples=300, n_features=2, n_classes=2, shuffle=True, random_state=1)
#合并
X=np.vstack((x1,x2))
y=np.hstack((y1,1-y2))
#plt.scatter(X[:,0],X[:,1],c=Y)
#plt.show()
#设定弱分类器CART
weakClassifier=DecisionTreeClassifier(max_depth=1)
#构建模型。
clf=AdaBoostClassifier(base_estimator=weakClassifier,algorithm='SAMME',n_estimators=300,learning_rate=0.8)
clf.fit(X, y)
#绘制分类效果
x1_min=X[:,0].min()-1
x1_max=X[:,0].max()+1
x2_min=X[:,1].min()-1
x2_max=X[:,1].max()+1
x1_,x2_=np.meshgrid(np.arange(x1_min,x1_max,0.02),np.arange(x2_min,x2_max,0.02))
y_=clf.predict(np.c_[x1_.ravel(),x2_.ravel()])
y_=y_.reshape(x1_.shape)
plt.contourf(x1_,x2_,y_,cmap=plt.cm.Paired)
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()
训练完成后的错误率大概是0.116。分类效果图如下:
作者 [Scorpio.Lu]
2017 年 11 月 28 日
转载请注明出处!