问题标签 [xgbclassifier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
40 浏览

python - 预测模型在训练和测试期间表现得非常好,但在预测完全相同的数据时预测为零

我创建了一个二元分类模型,它可以预测一篇文章是属于正类还是负类。我正在使用将 TF-IDF 与另一个功能一起输入 XGBoost 分类器。在训练/测试和交叉验证时,我的 AUC 分数非常接近 1。在测试我的坚持数据时,我得到了 0.5 分。这对我来说似乎很奇怪,所以我将相同的训练数据输入到我的模型中,即使这样也返回了 0.5 AUC 分数。下面的代码接受一个数据框,适合并转换为 tf-idf 向量,并将其全部格式化为 dMatrix。

我交叉验证并找到 0.9979 的 test-auc-mean,所以我保存模型,如下所示。

这是我加载新数据的代码:

下面的代码显示,尽管加载了相同的数据,但我的 AUC 得分为 0.5。我在某处错过了错误吗?

0 投票
0 回答
60 浏览

python - 在管道中的 XGBoostClassifier() 中使用“class_weight”进行多类分类的正确方法

我正在研究用于分类的严重不平衡的多类数据。我想使用class_weight许多scikit-learn模型中给出的。在管道内执行此操作的最佳和正确方法是什么。

正如我在文档中看到的,scale_pos_weight仅用于二进制分类。 这个答案在这里得到了“Firas Omrane”的 15 个赞成票,给出了一些想法,所以我使用了

它可以很好地与fit管道一起使用,但在用作:

它给出的错误如下:

0 投票
1 回答
751 浏览

python - XGBoost 对 SHAP 值的解释

我已经为二进制分类安装了 XGBoost 模型。我试图了解拟合模型并尝试使用SHAP来解释预测。

但是,我对 SHAP 生成的力图感到困惑。我预计输出值应该小于 0,因为预测概率小于 0.5。但是,SHAP 值显示8.12

下面是我生成结果的代码。

SHAP 版本:0.39.0

XGBoost 版本:1.4.1

(7887, 501)

预测概率:0.2292

在此处输入图像描述

但是,如果我使用 XGBoost 库中的 SHAP 值,我会得到另一个图,这看起来与我的预期相似。

在此处输入图像描述

为什么会这样?哪一个应该是正确的 SHAP 值来解释 XGBoost 模型?

谢谢您的帮助。

跟进@sergey-bushmanov的回复

由于我无法共享自己的数据,因此我使用Kaggle的开放数据集重现了这种情况。

下面是模型训练的代码:

这个模型的问题仍然存在。

0 投票
1 回答
39 浏览

python-3.x - XGBoost 无法拟合数据

我有两个独立的工作模型。除了一个使用随机森林和一个使用 XGBoost 之外,它们是相同的。

昨天我对数据进行了更改(我添加了两列)并训练了 RF 模型。现在它的得分比我添加两列之前高出大约 4%。

所以今天我注释掉了 RF 模型,并插入了 XGBoost 模型(来自现有的工作模型)。

当我尝试运行 XGBoost 模型时,我现在得到:

我没有将未编码的分类数据传递给 XGBoost。

数据特点:

'temp' 只是在我训练模型之前将编码后的 df 拆分回单独的训练集和测试集。在我执行拆分后它会被删除。

和证明:

包含“train”和“test”的最后一列消失了。

我在 PyCharm 中打开了 df。除了两个新的数字列(233 和 234)外,没有什么是未编码的。

此外,组合 df 的形状以及分离的 train 和 test df 的形状也显示了删除的最后一列:

我不知道为什么 XGBoost 认为我正在传递未编码的分类数据。正如我所说,这一切都有效,直到我昨天添加了两个新的数字列。RF 模型适用于两个新列。

0 投票
1 回答
15 浏览

python - 估计器的无效参数 XGB

我正在对 XGB 分类器的以下参数执行 GridSearch。这很简单,但是当我运行grid_search.fit(X_train, y_train)它时它会返回ValueError: Invalid parameter xgb for estimator

我完成了一个xgb.get_params()确认使用了正确的参数并且它们都检查了 - 见xgb.get_params()下文。我什至甚至将参数/值复制/粘贴到代码中以查看它们是否可以工作,但我仍然收到相同的错误

代码:

0 投票
1 回答
37 浏览

xgboost - XGBoost:如何计算多类分类中的叶子权重

我很难理解 XGBoost 如何计算多类分类中的叶子权重。

我生成了一个包含两个特性和 3 个类的简单示例。训练数据如下所示:

功能 0 特色一 标签 y
x1 1 1 0
x2 2 3 1
x3 3 1 2

从我目前所读到的内容来看,XGBoost 使用“一对多”的原则。因此,XGBoost 为每个类创建单独的树。XGBoost 设置为 2 轮增强,创建 6 棵树。第一棵树对应第 0 类,第二棵对应第 1 类,第三棵对应第 2 类,第四棵对应第 0 类,依此类推……

我使用以下 python 代码绘制了第一棵树。

结果如下所示:第一个树助推器

问题是如何计算叶子的权重?

到目前为止我的想法:
据我了解,XGBoost 使用对数损失函数进行二进制分类。
L(p,y) = −( ylog(p) + (1−y)log(1−p) )
(其中 p= 1/(1+exp(-x))))
y 是真实标签,p是样本属于第1类的模型的概率预测。
这个损失函数的梯度和hessian为:
梯度:p - y
hessian:p(1-p)

