赞
踩
目录
4 Adaboost算法(Adaptive Boosting)
5 梯度提升树 (Gradient Boosting Decision Tree)
5.3.1 GradientBoostingClassifier
5.3.2 GradientBoostingRegressor
6 XGboost(Extreme Gradient Boosting)极端梯度提升树
6.4.3 通用参数(General Parameters)
6.4.5 目标参数(Objective Parameters)
6.4.6 评估参数(Evaluation Parameters)
AdaBoost算法(Adaptive Boosting)是一种迭代算法,其核心思想是将多个弱分类器组合成一个强分类器。在机器学习中,弱分类器通常指的是分类能力稍强于随机猜测的分类器,而强分类器则是指分类能力很强的分类器。AdaBoost算法通过调整样本权重和弱分类器权重,使得每次迭代中,被错分的样本权重增加,而被正确分类的样本权重减小,从而确保弱分类器能够更多地关注那些难以分类的样本。
sklearn.ensemble.AdaBoostClassifier()
base_estimator
:指定基分类器,默认为 DecisionTreeClassifier(max_depth=1)
,即深度为 1 的决策树(决策树桩)。n_estimators
:弱分类器的数量,默认为 50。learning_rate
:学习率,用于控制每个弱分类器权重的更新速度,默认为 1.0。algorithm
:指定用于提升的算法,可以是 "SAMME" 或 "SAMME.R",默认为 "SAMME.R"。random_state
:控制随机性的种子,用于基分类器的训练和数据集的划分。- from sklearn.ensemble import AdaBoostClassifier
- from sklearn.datasets import make_classification
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import accuracy_score
-
- # 生成一个模拟的二分类数据集
- X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, random_state=42)
-
- # 划分数据集为训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 初始化 AdaBoostClassifier,使用默认参数
- abc = AdaBoostClassifier(random_state=42)
-
- # 使用训练数据拟合模型
- abc.fit(X_train, y_train)
-
- # 使用测试集进行预测
- y_pred = abc.predict(X_test)
-
- # 计算并打印准确率
- accuracy = accuracy_score(y_test, y_pred)
- print("Accuracy: {:.2f}%".format(accuracy * 100))
-
- # 你还可以查看模型的更多属性,如弱分类器的数量、每个弱分类器的权重等
- print("Number of estimators:", abc.n_estimators_)
- print("Estimator weights:", abc.estimator_weights_)
- print("Estimator errors:", abc.estimator_errors_)
梯度提升树(Gradient Boosting Decision Tree,简称GBDT)是一种集成学习算法,它通过构建多个决策树并将它们的结果进行组合来改进预测性能。梯度提升树被认为是统计学习中性能最好的方法之一,它结合了梯度提升(Gradient Boosting)和决策树(Decision Tree)两种技术。
1. 初始化:
2. 公式推导:
y
是真实标签,F(x)
是模型预测值。m
步迭代,我们的目标是找到一个函数(即弱学习器)和一个系数,使得的损失函数最小化。β_m
和T_m(x)
。首先,计算损失函数关于F(x)
的梯度,记为。β_m
的导数来找到最优的β_m
。3.负梯度拟合
在scikit-learn库中,GradientBoostingClassifier
和 GradientBoostingRegressor
是实现梯度提升决策树(Gradient Boosting Decision Tree)的类。这两个类提供了构建GBDT模型的API接口。以下是关于这些API的基本介绍:
5.3.1 GradientBoostingClassifier
loss
: 损失函数。对于分类问题,可选的有'deviance'(对数似然损失,等同于'exponential')和'exponential'。默认是'deviance'。learning_rate
: 学习率(或收缩率),用于权重更新。较小的值指定了更多的迭代次数。默认是0.1。n_estimators
: 弱学习器的最大数量(即树的数量)。默认是100。max_depth
: 单个回归估计器的最大深度。默认是3。min_samples_split
: 分割内部节点所需的最小样本数。默认是2。min_samples_leaf
: 叶子节点所需的最小样本数。默认是1。subsample
: 用于拟合各个基础学习器的样本比例。默认是1.0,即使用全部样本。random_state
: 随机数生成器的种子。fit(X, y[, sample_weight, ...])
: 使用输入数据X和标签y来训练模型。predict(X)
: 对输入数据X进行预测。predict_proba(X)
: 返回每个类别的概率估计。predict_log_proba(X)
: 返回每个类别的对数概率估计。score(X, y[, sample_weight])
: 返回给定测试数据和标签上的平均准确度。5.3.2 GradientBoostingRegressor
GradientBoostingRegressor
的API与GradientBoostingClassifier
非常相似,但有一些差异:
loss
: 对于回归问题,可选的有'ls'(均方误差),'lad'(绝对损失,等同于'huber'且epsilon=1.0),'huber'和'quantile'。默认是'ls'。GradientBoostingClassifier
类似。GradientBoostingClassifier
的方法类似,但通常没有predict_proba
和predict_log_proba
方法,因为回归问题不涉及概率估计。- from sklearn.datasets import load_iris
- from sklearn.model_selection import train_test_split
- from sklearn.ensemble import GradientBoostingClassifier
-
- # 加载数据集
- iris = load_iris()
- X = iris.data
- y = iris.target
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 初始化GBDT分类器
- gbdt = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
-
- # 训练模型
- gbdt.fit(X_train, y_train)
-
- # 预测
- y_pred = gbdt.predict(X_test)
-
- # 评估模型
- print("Accuracy:", gbdt.score(X_test, y_test))
XGBoost是对梯度提升算法的改进,求解损失函数极值时使用了牛顿法,将损失函数泰勒展开到二阶。另外,损失函数中加入了正则化项,这有助于防止过拟合。正则化项定义了模型的复杂程度,其中包含了人工设置的参数以及决策树所有叶子节点值形成的向量和叶子节点数。
XGBoost算法的公式推导主要涉及其目标函数的构建和优化。以下是一个简化的推导过程:
XGBoost的目标函数由两部分组成:损失函数和正则化项。损失函数衡量了模型对训练数据的拟合程度,而正则化项则用于控制模型的复杂度,防止过拟合。
目标函数的一般形式为:
其中:
在XGBoost中,常用的正则化项包括树的叶子节点数 和叶子节点权重的范数。因此,正则化项可以表示为:
其中:
在优化目标函数时,XGBoost使用了泰勒展开来近似损失函数。假设在第次迭代时,模型对第 个样本的预测值为 ,则在第 次迭代时,损失函数可以表示为:
其中:
将损失函数的泰勒展开式和正则化项代入目标函数,得到:
接下来,可以通过求解这个目标函数的最小值来得到第 棵树的参数。这通常涉及到对目标函数进行化简、求导和求解最优解等步骤。
首先,我们注意到目标函数中的 是一个常数项,因为它不依赖于第 ( t ) 棵树的参数。因此,在求解最优解时,我们可以将其从目标函数中移除。
接下来,我们将目标函数中与 相关的项合并在一起,得到:
由于 表示第 棵树对第个样本的预测值,我们可以将其改写为树结构的形式。假设树有 个叶子节点,每个叶子节点的权重为 ,则 可以表示为,其中 表示样本所属的叶子节点。
因此,目标函数可以改写为:
其中, 表示所有属于第 个叶子节点的样本的集合。
为了求解最优权重,我们可以对目标函数关于 求导并令其等于零。这样,我们可以得到每个叶子节点的最优权重:
得到最优权重后,我们可以将其代入目标函数,得到仅与树结构相关的目标函数:
XGBoost(Extreme Gradient Boosting)是一个优化分布式梯度提升库的开源实现,旨在高效、灵活且可移植。其Python API允许用户轻松地构建、训练和评估模型。以下是XGBoost API的一些关键组件和常用参数的简要概述:
以下是一个使用XGBoost API进行二分类任务的基本示例:
- import xgboost as xgb
- from sklearn.model_selection import train_test_split
- from sklearn.datasets import load_breast_cancer
-
- # 加载数据集
- data = load_breast_cancer()
- X, y = data.data, data.target
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 转换为DMatrix格式,这是XGBoost内部的数据结构
- dtrain = xgb.DMatrix(X_train, label=y_train)
- dtest = xgb.DMatrix(X_test, label=y_test)
-
- # 设置参数
- param = {
- 'max_depth': 3, # 树的深度
- 'eta': 0.3, # 学习率
- 'objective': 'binary:logistic', # 二分类问题的目标函数
- 'num_class': 1} # 类别数,二分类问题设置为1
-
- # 训练模型
- num_round = 20 # 迭代次数
- bst = xgb.train(param, dtrain, num_round)
-
- # 预测
- preds = bst.predict(dtest)
-
- # 将预测概率转换为类别(0或1)
- y_pred = [1 if x > 0.5 else 0 for x in preds]
-
- # ...(此处可以添加评估代码,如计算准确率、召回率等)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。