当前位置:   article > 正文

数据挖掘xgb使用总结

xgb

数据挖掘xgb使用总结

1.集成学习背景

说到Xgb一般会先想到GBDT,从而引出boost类模型,什么是xgb模型,简单的说这就是一个常见的分类(回归)模型,和LR,SVM一样广泛应用在数据分类中,xgb的全称是X (Extreme) GBoosted,其中的X是极端的,G是梯度,翻译过来可以是极致的梯度提升模型,说到底还是梯度提升模型,本质和gbdt,adaboost一样的“误差”渐少的集成模型方式。那为什么会有如此好的效果呐?
先提到boost开始,对待一个决策问题我们首先会想到使用多人意见进行综合然后输出最终结果,即实际生产中我们很难产出一个决策力超强的模型,但是总能生产出"有点"准的策略,集成学习(boost、bagging)便是利用这一特点,选择相对较准的弱模型进行“组合”得到一个强模型。当然这些都是感官认识,实际理论支持可以以PAC准则(不是pca)进行证明,这些我们不会进行过多讨论。
实际的生产中这类模型比较受欢迎,相比较LR这类“线性”单特征组合模型,集成学习能更多的学习到内部特征组合也同时能得到更高的准召,但往往会有‘过拟合’的困扰,这些后面在剪枝,缩减等trick上进行了优化。

2.常见模型及特点

2.1 模型adaboost

Adaboost模型作为介绍boosting类型模型就像rf在bagging模型中一样,模型的迭代内容比较能代表boosting的迭代过程,其实在生产中我们不太会用了,为什么呐?我们直接从迭代过程进行了解
基本原理:学习较多的“弱分类器”利用“权重”将“弱分类器”进行加权得到最终结果
涉及两个问题1)“弱分类器”如何学习? 2)加权的权重如何计算?

提高上一轮弱分类器误分类数据的权重,降低分类正确的分类数据权重;当前分类器可以对分类正确的起到很好的分类作用,而当前分类器错误的由于样本权重提高,在下一轮构造弱分类器时对loss的影响(惩罚)更大,因此下一轮分类器会偏向上一轮分类错误的数据,迭代多轮即生产多轮弱分类器
X i j , Y i , G i ( x ) , w i j , e i , D i , Z i , a i X^{j}_i,Y_i ,G_i(x),w_ij,e_i,D_i,Z_i,a_i Xij,Yi,Gi(x),wij,ei,Di,Zi,ai 一般i表示第i个data,j表示第j维数据,所有上式子的取值是第i个数据的第j维数值。上面的一组符号表示分别代表:待分类数据,label,第i个弱分类器,第i个分类器对应样本的权重,第i个分类器的分类误差率,权重的vertor表示,第i轮的规范化因子(用于更新下一个分类器的权重),第i个分类器的权重,看到这么多定义其实直接组装就可以知道分类器的结果了:
G ( x ) = s i g n ( f ( x ) ) = s i g n [ ∑ a i G i ( x ) ] G(x) = sign(f(x)) = sign[\sum a_iG_i(x)] G(x)=sign(f(x))=sign[aiGi(x)]
在这里插入图片描述
adaboost经常会说训练误差是以指数速率下降的,可以通过下式得出:
1 / N ∑ I ( G ( x i ) ! = y i ) < = e x p ( − 2 M r 2 ) 1/N \sum I(G(x_i)!=y_i)<=exp(-2Mr^2) 1/NI(G(xi)!=yi)<=exp(2Mr2)
不等式左侧即为adaboost函数的平均误差,右侧是以r为参数指数函数

GBDT与XGB模型

GBDT(Gradient Boosting Decision Tree)是一种基于决策树集成学习算法的提升方法。在GBDT中,每棵决策树都是按照梯度下降的思想进行构造的,每一棵树学习的是前一棵树的残差,最终将所有树的输出进行累加得到最终的模型输出结果。GBDT具有较高的准确率和稳定性,在各种类型的应用场景中广泛应用。
XGBoost(eXtreme Gradient Boosting)是基于GBDT算法的一种高性能的机器学习算法库,具有更快的训练速度和更好的预测性能,通常在Kaggle等比赛中获得不错的成绩。XGBoost在GBDT的基础上进行了优化,包括自定义目标函数、缺失值处理、并行计算等方面,因此在处理大规模数据时也能够表现出色。

GBDT

GBDT作为一种提升算法,相较于单个决策树模型,它具有更好的预测性能和泛化能力。GBDT基于梯度下降算法,以残差最小化为目标,通过迭代不断地生成新的决策树模型。GBDT训练的过程可以分为以下几个步骤:
1)初始化F0(x),令F0(x)=0。
2)计算负梯度的残差r1, r 1 , i = − [ ∂ L ( y i , F 0 ( x i ) ) ∂ F 0 ( x i ) ] F 0 ( x ) = 0 r{1,i}=-[\frac{\partial L(yi,F0(xi))}{\partial F0(xi)}]{F0(x)=0} r1,i=[F0(xi)L(yi,F0(xi))]F0(x)=0
3)对于每一次迭代m=1,2,…,M,进行以下操作:

使用数据集 D = {(xi,ri)} 训练一棵回归树,得到第m棵树 Fm(x),使得 F m ( x i ) Fm(xi) Fm(xi) 能够最小化 ∑ i = 1 n L ( y i , F m − 1 ( x i ) + F m ( x i ) ) \sum{i=1}^{n}{L(yi,F{m-1}(xi)+Fm(xi))} i=1nL(yi,Fm1(xi)+Fm(xi)),其中 F m − 1 F_{m-1} Fm1 表示前m-1棵树的叠加结果。
通过调整叶结点的输出值,使得 F m Fm Fm的输出值逼近r1。也就是求解 F m ( x ) Fm(x) Fm(x) 使得 F m ( x i ) − r 1 , i Fm(xi)-r_{1,i} Fm(xi)r1,i表现最优。
更新模型 Fm(x)=Fm-1(x)+ηFm(x)。

