提高机器学习模型的性能


通过 Ensemble 提高性能

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

顺序集成方法

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

并行集成方法

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

集成学习方法

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

套袋

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

提升

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

表决

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

装袋集成算法

以下是三种装袋集成算法 -

袋装决策树

我们知道,bagging 集成方法与具有高方差的算法配合得很好,在这方面,最好的方法是决策树算法。在下面的 Python 秘籍中,我们将通过使用 sklearn 的 BaggingClassifier 函数和 DecisionTreeClasifier(一种分类和回归树算法)在 Pima Indians 糖尿病数据集上构建 bagged 决策树集成模型。

首先,导入所需的包,如下所示 -

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 配方中,我们将使用 sklearn 的 RandomForestClassifier 类在 Pima Indians 糖尿病数据集上构建袋装随机森林集成模型。

首先,导入所需的包,如下所示 -

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)

我们需要提供我们要建造的树的数量。在这里,我们正在构建 150 棵树,其分割点选自 5 个特征 -

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 配方中,我们将使用 sklearn 的 ExtraTreesClassifier 类在 Pima Indians 糖尿病数据集上构建额外的树集成模型。

首先,导入所需的包,如下所示 -

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)

我们需要提供我们要建造的树的数量。在这里,我们正在构建 150 棵树,其分割点选自 5 个特征 -

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

上面的输出显示,我们的 bagged extra trees 分类器模型的准确率约为 75.5%。

增强集成算法

以下是两种最常见的增强集成算法 -

阿达助推器

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

在下面的 Python 秘籍中,我们将使用 sklearn 的 AdaBoostClassifier 类在 Pima Indians 糖尿病数据集上构建 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)

我们需要提供我们要建造的树的数量。在这里,我们正在构建 150 棵树,其分割点选自 5 个特征 -

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 秘籍中,我们将使用 sklearn 的 GradientBoostingClassifier 类在 Pima Indians 糖尿病数据集上构建用于分类的随机梯度 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)

我们需要提供我们要建造的树的数量。在这里,我们正在构建 150 棵树,其分割点选自 5 个特征 -

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 秘籍中,我们将使用 sklearn 的 VotingClassifier 类在 Pima Indians 糖尿病数据集上构建用于分类的投票集成模型。我们将逻辑回归、决策树分类器和 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%。