sklearn之集成学习

sklearn-集成学习


from sklearn.ensemble import AdaBoostClassifier, GradientBoostingClassifier,  RandomForestClassifier, VotingClassifier, BaggingClassifier, ExtraTreesClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
import pandas as pd
import numpy as np


下面所有算法使用乳腺癌数据集演示 569个样本,30个特征,一个标签,0代表恶性,1代表良性

# 1. 加载数据
br = load_breast_cancer()

data = br.data
target = br.target
print(data.shape)
print(type(data))
print('-'*100)
# 统计两个类别的数量
print(np.unique(target, return_counts=True))

print(br.DESCR) # 查看数据集的描述信息
# 2. 数据集划分
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=22)

# 查看划分是否均匀
print(np.unique(y_train, return_counts=True))
print(np.unique(y_test, return_counts=True))

# 3. 特征工程 将特征值进行标准化,转化到同一数量级
stds = StandardScaler()
x_train = stds.fit_transform(x_train)
x_test = stds.transform(x_test)

使用逻辑回归预测

# 4. 模型构建
# 4.1 构建逻辑回归模型
lgr = LogisticRegression()
lgr.fit(x_train, y_train)
print('逻辑回归的准确率为:', lgr.score(x_test, y_test))

使用决策树预测

# 4.2 构建决策树模型
dtc = DecisionTreeClassifier()
dtc.fit(x_train, y_train)
print('决策树的准确率为:', dtc.score(x_test, y_test))

使用SVM的SVC算法预测

# 4.3 构建SVM模型
svm = SVC()
svm.fit(x_train, y_train)
print('SVM的准确率为:', svm.score(x_test, y_test))

将三个模型组合做评估,模拟集成学习的机制

# 手动集成预测结果,简单的bagging,投票机制
predict = np.array((lgr.predict(x_test) + dtc.predict(x_test) + svm.predict(x_test)) >= 2, dtype=int)
print('手动集成的准确率为:', accuracy_score(y_test, predict))

使用集成学习的接口构建分类器,同时采用硬投票规则

# 使用集成学习的接口,硬投票
vot = VotingClassifier(estimators=[
    ('log_clf', LogisticRegression()),
    ('svm_clf', SVC()),
    ('dt_clf', DecisionTreeClassifier())], voting='hard')

vot.fit(x_train, y_train)
print(vot.score(x_test, y_test))

使用集成学习的接口构建分类器,同时采用软投票规则

# 使用集成学习的接口,软投票
vot = VotingClassifier(estimators=[
    ('log_clf', LogisticRegression()),
    ('svm_clf', SVC(probability=True)),
    ('dt_clf', DecisionTreeClassifier())], voting='soft')

vot.fit(x_train, y_train)
print(vot.score(x_test, y_test))

集成学习之bagging

bagging采用并行机制,即每个基学习器在自己的样本集上训练,再将结果组合,样本集的获得使用了一些采样算法,比较著名的是自助采样法,做有放回采样。这种方式也叫样本扰动。由于使用并行训练模型的方式,假设每个基分类器独立,可以降低模型的方差。

# 5. 集成学习Bagging
bagging = BaggingClassifier(estimator=DecisionTreeClassifier(), n_estimators=2000, max_samples=300, max_features=15)
bagging.fit(x_train, y_train)
print("bagging算法的准确率为:", bagging.score(x_test, y_test))

oob(Out Of Bag),是指由于使用了自助采样法,会造成训练集的大约34%的样本未被抽样到,这些样本可以单独作为验证集来评估模型的性能,接口是oob_score

bagging = BaggingClassifier(estimator=DecisionTreeClassifier(), n_estimators=2000, max_samples=300, max_features=15, oob_score=True)
bagging.fit(x_train, y_train)
print("bagging在未采样的数据上的准确率为:", bagging.oob_score_)
print("bagging算法的准确率为:", bagging.score(x_test, y_test))
%%time
#多核使用的时间更小, %%time要顶格来写
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
                                n_estimators=500, max_samples=300,
                                 n_jobs=-1)
bagging_clf.fit(x_train, y_train)
bagging_clf.score(x_test, y_test)
Bagging之随机森林

