机器学习——Boosting
Boosting:
方法:通过串行(按顺序)的方式集成多个弱模型组合成一个较强的模型,每个弱模型都尝试纠正前一个模型的错误,从而增强整体的预测效果。
并行计算:Boosting的各个预测函数只能顺序生成,因为后一个模型需要根据前一个模型的预测结果进行调整。
代表:AdaBoost和梯度提升机(GBM)是Boosting的代表。
AdaBoost
AdaBoost通过调整样本权重来影响后续模型的训练,使得模型更加关注之前分类错误的样本。
同时对异常值和噪声数据较为敏感。
GBM
GBM通过梯度下降的方式,逐步拟合残差,逼近并降低损失,从而优化模型。
通常对异常值和噪声数据更为稳健。
LightGBM
LightGBM采用直方图和基于叶子的生长策略,有效减少模型的计算量,显著提升训练速度。
同时,它支持并行计算和特征并行化,使其能够高效地处理大规模数据集。
较低的内存使用:通过使用直方图技术,LightGBM能够有效地减少内存的使用。
XGBoost
XGBoost注重控制模型的复杂度,引入了L1和L2正则化项,有助于防止过拟合,提高模型的泛化能力。
XGBoost使用了一种更为复杂的损失函数优化策略,引入了二阶导数信息(牛顿法),
使得模型在寻找最优解时更为高效和准确。
XGBoost支持列式存储和并行计算,能够有效地利用计算机的多核CPU进行加速,使得训练过程更为高效,显著提升训练速度。
AdaBoost在鸢尾花数据集的实现,代码可直接运行,数据集在文章顶部免费下载
# 导入所需的库
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier, GradientBoostingClassifier
from sklearn.metrics import accuracy_score"""AdaBoost是Adaptive Boosting(自适应增强)的缩写,
它的自适应在于:被前一个基本分类器误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。
同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或预先指定的最大迭代次数再确定最后的强分类器。
Adaboost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器,即“三个臭皮匠赛过一个诸葛亮”。
在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致Adaboost算法易受噪声干扰。"""# 加载鸢尾花数据集
data = pd.read_excel('../data/鸢尾花分类数据集/Iris花分类.xlsx')
X = data.iloc[:, :4].values # 选取前4列作为特征
y = data.iloc[:, 4:].values.ravel() # 选取最后1列作为标签# 特征缩放(标准化)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)# 1、创建一个决策树桩分类器实例,作为AdaBoost的基础分类器
# AdaBoost分类精度为: 70.0000%
# base_classifier = DecisionTreeClassifier(max_depth=1) # 设置决策树的最大深度为1,使其成为弱分类器
# 2、或者创建梯度提升决策树基础分类器
# AdaBoost分类精度为: 93.3333%
# base_classifier = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
# 3、或者创建SVM分类器
# AdaBoost分类精度为: 100.0000%
base_classifier = SVC(probability=True, kernel='linear', random_state=42)
# 创建AdaBoost分类器实例
# n_estimators指定弱分类器的数量
# random_state确保每次训练得到相同的结果
adaBoost = AdaBoostClassifier(estimator=base_classifier, n_estimators=100, random_state=42)# 使用训练数据拟合(训练)AdaBoost模型
adaBoost.fit(X_train, y_train)# 使用训练好的模型对测试集进行预测
y_pred = adaBoost.predict(X_test)# 计算预测结果的准确度
accuracy = accuracy_score(y_test, y_pred)# 打印出准确度
print("AdaBoost分类精度为: {:.4f}%".format(accuracy * 100))
结果为:AdaBoost分类精度为: 100.0000%