Machine Learning With Python 简明教程
Improving Performance of ML Models
Performance Improvement with Ensembles
集成可以通过组合多个模型为我们提升机器学习结果。基本上,集成模型包含几个单独训练的监督学习模型,将它们的结果通过各种方式合并以实现比单个模型更好的预测性能。集成方法可以分成以下两组 −
Ensemble Learning Methods
以下是最流行的集成学习方法,即组合不同模型的预测的方法 −
Bagging
装袋法也称为引导聚合。在装袋方法中,集成模型尝试通过结合单个模型的预测(这些模型是根据随机生成的训练样本进行训练的)来提高预测精度并降低模型方差。集成模型的最终预测将通过计算所有预测的平均值来给出。装袋方法的最佳示例之一是随机森林。
Bagging Ensemble Algorithms
以下三个是装袋集成算法 −
Bagged Decision Tree
众所周知,装袋集成法适用于方差较高的算法,在这一方面,决策树算法属于佼佼者。在以下 Python 配方中,我们将使用 sklearn 的 BaggingClassifier 函数和 DecisionTreeClassifier(一种分类和回归树算法)在 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 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())
Random Forest
它是装袋决策树的延伸。对于单独的分类器,训练数据集的样本是替换抽取的,但树是以这样的方式构建的,从而降低它们之间的相关性。另外,在构建每棵树时,会考虑特征的随机子集来选择每个分割点,而不是贪心地选择最佳分割点。
在以下 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 diabetes 数据集,如在之前的示例中所做的那样:
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())
Extra Trees
它是装袋决策树集成法的另一个延伸。在这种方法中,随机树是从训练数据集的样本构建的。
在以下 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 diabetes 数据集,如在之前的示例中所做的那样:
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())
Boosting Ensemble Algorithms
以下是两种最常见的提升集成算法 −
AdaBoost
它是其中一个最成功的提升集成算法。此算法的主要关键在于赋予数据集中的实例的权重方式。因此,该算法在构建后续模型时需要较少地关注这些实例。
在以下 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 diabetes 数据集,如在之前的示例中所做的那样:
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())
Stochastic Gradient Boosting
它也被称为梯度提升机。在以下 Python 配方中,我们将使用 sklearn 的 GradientBoostingClassifier 类在 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 GradientBoostingClassifier
现在,我们需要加载 Pima diabetes 数据集,如在之前的示例中所做的那样:
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())
Voting Ensemble Algorithms
如讨论所述,投票首先从训练数据集创建两个或更多独立的模型,然后投票分类器将围绕模型进行封装,同时根据需要对子模型的预测结果求取平均值以生成新数据。
在以下 Python 配方中,我们将使用 sklearn 中的 VotingClassifier 类对 Pima Indian 糖尿病数据集建立投票集成模型,用于分类。我们对逻辑回归、决策树分类器和 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 diabetes 数据集,如在之前的示例中所做的那样:
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())