随机森林是Bagging的一个扩展变体,使用决策树作为基学习器,在样本扰动的基础上,引入属性扰动,使得基学习器的差异进一步提升,从而整体的泛化能力得到改进。

# 随机森林
rc_clf = RandomForestClassifier(n_estimators=1500, 
                                max_depth=5, max_features=15,
                                oob_score=True, n_jobs=-1)
rc_clf.fit(x_train, y_train)
print("随机森林在未采样的数据上的准确率为:", bagging.oob_score_)
print("随机森林算法的准确率为:", bagging.score(x_test, y_test))
Bagging之极端随机森林

极端随机森林比随机森林更随机,决策树的每个节点划分特征都是随机的,而不是计算信息熵或其他纯度指标比较出来的。

# 极端随机森林,随机森林的优化,随机森林的随机性更强,更不容易过拟合
# 原理:在随机森林的基础上,每个决策树的节点的划分特征都是随机的,而不是在一个特征集合中选择最优的特征
extra_clf = ExtraTreesClassifier(n_estimators=1500,
                                 max_depth=5, max_features=15,
                                 oob_score=True, n_jobs=-1)
print("随机森林在未采样的数据上的准确率为:", bagging.oob_score_)
print("随机森林算法的准确率为:", bagging.score(x_test, y_test))

集成学习之boosting

boosting采用串行机制,即通过每个基学习器在训练集上训练后,对分类正确的样本降低了权重,对分类错误的样本升高或者保持权重不变。在最后进行模型融合的过程中,也根据错误率对基分类器进行加权融合。错误率低的分类器拥有更大的“话语权”。这种串行的机制可以降低模型的偏差,即模型在训练集上的表现更好。
boosting家族的代表有Adaboost, GBDT, XGBoost等,XGBoost需要另外安装,并不是内嵌在sklearn的接口,它高效地实现了 GBDT 算法并进行了算法和工程上的许多改进。

# 集成学习boosting 串行 代表:Adaboosting, GBDT, XGBoost, LightGBM
adaboost = AdaBoostClassifier(estimator=DecisionTreeClassifier(), n_estimators=1500)
adaboost.fit(x_train, y_train)
print("adaboost算法的准确率为:", adaboost.score(x_test, y_test))
boosting之GBDT

梯度提升决策树(Gradient Boosting Decision Tree,GBDT),GBDT算法近年来在各种比赛中的表现十分优异。下面来简单介绍一下它的原理。
GBDT的每个基学习器也是串行训练的,但是它并不是对预测错误的样本增加权重,而是计算前一个基学习器预测值与真实值之间的偏差,将这种偏差重新作为训练集输入到下一个模型。由于这种机制,所以最终整体的预测结果是每个基学习器的预测结果求和而得到的。

# GBDT
gbdt = GradientBoostingClassifier(n_estimators=1500)
gbdt.fit(x_train, y_train)
print("GBDT算法的准确率为:", gbdt.score(x_test, y_test))

用一个形象的代码来解释GBDT的原理
在这里插入图片描述
在这里插入图片描述


基分类器选择:弱分类器

最常用的基分类器是决策树,主要有以下 3 个方面的原因。

(1)决策树可以较为方便地将样本的权重整合到训练过程中,而不需要使用过采样的方法来调整样本权重。

(2)决策树的表达能力和泛化能力,可以通过调节树的层数来做折中。

(3)数据样本的扰动对于决策树的影响较大,因此不同子样本集合生成的决策树基分类器随机性较大,这样的“不稳定学习器”更适合作为基分类器。此外,在决策树节点分裂的时候,随机地选择一个特征子集,从中找出最优分裂属性,很好地引入了随机性。

除了决策树外,神经网络模型也适合作为基分类器,主要由于神经网络模型也比较“不稳定”,而且还可以通过调整神经元数量、连接方式、网络层数、初始权值等方式引入随机性。

总而言之,基学习器的选择要尽量选择对样本扰动敏感的模型,增加或减少少量样本就会产生巨大差异的模型,这样的模型也称为弱分类器。


以上是学习完集成学习之后做的简单总结,主要以代码为主,原理并没有做详细的解释,希望给需要实战来理解原理的读者提供帮助,但更重要的是学会参考官方文档,每一个接口涉及的参数都是很多的,无法详细使用到每一个参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陪你看日出.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值