龙空技术网

机器学习100天-Day1802集成学习Bagging 和 Pasting

一点点Citespace 171

前言:

现时各位老铁们对“bagging算法投票”大体比较注重,小伙伴们都需要分析一些“bagging算法投票”的相关文章。那么小编也在网络上汇集了一些有关“bagging算法投票””的相关知识,希望各位老铁们能喜欢,小伙伴们快快来了解一下吧!

说明:本文依据《Sklearn 与 TensorFlow 机器学习实用指南》完成,所有版权和解释权均归作者和翻译成员所有,我只是搬运和做注解。

第六章集成学习和随机森林

假设你去随机问很多人一个很复杂的问题,然后把它们的答案合并起来。通常情况下你会发现这个合并的答案比一个专家的答案要好。这就叫做群体智慧。

如果合并一组分类器的预测(像分类或者回归),同样会得到一个比单一分类器更好的预测结果。这一组分类器就叫做集成。

因此,这个技术就叫做集成学习,一个集成学习算法就叫做集成方法。

例如,你可以训练一组决策树分类器,每一个都在一个随机的训练集上。为了去做预测,你必须得到所有单一树的预测值,然后通过投票(例如第六章的练习)来预测类别。例如一种决策树的集成就叫做随机森林,它除了简单之外也是现今存在的最强大的机器学习算法之一。

一般会在一个项目快结束的时候使用集成算法,一旦你建立了一些好的分类器,就把他们合并为一个更好的分类器。在机器学习竞赛中获得胜利的算法经常会包含一些集成方法。

本章中,教程讨论了几个著名的集成方法:bagging, boosting, stacking和其他一些算法。我们也会讨论随机森林。

源代码已经同步在github中 

本章中理论多过实操,所以基本上是抄了,如果不喜欢的同学可以直接看github里面的源文档。

2. Bagging 和 Pasting

投票分类器是使用不同训练算法训练同一批数据得到不同的分类器;也可以使用不同训练集处理同一个训练算法,有放回采样的称为装袋bagging,无放回采样的成为粘贴。

通过这种在基学习器构建的过程中引入随机方法,并最后通过集成。利用这种方式来降低单个学习器的方差。最终降低过拟合。

Bagging的方法有很多,不同的是随机选择训练数据的方式

Pasting:随机选择数据子集Bagging:可以重复抽样Random Subspaces:样本在随机选择的属性中抽样Random Patches:构建基学习器的时候样本和属性都是子集时

当所有的分类器被训练后,集成可以通过对所有分类器结果的简单聚合来对新的实例进行预测。聚合函数通常对分类是统计模式(例如硬投票分类器)或者对回归是平均。每一个单独的分类器在如果在原始训练集上都是高偏差,但是聚合降低了偏差和方差。通常情况下,集成的结果是有一个相似的偏差,但是对比与在原始训练集上的单一分类器来讲有更小的方差。

在Sklearn中的Bagging和Pasting

sklearn为Bagging和Pasting提供了一个简单的API:BaggingClassifier类(对于回归可以是BaggingRegressor)

接下来的代码训练一个包含有500个决策树分类器的集成,每一个都是在数据集上有放回采样100个训练实例下进行训练(这是 Bagging 的例子,如果想试试Pasting,就设置bootstrap=False)。

n_jobs参数告诉sklearn用于训练和预测所需要CPU核的数量。(-1 代表着 sklearn 会使用所有空闲核)

对比一下,发现pasting的正确率比bagging高一丢丢。

from sklearn.ensemble import BaggingClassifier, BaggingRegressorfrom sklearn.tree import DecisionTreeClassifier#注意参数设置bag_clf=BaggingClassifier( DecisionTreeClassifier(random_state=42), n_estimators=500, max_samples=100, #bootstrap=False, bootstrap=True, n_jobs=-1, random_state=42)bag_clf.fit(X_train,y_train)bag_pred=bag_clf.predict(X_test)print(accuracy_score(y_test,bag_pred)) # 0.904/0.912

再对比一下只使用决策树的模型。

tree_clf = DecisionTreeClassifier(random_state=42)tree_clf.fit(X_train, y_train)y_pred_tree = tree_clf.predict(X_test)print(accuracy_score(y_test, y_pred_tree))

可视化三个模型

import matplotlib.pyplot as pltfrom matplotlib.colors import ListedColormapdef plot_decision_boundary(clf,X,y,axes=[-1.5,2.5,-1,1.5],alpha=0.5,contour=True): x1s=np.linspace(axes[0],axes[1],100) x2s=np.linspace(axes[2],axes[3],100) x1,x2=np.meshgrid(x1s,x2s) X_new=np.c_[x1.ravel(),x2.ravel()] y_pred=clf.predict(X_new).reshape(x1.shape) custom_cmp=ListedColormap(['#fafab0','#9898ff','#a0faa0']) plt.contourf(x1,x2,y_pred,alpha=0.3,cmp=custom_cmp) if contour: custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50']) plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8) plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha) plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha) plt.axis(axes) plt.xlabel(r"$x_1$", fontsize=18) plt.ylabel(r"$x_2$", fontsize=18, rotation=0)plt.figure(figsize=(16,4))plt.subplot(131)plot_decision_boundary(tree_clf, X, y)plt.title("Decision Tree", fontsize=14)plt.subplot(132)plot_decision_boundary(bag_clf, X, y)plt.title("Decision Trees with Bagging", fontsize=14)plt.subplot(133)plot_decision_boundary(bag_pasting_clf, X, y)plt.title("Decision Trees with Pasting", fontsize=14)plt.show() 

Bootstrap在每个预测器被训练的子集中引入了更多的分集,所以 Bagging 结束时的偏差比Pasting更高,但这也意味着预测因子最终变得不相关,从而减少了集合的方差。总体而言,Bagging 通常会导致更好的模型,这就解释了为什么它通常是首选的。

Out-of-Bag评价

在Bagging中有大概37%的实例是不会被采样的,这就是out of bag实例,这部分实例可以用来做评估,从而不需要单独建立一个交叉验证集,可以将每个分类器的oob用来评估这个分类器。

方法:在初始化BaggingClassifier时设置oob_score=True来自动评估。

bag_clf=BaggingClassifier( DecisionTreeClassifier(random_state=42), n_estimators=500, bootstrap=True, n_jobs=-1, oob_score=True, random_state=40)bag_clf.fit(X_train,y_train)bag_clf.oob_score_ # 0.9013333333333333#对于每个训练实例 oob 决策函数也可通过oob_decision_function_变量来展示。在这种情况下(当基决策器有predict_proba()时)决策函数会对每个训练实例返回类别概率。例如,oob 评估预测第二个训练实例有 60.6% 的概率属于正类(39.4% 属于负类):bag_clf.oob_decision_function_y_pred=bag_clf.predict(X_test)print(accuracy_score(y_test,y_pred)) # 0.912

标签: #bagging算法投票