【算法7】集成算法

    集成算法最强的目的就是考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。多个模型集成成为的模型叫做集成评估器( e n s e m b l e e s t i m a t o r ensemble estimator ),组成集成评估器的每个模型都叫做基评估器( b a s e e s t i m a t o r base estimator )。通常来说有三类集成算法:装袋法( B a g g i n g Bagging ),提升法( B o o s t i n g Boosting )和 s t a c k i n g stacking 。这里重点说说 B a g g i n g Bagging B o o s t i n g Boosting 。文中部分内容参考菊安酱的机器学习内容。

1 装袋法( B a g g i n g Bagging

    又称自主聚集(bootstrap aggregating),是一种根据均匀概率分布从数据集中重复抽样(有放回的)的技术。每个新数据集和原始数据集的大小相等。由于新数据集中的每个样本都是从原始数据集中有放回的随机抽样出来的,所以新数据集中可能有重复的值,而原始数据集中的某些样本可能根本就没出现在新数据集中。
    在使用袋装法时要求基评估器要尽量独立。其实,袋装法还有另一个必要条件:基分类器的判断准确率至少要超过随机分类器。
     b a g g i n g bagging 方法的代表算法是随机森林,准确的来说,随机森林是 b a g g i n g bagging 的一个特化进阶版,所谓的特化是因为随机森林的弱学习器都是决策树。所谓的进阶是随机森林在 b a g g i n g bagging 的样本随机采样基础上,又加上了特征的随机选择,其基本思想没有脱离 b a g g i n g bagging 的范畴。

1.1使用python—sklearn实现随机森林分类器

    随机森林分类器( R a n d o m F o r e s t C l a s s i f i e r RandomForestClassifier ):

class sklearn.ensemble.RandomForestClassifier (n_estimators=10, criterion=’gini’,
max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None,
bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False,
class_weight=None)
参数 含义
n_estimators 这是森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。
criterion 不纯度的衡量指标,有基尼系数和信息熵两种选择
max_depth 树的最大深度,超过最大深度的树枝都会被剪掉
min_samples_leaf 一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
min_samples_split 一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
max_features max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整
min_impurity_decrease 限制信息增益的大小,信息增益小于设定数值的分枝不会发生

    代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

#切分训练集和测试集
Xtrain, Xtest, Ytrain, Ytest =
train_test_split(wine.data,wine.target,test_size=0.3)
#建立模型
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)
#查看模型效果
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
#打印最后结果
print("Single Tree:",score_c)
print("Random Forest:",score_r)

1.2使用python—sklearn实现随机森林回归器

    随机森林回归器( R a n d o m F o r e s t R e g r e s s o r RandomForestRegressor ):

class sklearn.ensemble.RandomForestRegressor (n_estimators=’warn’, criterion=’mse’,
max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None,
bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False)

    所有的参数,属性与接口,全部和随机森林分类器一致。仅有的不同就是回归树与分类树的不同,不纯度的指标,参数Criterion不一致。
    重要参数:

*参数 含义
criterion 输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失;输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差;输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失

    最重要的属性和接口,都与随机森林的分类器相一致,还是apply, fit, predict和score最为核心。值得一提的是,随机森林回归并没有predict_proba这个接口,因为对于回归来说,并不存在一个样本要被分到某个类别的概率问题,因此没有predict_proba这个接口。
    代码:

from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestRegressor
boston = load_boston()
regressor = RandomForestRegressor(n_estimators=100,random_state=0)
cross_val_score(regressor, boston.data, boston.target, cv=10
,scoring = "neg_mean_squared_error")
#查看所有可以用的评估指标
sorted(sklearn.metrics.SCORERS.keys())

2 提升法( B o o s t i n g Boosting

    boosting是一个迭代的过程,用来自适应地改变训练样本的分布,使得弱分类器聚焦到那些很难分类的样本上。它的做法是给每一个训练样本赋予一个权重,在每一轮训练结束时自动地调整权重,代表算法有AdaBoost等。

2.1 使用python—sklearn实现AdaBoost分类器

    AdaBoost分类器( A d a B o o s t C l a s s i f i e r AdaBoostClassifier ):

class sklearn.ensemble.``AdaBoostClassifier (base_estimator = None,n_estimators = 50
learning_rate = 1.0,algorithm ='SAMME.R',random_state = None 

    核心参数:
在这里插入图片描述
    弱分类器参数:
在这里插入图片描述

    代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles

bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2,
min_samples_split=20,
min_samples_leaf=5)
,algorithm="SAMME",n_estimators=200, learning_rate=0.8)
bdt.fit(X, y)

2.1 使用python—sklearn实现AdaBoost回归器

    核心参数:
在这里插入图片描述
    弱分类器参数和回归器一样。
    代码:

#导入所需的模块和包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
#创造数据集
rng = np.random.RandomState(1)
X = np.linspace(0, 6, 100).reshape(-1,1)
y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0])
#训练回归模型
regr_1 = DecisionTreeRegressor(max_depth=4)
regr_2 = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),
n_estimators=300, random_state=rng)
regr_1.fit(X, y)
regr_2.fit(X, y)
#预测结果
y_1 = regr_1.predict(X)
y_2 = regr_2.predict(X)

3 小结

    上面介绍了装代法、提升法两个集成算法的代表: b a g g i n g bagging A d a B o o s t AdaBoost ,这里在总结对比一下他们的特点。
在这里插入图片描述
    落花生对集成算法的框架、python实现在这里就粗狂的介绍完了。当然,集成算法如此高大上的机器学习神器不是这样就能被描述清楚的,后面我肯定会进一步细化,呈给各位小主检阅… …

发布了39 篇原创文章 · 获赞 42 · 访问量 4858

猜你喜欢

转载自blog.csdn.net/weixin_41774099/article/details/102211359