对于如何为固定树结构计算理想权重有一个很好的解释(XGBoost Docs)。因此,理想权重的计算公式为:
w_t = - G_t / (H_t + lambda)
其中 G_t 是属于叶子的所有样本的梯度统计的总和。类似地,H_t 是属于叶子的所有样本的二阶统计量(hessian)之和。

现在我想计算第一棵树的权重。所有实例的初始预测分数关闭为 0.5。由于这棵树对应于 0 类,因此真正的标签关闭为 y1=1、y2=0、y3=0(因为只有样本 1 具有 0 类)。梯度和 hessian 统计为:
g1 = 0.5 - 1 = -0.5
g2 = 0.5 - 0 = 0.5
g3 = 0.5 - 0 = 0.5

h1 = 0.5(1-0.5) = 0.25
h2 = 0.5(1-0.5) = 0.25
h3 = 0.5(1-0.5) = 0.25

第一棵树只有一个分割标准 f0 < 1.5。因此,样本 1 分配给左叶,样本 2 和 3 分配给右叶。

权重通过以下方式计算:
w1 = - g1 / (h1 + lambda) * eta = 0.5 / (0.25 + 1) * 0.3 = 0.12
w2 = - (g2 + g3) / (h2 + h3 + lambda) * eta = -(0.5 +0.5) / (0.25 + 0.25 + 1) * 0.3 = - 0.1998
与 eta 学习率

我的结果与 XGBoost 的结果不匹配,因为 w1 和 w2 应该大约为 0.1384 和 -0.106。

我究竟做错了什么?

我认为我真正的问题是我不了解日志损失以及 sigmoid 函数如何影响结果。

如果有人可以帮助我,我将不胜感激。

0 投票
0 回答
8 浏览

pandas - XGBClassifier 中哪个是正确的树?

我在 Pandas 中训练了以下 XGBClassifier:

生成的树如下所示:

在此处输入图像描述

如您所见,有 4 片叶子:

我的假设是我们在图片中看到的数字是对数赔率。

然后我使用该apply方法检查每个样本的每棵树的预测叶子:

打印输出如下所示:

树的总数是 3(从 0 到 2),因为我设置了n_estimators=3. 我的理解正确吗?

问题:上面这三棵树中哪一棵对应上图中显示的树(地块)?

我已经倾倒了树:

看起来像这样:

在此处输入图像描述

我用橙色突出显示了与上图相对应的叶子和增益。因此,我假设树 0是算法选择的用于分割数据集的树。

现在,当我通过仅选择 tree 将用于训练 XGBClassifier 的数据帧与包含apply结果的数据帧合并时0,我获得了一个数据帧,其中包含我使用该model.predict_proba(X)方法预测的概率和一个名为Leaf包含叶子的列3,4,5,6 符合预期。问题是概率字段只包含两个值:我期待四个值(每个叶子一个)。

在此处输入图像描述

这是为什么?我希望为每个叶子分配一个且唯一的概率。

我怎样才能弄清楚算法选择为每个记录分配叶子的分段是什么?我在哪里可以找到实际的细分?以及如何在包含正确叶子的火车数据框中创建一列?

0 投票
0 回答
11 浏览

python - xgboost 中的`binary:logitraw` 与`binary:logistic` 目标

设置objective='binary:logistic'objective='binary:logitraw'xgboost 分类器之间有哪些区别?

根据文档(https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters),前者对应于logistic regression for binary classification, output probability,而后者是logistic regression for binary classification, output score before logistic transformation.

我不清楚这些在实践中意味着什么。你能解释一下在这两种情况的训练过程中哪些函数被最小化了吗?

此外,设置objective参数似乎根本不会改变模型输出,如下面的代码所示。

模拟数据:

定义两个分类器,所有参数都相同,除了objective

绘制预测(invlogit是 logit 函数的倒数并给出概率)。

在此处输入图像描述

我很困惑,两种情况的结果都是一样的。有什么猜测吗?谢谢!

0 投票
0 回答
5 浏览

python - GradientExplainer 不支持 XGBClassifier

我训练了以下 XGBClassifier:

然后我尝试使用以下代码生成 SHAP 值:

但我得到这个错误:

有人知道为什么吗?是因为不支持 XGBClassifier 吗?我需要使用 GradientExplainer:XGBClassifier 的替代品是什么?

0 投票
0 回答
17 浏览

python - 如何从 xgboost.train 中检索最佳模型

我正在学习如何使用 XGBClassifier 生成预测,我发现 xgboost.train 是 XGBClassifier 在后台调用的。我想第一个问题是:是否有任何理由偏爱一种方式而不是另一种方式,或者它们根本不等同?

我设置了这段代码,在第 12 次迭代中给了我最好的模型:

我还没有调整参数,因为我只是想确保代码运行。然后我设置了下面的代码,希望得到与上面相同的行为:

这也会在第 12 次迭代中返回相同的最佳模型,但预测结果与 XGBClassifier 方法不同,因为 pred2 实际上使用了第 17 次迭代。我翻阅了文档,发现了关于early_stopping_rounds参数的内容:

该方法返回上一次迭代的模型(不是最好的)。如果需要最佳模型,请使用自定义回调或模型切片。

我一直没能找到很多关于这个主题的资源,所以我在这里寻求一些帮助,以便我可以使用具有最高 AUC 值的模型迭代生成预测。欣赏它!