提升机器学习模型性能



集成学习提高性能

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

顺序集成方法

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

并行集成方法

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

集成学习方法

以下是几种最流行的集成学习方法,也就是组合不同模型预测结果的方法:

Bagging

Bagging也被称为Bootstrap Aggregation。在Bagging方法中,集成模型试图通过组合在随机生成的训练样本上训练的各个模型的预测结果来提高预测准确率并降低模型方差。集成模型的最终预测将通过计算所有单个估计器的预测平均值来给出。随机森林是Bagging方法的一个很好的例子。

Boosting

在Boosting方法中,构建集成模型的主要原理是通过依次训练每个基础模型估计器来逐步构建它。顾名思义,它基本上结合了多个弱基础学习器,这些学习器在训练数据的多个迭代中依次训练,以构建强大的集成。在训练弱基础学习器期间,会为之前被错误分类的学习器分配更高的权重。AdaBoost是Boosting方法的一个例子。

投票

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

Bagging 集成算法

以下是三种Bagging集成算法:

Bagged决策树

众所周知,Bagging集成方法适用于方差较大的算法,在这方面,决策树算法是最好的选择。在下面的Python示例中,我们将使用sklearn的BaggingClassifier函数和DecisionTreeClasifier(一种分类和回归树算法)在Pima印第安人糖尿病数据集上构建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%的Bagged决策树分类器模型的准确率。

随机森林

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

在下面的Python示例中,我们将使用sklearn的RandomForestClassifier类在Pima印第安人糖尿病数据集上构建Bagged随机森林集成模型。

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

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%的Bagged随机森林分类器模型的准确率。

Extra Trees

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

在下面的Python示例中,我们将使用sklearn的ExtraTreesClassifier类在Pima印第安人糖尿病数据集上构建Extra Tree集成模型。

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

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%的Bagged Extra Trees分类器模型的准确率。

Boosting 集成算法

以下是两种最常见的Boosting集成算法:

AdaBoost

它是最成功的Boosting集成算法之一。该算法的关键在于赋予数据集中实例权重的方式。由于这个原因,该算法在构建后续模型时需要减少对这些实例的关注。

在下面的Python示例中,我们将使用sklearn的AdaBoostClassifier类在Pima印第安人糖尿病数据集上构建用于分类的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

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

随机梯度提升

它也称为梯度提升机。在下面的Python示例中,我们将使用sklearn的GradientBoostingClassifier类在Pima印第安人糖尿病数据集上构建用于分类的随机梯度提升集成模型。

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

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印第安人糖尿病数据集上构建投票集成模型。我们将逻辑回归、决策树分类器和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%的投票分类器集成模型的准确率。

广告