摘要:本文系统介绍了提升机器学习模型性能的集成学习技术,重点分析了Boosting方法及其实现。文章详细阐述了特征工程、超参数调优、正则化等关键技术,并通过Python代码示例展示了装袋决策树(77%准确率)、随机森林(76%)、极端随机树(75.5%)、AdaBoost(75%)、梯度提升(77.5%)和投票集成(74%)等算法在糖尿病数据集上的应用效果。研究表明,集成学习方法能有效提升模型性能,其中梯度提升方法表现最优。这些技术可通过scikit-learn等库实现,为数据科学家提供了实用的性能提升方案。
目录
机器学习 - 提升模型性能
示例
输出结果
集成学习的性能提升
集成学习方法
装袋集成算法
装袋决策树(Bagged Decision Tree)
输出结果
随机森林(Random Forest)
输出结果
极端随机树(Extra Trees)
输出结果
提升集成算法
AdaBoost
输出结果
随机梯度提升(Stochastic Gradient Boosting)
输出结果
投票集成算法
输出结果
机器学习 - 提升模型性能
提升(Boosting)是一种流行的集成学习技术,它结合多个弱学习器来构建一个强学习器。其工作原理是:在数据子集上迭代训练弱学习器,并为误分类样本分配更高的权重,以提高它们在后续迭代中的重要性。重复此过程,直到达到理想的性能水平。
以下是几种提升机器学习模型性能的技术:
- 特征工程:特征工程指从现有特征中创建新特征,或对现有特征进行转换,使其对模型更具信息价值。相关技术包括独热编码、缩放、归一化和特征选择等。
- 超参数调优:超参数是训练过程中不会被模型学习、而是由数据科学家设定的参数。它们控制着模型的行为,调优超参数能显著影响模型性能。网格搜索和随机搜索是超参数调优的常用技术。
- 集成学习:集成学习通过组合多个模型来提升性能,可采用装袋(Bagging)、提升(Boosting)和堆叠(Stacking)等技术构建集成模型。随机森林(Random Forests)是装袋集成的典型示例,而梯度提升机(GBMs)则是提升集成的代表。
- 正则化:正则化通过在损失函数中添加惩罚项来防止过拟合。L1 正则化(Lasso)和 L2 正则化(Ridge)是线性模型中常用的正则化技术,而丢弃法(Dropout)则适用于神经网络。
- 数据增强:数据增强通过对现有数据应用旋转、缩放、翻转等变换生成新数据,有助于减少过拟合并提升模型性能。
- 模型架构:模型的架构对其性能有显著影响。深度学习和卷积神经网络(CNNs)等技术可用于构建更复杂的模型,从而更好地学习数据中的复杂模式。
- 早停法:早停法通过在验证集上模型性能停止提升时终止训练过程来防止过拟合,避免模型继续学习数据中的噪声,进而提高泛化能力。
- 交叉验证:交叉验证通过在多个数据子集上评估模型性能,帮助识别过拟合问题,并可用于选择模型的最佳超参数。
这些技术可通过 Python 中的多种机器学习库实现,如 scikit-learn、TensorFlow 和 Keras。借助这些技术,数据科学家能够提升模型性能,实现更精准的预测。
以下是使用 Scikit-learn 实现交叉验证的示例:
示例
from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score from sklearn.ensemble import GradientBoostingClassifier # 加载鸢尾花数据集 iris = load_iris() X = iris.data y = iris.target # 创建梯度提升分类器 gb_clf = GradientBoostingClassifier() # 对分类器进行5折交叉验证 scores = cross_val_score(gb_clf, X, y, cv=5) # 打印交叉验证分数的平均准确率和标准差 print("准确率:%0.2f(±%0.2f)" % (scores.mean(), scores.std() * 2))输出结果
运行上述代码后,将得到以下输出:
plaintext
准确率:0.96(±0.07)集成学习的性能提升
集成模型通过组合多个模型,能够提升机器学习的结果。本质上,集成模型由多个独立训练的监督学习模型组成,通过多种方式融合它们的结果,以获得比单个模型更优的预测性能。集成方法可分为以下两类:
- 序列集成方法:顾名思义,这类集成方法中,基学习器是顺序生成的。其设计初衷是利用基学习器之间的依赖性。
- 并行集成方法:这类集成方法中,基学习器是并行生成的。其核心目的是利用基学习器之间的独立性。
集成学习方法
以下是最常用的集成学习方法(即融合不同模型预测结果的方法):
- 装袋(Bagging):装袋又称自助聚合(bootstrap aggregation)。在装袋方法中,集成模型通过组合在随机生成的训练样本上训练的各个模型的预测结果,来提高预测准确率并降低模型方差。集成模型的最终预测结果由所有单个估计器的预测结果取平均值得到。随机森林是装袋方法的典型示例。
- 提升(Boosting):提升方法构建集成模型的核心原则是增量式构建 —— 依次训练每个基模型估计器。正如其名,它通过在多轮训练数据迭代中顺序训练多个弱基学习器,组合形成强大的集成模型。在弱基学习器的训练过程中,会给之前误分类的样本分配更高的权重。AdaBoost 是提升方法的代表。
- 投票(Voting):在这种集成学习模型中,会构建多个不同类型的模型,并使用均值、中位数等简单统计方法融合预测结果。该融合后的预测结果将作为额外输入用于训练,以得出最终预测。
装袋集成算法
以下是三种装袋集成算法:
装袋决策树(Bagged Decision Tree)
已知装袋集成方法适用于高方差算法,而决策树算法正是这类算法的佼佼者。在以下 Python 示例中,我们将使用 sklearn 的 BaggingClassifier 函数,结合分类与回归树算法(DecisionTreeClassifier),在皮马印第安人糖尿病数据集上构建装袋决策树集成模型。
1,首先导入所需的包:
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 DecisionTreeClassifier2,加载皮马糖尿病数据集(与之前示例一致):
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]3,设置 10 折交叉验证的输入:
seed = 7 kfold = KFold(n_splits=10, random_state=seed) cart = DecisionTreeClassifier()4,指定要构建的树的数量(此处构建 150 棵树):
num_trees = 1505,构建模型:
model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)6,计算并打印结果:
results = cross_val_score(model, X, Y, cv=kfold) print(results.mean())输出结果
plaintext
0.7733766233766234上述输出表明,我们的装袋决策树分类器模型准确率约为 77%。
随机森林(Random Forest)
随机森林是装袋决策树的延伸。对于单个分类器,训练数据集的样本采用有放回抽样,但构建树时会通过特定方式降低它们之间的相关性。此外,在每棵树的构建过程中,并非贪婪地选择最佳分裂点,而是从随机选择的特征子集中确定分裂点。
在以下 Python 示例中,我们将使用 sklearn 的 RandomForestClassifier 类,在皮马印第安人糖尿病数据集上构建装袋随机森林集成模型。
1,首先导入所需的包:
from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier2,加载皮马糖尿病数据集(与之前示例一致):
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]3,设置 10 折交叉验证的输入:
seed = 7 kfold = KFold(n_splits=10, random_state=seed)4,指定要构建的树的数量和分裂点选择的特征数量(此处构建 150 棵树,从 5 个特征中选择分裂点):
num_trees = 150 max_features = 55,构建模型:
model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)6,计算并打印结果:
results = cross_val_score(model, X, Y, cv=kfold) print(results.mean())输出结果
plaintext
0.7629357484620642上述输出表明,我们的装袋随机森林分类器模型准确率约为 76%。
极端随机树(Extra Trees)
极端随机树是装袋决策树集成方法的另一种延伸。该方法中,随机树基于训练数据集的样本构建。
在以下 Python 示例中,我们将使用 sklearn 的 ExtraTreesClassifier 类,在皮马印第安人糖尿病数据集上构建极端随机树集成模型。
1,首先导入所需的包:
from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.ensemble import ExtraTreesClassifier2,加载皮马糖尿病数据集(与之前示例一致):
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]3,设置 10 折交叉验证的输入:
seed = 7 kfold = KFold(n_splits=10, random_state=seed)4,指定要构建的树的数量和分裂点选择的特征数量(此处构建 150 棵树,从 5 个特征中选择分裂点):
num_trees = 150 max_features = 55,构建模型:
model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)6,计算并打印结果:
results = cross_val_score(model, X, Y, cv=kfold) print(results.mean())输出结果
plaintext
0.7551435406698566上述输出表明,我们的装袋极端随机树分类器模型准确率约为 75.5%。
提升集成算法
以下是两种最常用的提升集成算法:
AdaBoost
AdaBoost 是最成功的提升集成算法之一。该算法的核心在于为数据集中的样本分配权重的方式 —— 这使得算法在构建后续模型时,可减少对部分样本的关注。
在以下 Python 示例中,我们将使用 sklearn 的 AdaBoostClassifier 类,在皮马印第安人糖尿病数据集上构建 AdaBoost 集成分类模型。
1,首先导入所需的包:
from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.ensemble import AdaBoostClassifier2,加载皮马糖尿病数据集(与之前示例一致):
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]3,设置 10 折交叉验证的输入:
seed = 5 kfold = KFold(n_splits=10, random_state=seed)4,指定要构建的树的数量(此处构建 50 棵树):
num_trees = 505,构建模型:
model = AdaBoostClassifier(n_estimators=num_trees, random_state=seed)6,计算并打印结果:
results = cross_val_score(model, X, Y, cv=kfold) print(results.mean())输出结果
plaintext
0.7539473684210527上述输出表明,我们的 AdaBoost 集成分类器模型准确率约为 75%。
随机梯度提升(Stochastic Gradient Boosting)
随机梯度提升又称梯度提升机(Gradient Boosting Machines)。在以下 Python 示例中,我们将使用 sklearn 的 GradientBoostingClassifier 类,在皮马印第安人糖尿病数据集上构建随机梯度提升集成分类模型。
1,首先导入所需的包:
from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.ensemble import GradientBoostingClassifier2,加载皮马糖尿病数据集(与之前示例一致):
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]3,设置 10 折交叉验证的输入:
seed = 5 kfold = KFold(n_splits=10, random_state=seed)4,指定要构建的树的数量(此处构建 50 棵树):
num_trees = 505,构建模型:
model = GradientBoostingClassifier(n_estimators=num_trees, random_state=seed)6,计算并打印结果:
results = cross_val_score(model, X, Y, cv=kfold) print(results.mean())输出结果
plaintext
0.7746582365003418上述输出表明,我们的梯度提升集成分类器模型准确率约为 77.5%。
投票集成算法
如前所述,投票方法首先从训练数据集构建两个或多个独立模型,然后由投票分类器封装这些模型,并在需要处理新数据时,对各子模型的预测结果取平均值。
在以下 Python 示例中,我们将使用 sklearn 的 VotingClassifier 类,在皮马印第安人糖尿病数据集上构建投票集成分类模型。我们将逻辑回归、决策树分类器和支持向量机(SVM)的预测结果组合起来,用于解决分类问题。
1,首先导入所需的包:
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 VotingClassifier2,加载皮马糖尿病数据集(与之前示例一致):
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]3,设置 10 折交叉验证的输入:
kfold = KFold(n_splits=10, random_state=7)4,创建子模型:
estimators = [] model1 = LogisticRegression() estimators.append(('logistic', model1)) model2 = DecisionTreeClassifier() estimators.append(('cart', model2)) model3 = SVC() estimators.append(('svm', model3))6,组合上述子模型的预测结果,创建投票集成模型:
ensemble = VotingClassifier(estimators) results = cross_val_score(ensemble, X, Y, cv=kfold) print(results.mean())输出结果
plaintext
0.7382262474367738上述输出表明,我们的投票集成分类器模型准确率约为 74%。