集成学习(Ensemble Learning)
KNN、决策树、神经网络等学习器都是单一、独立的,集成学习就是组合多个学习器,最后可以得到一个更好的学习器。集成学习就是构建并组合多个学习器来完成学习任务的算法,常用的有三类:
Bagging:个体学习器之间没有强依赖关系,可同时生成的并行化方法,装袋
Boosting:个体学习器之间存在强依赖关系,必须串行生成基分类器的方法
Stacking:使用多个不同的分类器进行预测,把预测的结果作为一个次级分类器的输入,次级分类器的输出是整个模型的预测结果。
一、Bagging
也叫做bootstrap aggregating,是在原始数据集选择S次后得到S个新数据集的一种技术,是一种 有放回抽样 。
eg:原始数据集: {0,1,2,3,4,5,6,7,8,9}
Boostrap抽样:{7,2,6,7,5,4,8,8,1,0}——未采样3,9
{1,3,8,0,3,5,8,0,1,9}——未采样2,4,6,7
{2,9,4,2,7,9,3,0,1,0}——未采样5,6,8
Boosting方法是将“弱学习算法”提升为“强学习算法”的过程,通过反复学习得到一系列弱分类器(决策树和逻辑回归),组合这些弱分类器得到一个强分类器,Boosting算法要涉及到两个部分,加法模型和前向分步算法
加法模型:
强分类器由一系列弱分类器线性相加而成。一般组合形式如下:
其中,是弱分类器,是弱分类器学习到的最优参数,是弱学习在强分类器中所占比重,P是所有和的组合。这些弱分类器线性相加组成强分类器。
前向分步:
是在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。即
随机森林(Random Forest)
RF = 决策树 + Bagging + 随机属性选择
同时训练多个决策树,预测时综合考虑多个结果进行预测,例如取多个节点的均值(回归),或者是众数(分类)
流程:1、样本的随机: 从样本集中用bagging的方式,随机选n个样本
2、特征的随机: 从所有属性d中随机选择k个属性(k<d),然后从k的属性中选择最佳分割属性作为节点建立CART决策树
3、重复上述两个步骤m次,建立m棵CART决策树
4、这m棵CART决策树形成随机森林,通过投票表决结果,决定数据属于哪一类
优势:1、消除了决策树容易出现过拟合的缺点
2、减小了预测的方差,预测值不会因为训练数据的小变化而剧烈变化
from sklearn.ensembleimport RandomForestClassifier
RF = RandomForestClassifier(n_estimators=50)
RF.fit(x_train, y_train)
plot(RF)
print(RF.score(x_test, y_test))
二、Stacking
eg:
from sklearn.linear_modelimport LogisticRegression
from sklearn.neighborsimport KNeighborsClassifier
from sklearn.treeimport DecisionTreeClassifier
from mlxtend.classifierimport StackingClassifier
from sklearn.ensembleimport VotingClassifier#投票的分类器
# 定义三个不同的分类器
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = DecisionTreeClassifier()
clf3 = LogisticRegression()
# 定义一个次级分类器
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],
meta_classifier=lr)
for clf, labelin zip([clf1, clf2, clf3, sclf],
['KNN','Decision Tree','LogisticRegression','StackingClassifier']):
scores = model_selection.cross_val_score(clf, x_data, y_data,cv=3,scoring='accuracy')
print("Accuracy: %0.2f [%s]" % (scores.mean(), label))
# VotingClassifier
sclf1 = VotingClassifier([('knn',clf1), ('dtree', clf2), ('rf', clf3)])
for clf, labelin zip([clf1, clf2, clf3, sclf1],
['KNN','Decision Tree','LogisticRegression','VotingClassifier']):
scores = model_selection.cross_val_score(clf, x_data, y_data,cv=3,scoring='accuracy')
print("Accuracy: %0.2f [%s]" % (scores.mean(), label))