提高 ML 模型的性能


集成可以通过组合多个模型来提升机器学习的结果。基本上,集成模型由几个单独训练的监督学习模型组成,它们的结果以各种方式合并,以实现比单个模型更好的预测性能。集成方法可以分为以下两组:

序列集成方法

顾名思义,在这些集成方法中,基础学习器是按顺序生成的。这种方法的动机是利用基础学习者之间的依赖关系。

并行集成方法

顾名思义,在这些集成方法中,基础学习器是并行生成的。这种方法的动机是利用基础学习者之间的独立性。

集成学习方法


以下是最流行的集成学习方法,即组合来自不同模型的预测的方法:

Bagging

术语 bagging 也称为引导聚合。在 bagging 方法中,集成模型试图通过组合在随机生成的训练样本上训练的单个模型的预测来提高预测准确性并减少模型方差。集成模型的最终预测将通过计算来自各个估计器的所有预测的平均值来给出。装袋方法的最佳示例之一是随机森林。

Boosting

在 boosting 方法中,构建集成模型的主要原理是通过依次训练每个基本模型估计器来增量构建它。顾名思义,它基本上结合了几个星期的基础学习者,在训练数据的多次迭代中按顺序训练,以构建强大的集成。在周基学习者的训练过程中,较高的权重被分配给那些较早被错误分类的学习者。提升方法的例子是 AdaBoost。

Voting

在这个集成学习模型中,构建了多个不同类型的模型,并使用一些简单的统计数据,如计算均值或中位数等来组合预测。该预测将作为训练的额外输入,以进行最终预测。

Bagging 集成算法


以下是三种bagging ensemble算法:

袋装决策树

正如我们所知,bagging 集成方法适用于具有高方差的算法,在这个问题上,最好的方法是决策树算法。在下面的 Python 秘籍中,我们将在 Pima Indians 糖尿病数据集上使用 sklearn 的 BaggingClassifier 函数和 DecisionTreeClasifier(一种分类和回归树算法)来构建袋装决策树集成模型。

首先,导入需要的包如下:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

现在,我们需要像前面的示例一样加载 Pima 糖尿病数据集:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下来,给出 10 倍交叉验证的输入如下:

seed = 7
kfold = KFold(n_splits=10, random_state=seed)
cart = DecisionTreeClassifier()

我们需要提供我们要建造的树的数量。在这里,我们正在建造 150 棵树:

num_trees = 150

接下来,借助以下脚本构建模型:

model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)

计算并打印结果如下:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
0.7733766233766234

上面的输出显示我们的袋装决策树分类器模型的准确率约为 77%。

随机森林

它是袋装决策树的扩展。对于单个分类器,训练数据集的样本是带替换的,但是树的构造方式会降低它们之间的相关性。此外,考虑随机的特征子集来选择每个分割点,而不是在构建每棵树时贪婪地选择最佳分割点。

在以下 Python 秘籍中,我们将在 Pima Indians 糖尿病数据集上使用 sklearn 的 RandomForestClassifier 类构建袋装随机森林集成模型。

首先,导入需要的包如下:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

现在,我们需要像前面的例子一样加载 Pima 糖尿病数据集:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下来,给出 10 倍交叉验证的输入如下:

seed = 7
kfold = KFold(n_splits=10, random_state=seed)

我们需要提供我们要建造的树的数量。在这里,我们从 5 个特征中选择了 150 棵带有分裂点的树:

num_trees = 150
max_features = 5

接下来,借助以下脚本构建模型:

model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)

计算并打印结果如下:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
0.7629357484620642

上面的输出显示我们的袋装随机森林分类器模型的准确率约为 76%。

额外的树

它是袋装决策树集成方法的另一个扩展。在这种方法中,随机树是从训练数据集的样本中构建的。

在以下 Python 秘籍中,我们将在 Pima Indians 糖尿病数据集上使用 sklearn 的 ExtraTreesClassifier 类构建额外的树集成模型。