4)输出叠加的树模型 F ( x ) = F 0 ( x ) + ∑ m = 1 M η m F m ( x ) F(x)=F0(x)+∑{m=1}^{M}ηmFm(x) F(x)=F0(x)+m=1MηmFm(x)

LR与GBDT组合扩展

GBDT在分类和回归问题中都表现出色,但存在一些问题,比如对于极端值离群点的处理不够灵活。此时,可以通过将GBDT与LR(Logistic Regression)模型组合来进行扩展。
具体而言,可以将GBDT产生的叶子节点输出的结果作为LR的输入特征,然后训练一个二分类/多分类的LR模型。通过GBDT进行特征提取,再将提取后的特征作为LR模型的输入,可以提高分类准确率和可靠性。这种组合模型通常称为GBDT-LR模型。

boost与bagging

Boosting和Bagging是两种集成学习策略。
Boosting是一种逐步增强每个基分类器的性能的策略。在每一轮中,Boosting算法都会根据先前分类器的性能调整样本权重,使得在下一轮中错误分类的样本更难被正确分类。Boosting方法包括Adaboost、GBDT和XGBoost等。
Bagging(Bootstrap aggregating)则是通过从训练数据中随机有放回抽样生成多个数据集,每个数据集之间相互独立,然后基于每个数据集训练多个模型,最后将这些模型的输出进行平均或投票从而得到最终的分类结果。Bagging方法包括随机森林等。

如何使用XGB进行回归、特征权重生产

XGB具有很好的处理高维度数据以及支持并行计算的能力,通常被应用在各种类型的分类和回归问题中。下面是使用XGB进行回归和特征权重生成的一些步骤:
1)导入必要的模块和数据,包括训练集、测试集、XGBRegressor等模型。
2)对训练数据进行拆分,并将其转换为XGB可接受的数据格式DMatrix。
3)通过调整超参数进行模型训练。XGBRegressor可以设置很多参数,比如学习率(learning rate)、最大树的深度(maxdepth)、最小子样本权重和(minchild_weight)等。在训练过程中,可以使用交叉验证等手段调优参数,实现更优的模型性能。
4)训练完成后,对测试集进行预测并评估模型性能。可以使用MSE(Mean Squared Error)等指标进行评价。
5)通过XGB模型提供的get_score()方法,可以根据特征在树模型中出现的次数来计算特征的重要程度,并将其可视化。

Boost延展,LGBM,CatBoost的优缺点

除了XGB以外,还有其他几种基于GBDT的提升算法,具体来说它们是Boost延展、LightGBM和CatBoost。
Boost延展(AdaBoost)是GBDT的一种变体,它可以通过不断降低错分类样本的权值,来产生一个性能更强的分类器。但是Boost延展有一些缺点,比如对离群点敏感、易受噪声和异常值的干扰等。
LightGBM是由微软LightGBM团队开发的一个高效,快速,分布式梯度提升框架,具有更快的训练速度和更低的内存使用。它使用了直方图进行处理,可以大大加快特征分裂的速度,具有注重实际效果和时间效率的特点。
CatBoost是由俄罗斯Yandex开发的一种GBDT的扩展版本,它具有更好的鲁棒性、对类别型特征的处理和优化更加合理、对于数据噪声有更好的鲁棒性、支持GPU训练等。不过相对于其他算法,CatBoost的训练速度较慢。

Python、Spark(Scala)版本使用示例

以下是使用Python版本的XGBoost进行分类的简单示例:

import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 导入数据集
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# 将数据转换为DMatrix格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

# 设置参数
params = {
    'booster': 'gbtree',
    'objective': 'multi:softmax',
    'num_class': 3,
    'gamma': 0.1,
    'max_depth': 6,
    'eta': 0.3,
    'subsample': 0.9,
    'colsample_bytree': 0.9
}

# 模型训练
num_round = 50
model = xgb.train(params, dtrain, num_round)

# 模型预测
y_pred = model.predict(dtest)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

以下是使用Spark(Scala)版本的GBTRegressor进行回归问题的简单示例:

import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.evaluation.RegressionEvaluator
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.regression.GBTRegressor
import org.apache.spark.sql.SparkSession

// 构建SparkSession
val spark = SparkSession.builder.appName("GBTRegressorExample").getOrCreate()

// 导入数据
val data = spark.read.format("csv").option("header","true").option("inferSchema","true")
                .load("data/sample_libsvm_data.txt")

// 数据转换
val assembler = new VectorAssembler().setInputCols(data.columns.dropRight(1)).setOutputCol("features")
val dataset = assembler.transform(data).select("features","label")

// 训练集测试集划分
val Array(trainingData, testData) = dataset.randomSplit(Array(0.7, 0.3))

// 建立模型
val gbt = new GBTRegressor().setLabelCol("label").setFeaturesCol("features").setMaxIter(10)

// 建立Pipeline
val pipeline = new Pipeline().setStages(Array(gbt))

// 模型训练
val model = pipeline.fit(trainingData)

// 模型预测
val predictions = model.transform(testData)

// 模型评估
val evaluator = new RegressionEvaluator().setLabelCol("label").setPredictionCol("prediction")
                                     .setMetricName("rmse")
val rmse = evaluator.evaluate(predictions)

println(s"Root Mean Squared Error (RMSE) on test data = $rmse")

// 关闭SparkSession
spark.stop()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

以上是简要介绍和示例,如有需要您可以进一步详细了解和深入学习相关内容。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/525493?site
推荐阅读
相关标签
  

闽ICP备14008679号