「机器学习算法的数学解析与Python实现」集成学习方法
在机器学习算法的实际应用中,更值得我们关注的其实是如何提高预测结果的准确率。选择不同的模型,调节模型的各种参数,是最容易想到的方法,但目前业界使用更多的其实是集成学习方法。集成学习方法是关注的不是模型的内部结构,而是不同模型之间的组织关系。
集成学习方法:三个臭皮匠胜过诸葛亮
集成学习(Ensemble Learning)并不是一种独立的机器学习方法,而是一套能够把独立的机器学习方法组合到一起,共同解决问题的协作框架。
前面介绍的机器学习算法,都可称为学习器(Leaner),集成学习把学习器分为:
- 基学习器(Base Learner):不同的机器学习模块来源于同一种算法,譬如都是使用的Logistic回归算法;
- 弱学习器(Weak Learner):不同的机器学习模块来源于不同的算法,譬如组合使用了决策树和SVM。
训练如何集成
将机器学习算法组织起来,主要有两种结构:
-
并联:训练过程是并行的,介个学习器相互独立地完成预测,最后以某种方法把结果合成一份。
-
串联:训练过程是串行的,前一个学习器的预测结果作为后一个学习器的输入,把预测结果传递下去。
预测如何集成
把多个结果整合在一起的方法也主要有两大类:
- 平均法(回归)
- 简单平均法
- 加权平均法
- 投票法(分类)
- 简单多数投票法
- 绝对多数投票法:“多数”必须达到半数,否则拒绝预测;
- 加权投票法
集成学习方法的具体实现方式
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等机器学习领域竞赛中,已经很难看到使用单一模型还能取得良好成绩的选手了,通过使用集成学习、博采众长已经成为共识。