机器学习 随机森林与集成模型 2022-01-10

人工智能基础总目录


集成模型

一、随机森林

决策树在复杂问题上效果不好,想出了一种方法,使用部分数据去掉某些行,某些列做出小决策树。每个决策树的关注点不一样,最后将小决策树汇总。最终实现的效果会比较好。
在这里插入图片描述
随机取一些数据,得到多个子模型训练,最后综合结果。
在这里插入图片描述

二、Ensemble learning

集成学习是一种机器学习范式,通过训练多个模型来解决同一问题。与尝试从训练数据中学习一个假设的普通机器学习方法相反,集成方法尝试构建一组假设并将其组合使用。

三、boosting

boosting 是指能够将弱学习器转换为强学习器的一系列算法。 boosting 的主要原理是将一系列弱学习器(仅比随机猜测好)。对于那些在训练前期而被错误分类的样本,boosting 算法会给予更大的重视。然后通过加权多数投票(分类)或加权和(回归)组合预测,以产生最终预测。

Adaptive boosting(可调节的)

x 随机选择的过程中,如果某次结果比较好,那么这次的x 在下一次的选中概率降低。 反之,结果差则下次被选中的概率增大。 算错的x 会更多参与训练。

算法说明:
在这里插入图片描述

Gradient Boosting

GBDT: “梯度提升决策树树”(Gradient Boosting Decision Tree)
本质: 加权,Loss (Loss 是错误率)最小,变动更佳平滑。

学习率 是 Boosted Esemble Loss 小的 最小的Learning Rate ,
在这里插入图片描述

Xgboost 和 LightBGM

GBDT 的两种升级版, 在数据挖掘与商业推荐中使用较多。

四、 代码实践

下面将使用决策树以及其集成版本对数据集 Mnist 建模,观察不同集成方法的差异

4.1 决策树

import numpy as np
import pandas as pd
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, BaggingClassifier, AdaBoostClassifier, GradientBoostingClassifier

# 查看训练数据信息
train_df = pd.read_csv('/data/course_data/ensemble/mnist_train.csv')
# 查看测试数据信息
test_df  = pd.read_csv('/data/course_data/ensemble/mnist_test.csv')

# 构建训练、测试数据
X_train = train_df.iloc[:,1:]
X_test = test_df.iloc[:,1:]
y_train = train_df.iloc[:,0]
y_test = test_df.iloc[:,0]
(X_train.shape, y_train.shape), (X_test.shape, y_test.shape)

dtc = DecisionTreeClassifier()
dtc.fit(X_train, y_train)
dtc.score(X_train, y_train) # 1.0
dtc.score(X_test, y_test) # 0.8767

# 上面的训练集准确度和测试集的准确度来看,默认参数的决策树已经发生了过拟合
# 参数调整 min_samples_leaf min_samples_split max_features
dtc = DecisionTreeClassifier(min_samples_leaf=8)
dtc.fit(X_train, y_train)
dtc.score(X_train, y_train), dtc.score(X_test, y_test)

4.2 随机森林

增加训练的决策树,最后对结果进行集成,这个参数的增加可以简单的认为是投票的人数增加了,那么最后的结果必然也会更加鲁棒。可以尝试继续增大这个参数,

调节其他参数如 max_samples,适当少于全部训练数据量,可以增加不同子模型之间的差异,进一步提升泛化性能。

rfc = RandomForestClassifier(n_estimators=10)
rfc.fit(X_train, y_train)
rfc.score(X_train, y_train) # 0.999
rfc.score(X_test, y_test) # 0.950

# 参数调整: n_estimators max_samples
rfc = RandomForestClassifier(n_estimators=20)
rfc.fit(X_train, y_train)
rfc.score(X_train, y_train), rfc.score(X_test, y_test)

4.3 GBDT

gbc = GradientBoostingClassifier(n_estimators=10)
gbc.fit(X_train, y_train)
gbc.score(X_train, y_train)

# 参数调整: 增加n_estimators 子学习器的数量
gbc = GradientBoostingClassifier(n_estimators=30)

4.4 Bagging

前述的随机森林和 GBDT 都是以决策树为基学习器的集成学习算法,但是要注意的是集成学习并不是决策树的专属,任何其他的学习器都可以作为集成学习的基学习器,比如逻辑回归、支持向量机。

# 以决策树作为基学习器
bgc = BaggingClassifier(DecisionTreeClassifier(), max_samples=0.5, max_features=1.0, n_estimators=20)
bgc.fit(X_train, y_train)
bgc.score(X_train, y_train)
bgc.score(X_test, y_test)

# 以逻辑回归作为基学习器
bgc = BaggingClassifier(LogisticRegression(max_iter=500), 
					max_samples=0.5, max_features=1.0, n_estimators=20)
bgc.fit(X_train, y_train)

bgc.score(X_train, y_train), bgc.score(X_test, y_test)

4.5 Boosting

adc = AdaBoostClassifier(DecisionTreeClassifier(), n_estimators=10, learning_rate=0.01)
adc.fit(X_train, y_train)

adc.score(X_train, y_train) # 1.0
adc.score(X_test, y_test)  # 0.8738

adc = AdaBoostClassifier(LogisticRegression(), n_estimators=10, learning_rate=0.01)
adc.fit(X_train, y_train)
adc.score(X_train, y_train), adc.score(X_test, y_test)
# (0.9316833333333333, 0.9234)

# 逻辑回归相对来说泛化能力更好,决策树更容易过拟合
# 对决策树参数进行优化
adc = AdaBoostClassifier(DecisionTreeClassifier(min_samples_leaf=8), n_estimators=10, learning_rate=0.01)
adc.fit(X_train, y_train)
adc.score(X_train, y_train), adc.score(X_test, y_test)
# (0.99825, 0.95)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值