集成学习
将多个学习模块的结果统一成一个最终的成果机器学习方法。其中每个单独的分类器称为基分类器。
Voting模型
根据基分类器的结果进行投票作为最终预测结果
代码
from sklearn.ensemble import VotingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
voting_clf = VotingClassifier(
estimators=[
('knn_clf',KNeighborsClassifier(n_neighbors=5)),
('dt_clf',DescisionTreeClassifier(rangom_state=666))
],voting-'hard'
)
# 参数说明
# estimators 基分类器
# voting 投票方式 ['hard','soft']: 'hard'直接统计票数预测结果,'soft'根据权值预测结果
Bagging(Bootstrap AGGregatING)
当子模型数量增加时,集成模型的精度会提升。用多个弱学习器实现强学习器的效果。
基于自助采样法(bootstrap sampling)
代码
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import BaggingRegressor
from sklearn.tree import DecisionTreeClassifier
bagging_clf = BaggingClassifier(
DecisionTreeClassifier(random_state=666),
n_estimators=10,
max_samples=100,
random_state=42
)
# 参数说明
# n_estimators 子模型数量
# max_samples 取样数量
# bootstrap 采样方式[True,False]:True 有放回;False 无放回
# max_features 特征取样的个数
# bootstrap_features 对特征是否进行有放回抽样
# oob_score 使用包外数据进行测试:True 使用 *训练完后用.oob_score_获得分数
# n_jobs 并行化,使用计算机的几个核 default=None : None 1个核;n n个核;-1 所有核
理解
- Bagging每次只能用一种子模型
- 按照集成学习的思路,子模型之间不能一致,要有差异性,才能从数据中学习到不同的内容。因此,为了让子模型具有差异性,Bagging让每个子模型只学习样本数据的一部分。所以要对数据进行抽样。
- 采样分为有放回和无放回两种方式,其中:有放回采样是在抽取一个样本数据之后立马将其放回总体样本数据中,再进行下一个采样,因此子模型学习的样本数据集中可能会存在内部有重复样本的情况。无放回采样就是构建子模型过程中采集的样本数据不立马放回。
- Out-of-Bag(包外数据) :放回取样会导致一部分样本可能不会被抽取到,这些数据叫包外数据,OOB。
- Bagging可以进行并行化,因为每个子模型之间无强依赖关系,都是单独学习,最后投票做出决策。
随机森林(Random Forest)
Bagging模型+基学习器:决策树。
代码
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
rdf-clf = RandomForestClassifier(
n_estimators=100,
random_state=666,
oob_score=True
)
理解
-
普通决策树在结点划分时从n个样本特征中根据基尼指数或者信息熵选择一个最优的特征进行划分。
随机森林进一步改进,从结点的特征集合中随机选择一个包含k个属性的子集,再从这个子集中选择一个最优划分。
-
随机性体现在特征选取、结点划分上,这样扩大子模型间的差异性,提升泛化能力。
-
训练同样的数据,RF比Bagging效率高是因为RF在Bagging基础上进一步随机选取特征集合子集,不是所有特征。
极限随机树(ExtraTrees)
比随机森林更随机的一个森林
代码
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import ExtraTreesRegressor
et_clf = ExtraTreescClassifier(
n_estimators=100,
oob_score=True,
random_state=666,
bootstrap=True
)
理解
- 与随机森林不同之处在于在随机选择一个包含k个属性的子集之后,在每个属性上随机选择一个阈值,比较不同属性的阈值,再选一个最优划分。
- 进一步提升随机性,增强泛化能力,还能有更快的训练速度。