Loading

「机器学习算法的数学解析与Python实现」集成学习方法

在机器学习算法的实际应用中,更值得我们关注的其实是如何提高预测结果的准确率。选择不同的模型,调节模型的各种参数,是最容易想到的方法,但目前业界使用更多的其实是集成学习方法。集成学习方法是关注的不是模型的内部结构,而是不同模型之间的组织关系。

集成学习方法:三个臭皮匠胜过诸葛亮

集成学习(Ensemble Learning)并不是一种独立的机器学习方法,而是一套能够把独立的机器学习方法组合到一起,共同解决问题的协作框架。

前面介绍的机器学习算法,都可称为学习器(Leaner),集成学习把学习器分为:

  1. 基学习器(Base Learner):不同的机器学习模块来源于同一种算法,譬如都是使用的Logistic回归算法;
  2. 弱学习器(Weak Learner):不同的机器学习模块来源于不同的算法,譬如组合使用了决策树和SVM。

训练如何集成

将机器学习算法组织起来,主要有两种结构:

  1. 并联:训练过程是并行的,介个学习器相互独立地完成预测,最后以某种方法把结果合成一份。

  2. 串联:训练过程是串行的,前一个学习器的预测结果作为后一个学习器的输入,把预测结果传递下去。

预测如何集成

把多个结果整合在一起的方法也主要有两大类:

  1. 平均法(回归)
    1. 简单平均法
    2. 加权平均法
  2. 投票法(分类)
    1. 简单多数投票法
    2. 绝对多数投票法:“多数”必须达到半数,否则拒绝预测;
    3. 加权投票法

集成学习方法的具体实现方式

Bagging算法

Bagging算法全称为Bootstrap Aggregation,这是一种并行集成学习方法

每个学习器都不是采用全部训练集,而只是从训练集中有放回地随机采样一部分作为学习器的训练集。训练完成后采用投票方式进行预测。

Boosting算法

Boosting算法是一种串行集成学习方法

Stacking算法

Stacking的学习器分两层,第一层是若干弱学习器,分别进行预测后把预测结果传递给第二层,第二层通常只有一个机器学习模型,这个模型将根据第一层的预测结果最终给出预测结果。

在Python中使用集成学习方法

在sklearn中只直接提供了Bagging和Boosting两种集成方法,且都在ensemble类库中。

这里以随机森林算法为例,调用代码如下:

随机森林分类算法以CART决策树算法作为弱学习器,采用了Bagging集成学习。

# 导入随机森林分类算法
from sklearn.ensemble import RandomForestClassifier

# 载入鸢尾花数据集
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)

# 训练模型
clf = RandomForestClassifier().fit(X, y)
# 分类预测
clf.predict(X)

预测结果如下:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

性能评估得分:

0.9933333333333333

查看随机森林算法中弱学习器决策树分类算法的使用情况:

clf.estimators_

结果为一个列表:

[DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=1415089736, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=1256596044, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=1697884795, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=57538604, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=1014800791, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=1401588614, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=1916716660, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=1002714909, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=1163523157, splitter='best'),
 DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                        max_features='auto', max_leaf_nodes=None,
                        min_impurity_decrease=0.0, min_impurity_split=None,
                        min_samples_leaf=1, min_samples_split=2,
                        min_weight_fraction_leaf=0.0, presort=False,
                        random_state=796751815, splitter='best')]

集成学习方法的使用场景

在Kaggle等机器学习领域竞赛中,已经很难看到使用单一模型还能取得良好成绩的选手了,通过使用集成学习、博采众长已经成为共识。

posted @ 2021-12-25 19:08  活用数据  阅读(314)  评论(0编辑  收藏  举报