Machine Learning 简明教程

Machine Learning - Boost Model Performance

Boosting 是一种流行的集成学习技术,该技术将若干弱学习器组合在一起以创建强学习器。它的工作原理是:对数据的子集进行迭代训练弱学习器,并向错误分类样本分配较高的权重,以增加它们在后续迭代中的重要性。此过程不断重复,直到达到所需性能级别。

以下是提升机器学习中模型性能的一些技术-

  1. Feature Engineering − 特征工程涉及基于现有特征创建新特征或转换现有特征以使其对模型更有帮助。这可以包括独热编码、缩放、正则化和特征选择等技术。

  2. Hyperparameter Tuning − 超参数是训练期间没有学习到的参数,但是由数据科学家设置。它们控制着模型的行为,微调它们可以显著影响模型性能。网格搜索和随机搜索是超参数微调的常用技术。

  3. Ensemble Learning − 集成学习涉及组合多个模型以提高性能。可以应用诸如装袋法、推进法和堆叠法等技术来创建集成模型。随机森林是装袋集成的示例,而梯度提升机 (GBM) 是推进集成的示例。

  4. Regularization − 正则化是一种通过向损失函数中添加惩罚项来防止过拟合的技术。L1 正则化 (Lasso) 和 L2 正则化 (Ridge) 是线性模型中常用的技术,而丢弃是神经网络中使用的技术。

  5. Data Augmentation − 数据增强涉及通过施加旋转、缩放和翻转等变换基于现有数据生成新数据。这有助于减少过拟合并提高模型性能。

  6. Model Architecture − 模型的架构可以显著影响其性能。深度学习和卷积神经网络 (CNN) 等技术可以用于创建更复杂模型,这些模型能够更好地学习数据中的复杂模式。

  7. Early Stopping − 早期停止是一种通过在模型性能停止在验证集上提高后停止训练过程来防止过拟合的技术。这可以防止模型持续学习数据中的噪声,并且有助于提高泛化能力。

  8. Cross-Validation − 交叉验证是一种用于评估模型在数据多个子集上的性能的技术。这有助于识别过拟合并且可以用于为模型选择最佳超参数。

这些技术可以在 Python 中使用各种机器学习库来实现,例如 scikit-learn、TensorFlow 和 Keras。通过使用这些技术,数据科学家可以提高其模型的性能并创建更精确的预测。

以下示例展示了如何在 Scikit-learn 中实现交叉验证 −

Example

from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier

# Load the iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Create a Gradient Boosting Classifier
gb_clf = GradientBoostingClassifier()

# Perform 5-fold cross-validation on the classifier
scores = cross_val_score(gb_clf, X, y, cv=5)

# Print the average accuracy and standard deviation of the cross-validation scores
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

Output

执行此代码时,将生成以下输出 −

Accuracy: 0.96 (+/- 0.07)

Performance Improvement with Ensembles

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

Sequential ensemble methods

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

Parallel ensemble methods

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

Ensemble Learning Methods

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

Bagging

装袋法也称为引导聚合。在装袋方法中,集成模型尝试通过结合单个模型的预测(这些模型是根据随机生成的训练样本进行训练的)来提高预测精度并降低模型方差。集成模型的最终预测将通过计算所有预测的平均值来给出。装袋方法的最佳示例之一是随机森林。

Boosting

在推进方法中,构建集成模型的主要原则是通过顺序训练每个基础模型估计量来逐步构建集成模型。顾名思义,它基本上结合多个较弱的基础学习器(在训练数据的多次迭代中顺序训练),构建强大的集成模型。在较弱的基础学习器的训练期间,将为较早被错误分类的学习器分配更大的权重。推进方法的一个示例是 AdaBoost。

Voting

在此集成学习模型中,将构建多种不同类型的模型,并且一些简单的统计信息(例如计算均值或中位数等)用于组合预测。此预测将用作训练的附加输入以做出最终预测。

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())

Output

0.7733766233766234

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

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())

Output

0.7629357484620642

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

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())

Output

0.7551435406698566

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

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())

Output

0.7539473684210527

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

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())

Output

0.7746582365003418

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

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())

Output

0.7382262474367738

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