问题标签 [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.
python - 预测模型在训练和测试期间表现得非常好,但在预测完全相同的数据时预测为零
我创建了一个二元分类模型,它可以预测一篇文章是属于正类还是负类。我正在使用将 TF-IDF 与另一个功能一起输入 XGBoost 分类器。在训练/测试和交叉验证时,我的 AUC 分数非常接近 1。在测试我的坚持数据时,我得到了 0.5 分。这对我来说似乎很奇怪,所以我将相同的训练数据输入到我的模型中,即使这样也返回了 0.5 AUC 分数。下面的代码接受一个数据框,适合并转换为 tf-idf 向量,并将其全部格式化为 dMatrix。
我交叉验证并找到 0.9979 的 test-auc-mean,所以我保存模型,如下所示。
这是我加载新数据的代码:
下面的代码显示,尽管加载了相同的数据,但我的 AUC 得分为 0.5。我在某处错过了错误吗?
python - 在管道中的 XGBoostClassifier() 中使用“class_weight”进行多类分类的正确方法
我正在研究用于分类的严重不平衡的多类数据。我想使用class_weight
许多scikit-learn
模型中给出的。在管道内执行此操作的最佳和正确方法是什么。
正如我在文档中看到的,scale_pos_weight
仅用于二进制分类。
这个答案在这里得到了“Firas Omrane”的 15 个赞成票,给出了一些想法,所以我使用了
它可以很好地与fit
管道一起使用,但在用作:
它给出的错误如下:
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的开放数据集重现了这种情况。
下面是模型训练的代码:
这个模型的问题仍然存在。
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 模型适用于两个新列。
python - 估计器的无效参数 XGB
我正在对 XGB 分类器的以下参数执行 GridSearch。这很简单,但是当我运行grid_search.fit(X_train, y_train)
它时它会返回ValueError: Invalid parameter xgb for estimator
我完成了一个xgb.get_params()
确认使用了正确的参数并且它们都检查了 - 见xgb.get_params()
下文。我什至甚至将参数/值复制/粘贴到代码中以查看它们是否可以工作,但我仍然收到相同的错误
代码:
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 函数如何影响结果。
如果有人可以帮助我,我将不胜感激。
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 符合预期。问题是概率字段只包含两个值:我期待四个值(每个叶子一个)。
这是为什么?我希望为每个叶子分配一个且唯一的概率。
我怎样才能弄清楚算法选择为每个记录分配叶子的分段是什么?我在哪里可以找到实际的细分?以及如何在包含正确叶子的火车数据框中创建一列?
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 函数的倒数并给出概率)。
我很困惑,两种情况的结果都是一样的。有什么猜测吗?谢谢!
python - GradientExplainer 不支持 XGBClassifier
我训练了以下 XGBClassifier:
然后我尝试使用以下代码生成 SHAP 值:
但我得到这个错误:
有人知道为什么吗?是因为不支持 XGBClassifier 吗?我需要使用 GradientExplainer:XGBClassifier 的替代品是什么?
python - 如何从 xgboost.train 中检索最佳模型
我正在学习如何使用 XGBClassifier 生成预测,我发现 xgboost.train 是 XGBClassifier 在后台调用的。我想第一个问题是:是否有任何理由偏爱一种方式而不是另一种方式,或者它们根本不等同?
我设置了这段代码,在第 12 次迭代中给了我最好的模型:
我还没有调整参数,因为我只是想确保代码运行。然后我设置了下面的代码,希望得到与上面相同的行为:
这也会在第 12 次迭代中返回相同的最佳模型,但预测结果与 XGBClassifier 方法不同,因为 pred2 实际上使用了第 17 次迭代。我翻阅了文档,发现了关于early_stopping_rounds参数的内容:
该方法返回上一次迭代的模型(不是最好的)。如果需要最佳模型,请使用自定义回调或模型切片。
我一直没能找到很多关于这个主题的资源,所以我在这里寻求一些帮助,以便我可以使用具有最高 AUC 值的模型迭代生成预测。欣赏它!