📜  改善ML模型的性能

📅  最后修改于: 2020-12-10 05:44:21             🧑  作者: Mango


整体演奏的性能提升

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

顺序集成法

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

并行合奏方法

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

合奏学习方法

以下是最受欢迎的集成学习方法,即用于组合来自不同模型的预测的方法-

装袋

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

提升

在Boosting方法中,构建集成模型的主要原理是通过顺序地训练每个基本模型估计器来逐步构建它。顾名思义,它基本上是结合几个星期的学习者,并在多次迭代的训练数据上依次进行训练,以建立强大的整体。在每周基本学习者的培训中,较高的权重分配给了那些较早分类错误的学习者。增强方法的示例是AdaBoost。

表决

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

套袋合奏算法

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

袋装决策树

众所周知,套袋集成方法可以很好地处理方差较大的算法,因此,最好的方法是决策树算法。在以下Python配方中,我们将通过在Simaarn糖尿病数据集上使用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)

我们需要提供要建造的树木数量。在这里,我们正在构建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食谱中,我们将通过在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)

我们需要提供要建造的树木数量。在这里,我们正在构建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

上面的输出显示,我们的袋装额外树木分类器模型的准确性约为75.5%。

提升合奏算法

以下是两种最常见的增强合奏算法-

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)

我们需要提供要建造的树木数量。在这里,我们正在构建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配方中,我们将通过在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)

我们需要提供要建造的树木数量。在这里,我们正在构建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

上面的输出显示,我们的Gradient Boosting分类器集成模型的准确性约为77.5%。

投票合奏算法

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

在以下Python配方中,我们将通过在Pima Indians糖尿病数据集上使用sklearn的VotingClassifier类来构建用于分类的Voting集成模型。我们将Logistic回归,决策树分类器和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%。