首先,导入需要的包如下:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier

现在,我们需要像前面的例子一样加载 Pima 糖尿病数据集:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下来,给出 10 倍交叉验证的输入如下:

seed = 7
kfold = KFold(n_splits=10, random_state=seed)

我们需要提供我们要建造的树的数量。在这里,我们从 5 个特征中选择了 150 棵带有分裂点的树:

num_trees = 150
max_features = 5

接下来,借助以下脚本构建模型:

model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)

计算并打印结果如下:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
0.7551435406698566

上面的输出表明,我们的袋装额外树分类器模型的准确率约为 75.5%。

提升集成算法


以下是两种最常见的 boosting ensemble 算法:

AdaBoost

它是最成功的提升集成算法之一。该算法的主要关键在于它们赋予数据集中实例权重的方式。因此,该算法在构建后续模型时需要较少关注实例。

在以下 Python 秘籍中,我们将在 Pima Indians 糖尿病数据集上使用 sklearn 的 AdaBoostClassifier 类构建 Ada Boost 集成模型进行分类。

首先,导入需要的包如下:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier

现在,我们需要像前面的例子一样加载 Pima 糖尿病数据集:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下来,给出 10 倍交叉验证的输入如下:

seed = 5
kfold = KFold(n_splits=10, random_state=seed)

我们需要提供我们要建造的树的数量。在这里,我们从 5 个特征中选择了 150 棵带有分裂点的树:

num_trees = 50

接下来,借助以下脚本构建模型:

model = AdaBoostClassifier(n_estimators=num_trees, random_state=seed)

计算并打印结果如下:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
0.7539473684210527

上面的输出显示我们的 AdaBoost 分类器集成模型的准确率约为 75%。

随机梯度提升

它也被称为梯度提升机。在下面的 Python 秘籍中,我们将在 Pima Indians 糖尿病数据集上使用 sklearn 的 GradientBoostingClassifier 类构建随机梯度 Boostingensemble 模型进行分类。

首先,导入需要的包如下:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier

现在,我们需要像前面的例子一样加载 Pima 糖尿病数据集:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下来,给出 10 倍交叉验证的输入如下:

seed = 5
kfold = KFold(n_splits=10, random_state=seed)

我们需要提供我们要建造的树的数量。在这里,我们从 5 个特征中选择了 150 棵带有分裂点的树:

num_trees = 50

接下来,借助以下脚本构建模型:

model = GradientBoostingClassifier(n_estimators=num_trees, random_state=seed)

计算并打印结果如下:

results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())
0.7746582365003418

上面的输出显示我们的梯度提升分类器集成模型的准确率约为 77.5%。

投票集成算法


如前所述,投票首先从训练数据集中创建两个或多个独立模型,然后投票分类器将包装模型,并在需要新数据时对子模型的预测取平均值。

在下面的 Python 秘籍中,我们将在 Pima Indians 糖尿病数据集上使用 sklearn 的 VotingClassifier 类构建用于分类的 Voting 集成模型。我们将逻辑回归、决策树分类器和 SVM 的预测结合在一起,用于分类问题,如下所示:

首先,导入需要的包如下:

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier

现在,我们需要像前面的例子一样加载 Pima 糖尿病数据集:

path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]

接下来,给出 10 倍交叉验证的输入如下:

kfold = KFold(n_splits=10, random_state=7)

接下来,我们需要创建子模型如下:

estimators = []
model1 = LogisticRegression()
estimators.append(('logistic', model1))
model2 = DecisionTreeClassifier()
estimators.append(('cart', model2))
model3 = SVC()
estimators.append(('svm', model3))

现在,通过结合上述创建的子模型的预测来创建投票集成模型。

ensemble = VotingClassifier(estimators)
results = cross_val_score(ensemble, X, Y, cv=kfold)
print(results.mean())
0.7382262474367738

上面的输出显示我们的投票分类器集成模型的准确率约为 74%。