文章目录
一.简介
1.1 集成学习
一群人的智慧总是比一个人强,这就是集成学习的核心思想。如果你聚合一组预测器(比如分类器或回归器)的预测,得到的预测结果也比最好的单个预测器要好。这样的一组预测器称为集成,这种技术也叫集成学习。
1.2 随机森林
我们训练一组决策树分类器,每一棵树都基于训练集不同的随机子集进行训练。做出预测时,只需要获得所有树各自的预测,然后得票最多的类别作为预测结果。这样一组决策树的集成被称为随机森林,随机森林是迄今可用的最强大的机器学习算法之一。
二.集成学习—投票分类器
2.1 概念
如果我们已经训练好了一些分类器,并且每个分类器的准确率都比较客观,为了创建一个更好的分类器,最简单的方法就是聚合每个分类器的预测,然后将的票最多的结果作为预测类别。这种大多数投票分类器称为硬投票分类器。事实上,即使每个分类器都是弱学习器(意味着它的的预测效果只比随机预测好一点),通过集成依然可以实现一个强学习器
2.2 代码实现
from sklearn.ensemble import RandomForestClassifier #随机森林分类器
from sklearn.ensemble import VotingClassifier #投票分类器
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris=load_iris() #加载数据集
X_train, X_test, Y_train, Y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)
log_clf=LogisticRegression() #逻辑回归评估
rnd_clf=RandomForestClassifier()
svm_clf=SVC()
voting_clf=VotingClassifier(
estimators=[('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],
voting='hard' #硬投票#
)
voting_clf.fit(X_train,Y_train)
print(clf.__class__.__name__,accuracy_score(Y_test,voting_clf.predict(X_test)))
结果输出为预测准确率(预测全对为1)
三.集成学习—bagging和pasting
3.1 简介
3.2 Scikit-Learn中使用bagging和pasting
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True,n_jobs=-1)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test)
3.3 包外评估
- 简介
- API使用
from sklearn.metrics import accuracy_score
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,bootstrap=True,n_jobs=1,oob_score=True)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test)
accuracy_score(Y_test,y_pred)
3.4 随机补丁和随机子空间
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
X_train, X_test, Y_train, Y_test = train_test_split(iris.data[:,2:], iris.target, test_size=0.3, random_state=42)
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_features=2,
bootstrap_features=iris.feature_names[2:],bootstrap=True,n_jobs=-1)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test)
四.集成学习—随机森林
4.1 简介
4.2 API使用
from sklearn.ensemble import RandomForestClassifier
rnd_clf=RandomForestClassifier(n_estimators=500,max_leaf_nodes=16,n_jobs=-1)#n_jobs表示并行的意思,多余决策树之间并行运行
rnd_clf.fit(X_train,Y_train)
4.3 极端随机树
4.4 特征重要性
from sklearn.datasets import load_iris
iris=load_iris()
rnd_clf=RandomForestClassifier(n_estimators=500,n_jobs=-1)
rnd_clf.fit(iris["data"],iris["target"])
for name ,score in zip(iris["feature_names"],rnd_clf.feature_importances_):
print(name,score)
五.集成学习—提升法Boosting
5.1 简介
5.2 AdaBoost
5.2 AdaBoost原理解析
- AdaBoost算法的初始时会将每个实例权重
w
(
i
)
w^{(i)}
w(i)最初设置为
1
m
\frac 1 m
m1,然后对第一个预测器进行训练,并根据训练集计算其加权错误率
r
1
r_1
r1,第j个预测器的加权错误率的求法
r j = ∑ i = 1 m w ( i ) ( y ^ j ( i ) ≠ y ( i ) ) ∑ i = 1 m w ( i ) r_j=\frac {\sum_{i=1}^m w^{(i)}(\hat y_j^{(i)}\neq y^{(i)})} {\sum_{i=1}^m w^{(i)}} rj=∑i=1mw(i)∑i=1mw(i)(y^j(i)=y(i))
- 预测器的权重这里我们记为 a j a_j aj,它的计算方法如下列公式所示。其中 β \beta β是我们的学习率超参数(默认为1),可以看出我们的预测器越准确( r j r_j rj越小)其权重就越高。
a j = β l o g 1 − r j r j a_j=\beta log \frac {1-r_j} {r_j} aj=βlogrj1−rj
- 然后AdaBoost算法使用下面公式来更新实例的权重,从而提高了错误分类的实例的权重
对于
i
=
1
,
2
,
.
.
.
.
.
,
m
对于i=1,2,.....,m
对于i=1,2,.....,m
w
(
i
)
←
{
w
(
i
)
,
如果
y
^
j
(
i
)
=
y
(
i
)
w
(
i
)
e
x
p
(
a
j
)
w^{(i)}\leftarrow \begin{cases} w^{(i)},如果 \hat y_j^{(i)}=y^{(i)}\\ w^{(i)}exp(a_j)\\ \end{cases}
w(i)←{w(i),如果y^j(i)=y(i)w(i)exp(aj)
4. 然后对所有实例权重进行归一化(除以
∑
i
=
1
m
w
(
i
)
\sum_{i=1}^m w^{(i)}
∑i=1mw(i))
5. 最后使用更新后的权重训练一个新的预测器,然后重复整个过程(计算新预测器的权重,更新实例权重)直到达到所需的预测器或得到完美的预测器时算法结束
a
1
f
1
+
a
2
f
2
+
.
.
.
+
a
n
f
n
=
F
a_1f_1+a_2f_2+...+a_nf_n=F
a1f1+a2f2+...+anfn=F
- 最后进行预测,AdaBoost就是简单地计算所有预测器的预测结果,并使用预测器权重 a j a_j aj对他们进行加权,最后得到大多数加权投票的类就是预测器给出的预测类
5.3 AdaBoost的API使用
Scikitlearn使用的是AdaBoost的多分类版本,叫做SAMME(基于多类指数损失函数的逐步添加模型),如果使用的预测器可以估算出每类的概率,可以使用SAMME的变体,SAMME.R,它和SAMME不同的是,它依赖的是类概率而不是类预测。
from sklearn.ensemble import AdaBoostClassifier
ada_clf=AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5)
ada_clf.fit(X_train,Y_train)
5.4 梯度提升
5.5 梯度提升原理
- 初始:训练集上训练第一个决策树
from sklearn.tree import DecisionTreeClassifier
tree_reg1=DecisionTreeClassifier(max_depth=2)
tree_reg1.fit(X_train,Y_train)
- 第二步:针对第一个预测器的残差训练第二个决策树
y2=Y_train-tree_reg1.predict(X_train) #计算残差
tree_reg2=DecisionTreeRegressor(max_depth=2)
tree_reg2.fit(X_train,y2)
- 第三步:将前面得到的两棵树的预测相加,对性实例进行预测
y_pred=sum(tree.predict(iris.data[2:3,2:]) for tree in(tree_reg1,tree_reg2))
y_pred
5.6 梯度提升API使用
from sklearn.ensemble import GradientBoostingRegressor
gbrt=GradientBoostingRegressor(max_depth=2,n_estimators=3,learning_rate=1.0)
gbrt.fit(X_train,Y_train)