- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 xgboost
制作花花呢模型,但收到一条晦涩的错误消息。
这是一个可重现的示例:
准备数据:
library(xgboost)
library(dplyr)
set.seed(123)
xx <- rpois(5000, 0.02)
xx[xx>0] <- rgamma(sum(xx>0), 50)
yy <- matrix(rnorm(15000), 5000,3, dimnames = list(1:5000, c("a", "b", "c")))
train_test <- sample(c(0,1), 5000, replace = T)
准备 xgboost,这里重要的是:objective = 'reg:tweedie'
、eval_metric = "tweedie-nloglik"
和 tweedie_variance_power = 1.2
:
dtrain <- xgb.DMatrix(
data = yy %>% subset(train_test == 0),
label = xx %>% subset(train_test == 0)
)
dtest <- xgb.DMatrix(
data = yy %>% subset(train_test == 1),
label = xx %>% subset(train_test == 1)
)
watchlist <- list(eval = dtest, train = dtrain)
param <- list(max.depth = 2,
eta = 0.3,
nthread = 1,
silent = 1,
objective = 'reg:tweedie',
eval_metric = "tweedie-nloglik",
tweedie_variance_power = 1.2)
最后调用 xgboost:
resBoost <- xgb.train(params = param, data=dtrain, nrounds = 20, watchlist=watchlist)
给出了这个晦涩的错误消息:
Error in xgb.iter.update(bst$handle, dtrain, iteration - 1, obj) :
[17:59:18] amalgamation/../src/metric/elementwise_metric.cc:168: Check failed: param != nullptr tweedie-nloglik must be in formattweedie-nloglik@rho
Stack trace returned 10 entries:
[bt] (0) /usr/local/lib/R/site-library/xgboost/libs/xgboost.so(dmlc::StackTrace[abi:cxx11]()+0x1bc) [0x7f1f0ce742ac]
[bt] (1) /usr/local/lib/R/site-library/xgboost/libs/xgboost.so(dmlc::LogMessageFatal::~LogMessageFatal()+0x28) [0x7f1f0ce74e88]
[bt] (2) /usr/local/lib/R/site-library/xgboost/libs/xgboost.so(xgboost::metric::EvalTweedieNLogLik::EvalTweedieNLogLik(char const*)+0x1eb) [0x7f1f0cea00db]
[bt] (3) /usr/local/lib/R/site-library/xgboost/libs/xgboost.so(+0x68ef1) [0x7f1f0ce78ef1]
[bt] (4) /usr/local/lib/R/site-library/xgboost/libs/xgboost.so(xgboost::Metric::Create(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+0x263) [0x7f1f0ce7ede3]
[bt] (5) /usr/local/lib/R/site-library/xgboost/libs/xgboost.so(xgboost::LearnerImpl::Configure(std::vector<std::pair
问题似乎与参数eval_metric = "tweedie-nloglik"
有关,因为如果我将eval_metric
更改为logloss
,它就会通过:
param$eval_metric <- "logloss"
resBoost <- xgb.train(params = param, data=dtrain, nrounds = 20, watchlist=watchlist)
[1] eval-logloss:0.634391 train-logloss:0.849734
[2] eval-logloss:0.634391 train-logloss:0.849734
...
知道如何使用 eval_metric = "tweedie-nloglik"
参数吗,因为它似乎最适合我的上下文?谢谢
最佳答案
TL;DR:感谢 Frans Rodenburg 评论:use eval_metric="tweedie-nloglik@1.2
我正在研究 tweedie eval 的实现(我什至不知道 tweedie 是什么)和 following link 中的 logloss eval
花花公子:
struct EvalTweedieNLogLik: public EvalEWiseBase<EvalTweedieNLogLik> {
explicit EvalTweedieNLogLik(const char* param) {
CHECK(param != nullptr)
<< "tweedie-nloglik must be in format tweedie-nloglik@rho";
rho_ = atof(param);
CHECK(rho_ < 2 && rho_ >= 1)
<< "tweedie variance power must be in interval [1, 2)";
std::ostringstream os;
os << "tweedie-nloglik@" << rho_;
name_ = os.str();
}
const char *Name() const override {
return name_.c_str();
}
inline bst_float EvalRow(bst_float y, bst_float p) const {
bst_float a = y * std::exp((1 - rho_) * std::log(p)) / (1 - rho_);
bst_float b = std::exp((2 - rho_) * std::log(p)) / (2 - rho_);
return -a + b;
}
protected:
std::string name_;
bst_float rho_;
};
对数损失:
struct EvalLogLoss : public EvalEWiseBase<EvalLogLoss> {
const char *Name() const override {
return "logloss";
}
inline bst_float EvalRow(bst_float y, bst_float py) const {
const bst_float eps = 1e-16f;
const bst_float pneg = 1.0f - py;
if (py < eps) {
return -y * std::log(eps) - (1.0f - y) * std::log(1.0f - eps);
} else if (pneg < eps) {
return -y * std::log(1.0f - eps) - (1.0f - y) * std::log(eps);
} else {
return -y * std::log(py) - (1.0f - y) * std::log(pneg);
}
}
};
看起来EvalTweedieNLogLik
应该获得一个名为param
的参数。看起来就像你得到了那些确切的行:
CHECK(param != nullptr)
<< "tweedie-nloglik must be in format tweedie-nloglik@rho";
当我将它与 EvalLogLoss 进行比较时,相关性差异在于它不需要变量,这就是它工作的原因。
感谢@Frans Rodenburg 评论,我一直在搜索并阅读如何使用它的示例 here .
使用eval_metric="tweedie-nloglik@1.2
当我第一次从 xgboost 文档中阅读这些行时,我也犯了错误:
tweedie-nloglik: negative log-likelihood for Tweedie regression (at a specified value of the tweedie_variance_power parameter)
它可能只与 python 相关。
关于r - 使用 xgboost 对 Tweedie 回归建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51525175/
有谁知道如何在 R 中使用 Tweedie 进行逐步回归? 我找到了 mgcv 包,它显然将 Tweedie 的功率参数视为另一个要估计的参数。这似乎改进了必须使用 tweedie.profile 来
我正在尝试使用 Tweedie 发行版运行 lightgbm。我相信这段代码应该足以看出问题所在: lgb_train=lgb.Dataset(X_train,y_train,weight=W_tra
我发现以下 R 代码适合 Tweedie Compound Poisson Gamma 分布。我必须使它适合我的 399 claim 金额。我看过以下 R 代码 ptweedie.series(q,
我正在尝试使用 xgboost 制作花花呢模型,但收到一条晦涩的错误消息。 这是一个可重现的示例: 准备数据: library(xgboost) library(dplyr) set.seed(123
我正在尝试绘制随机样本的 CDF,以与遵循 tweedie 分布的数据集中的目标进行比较。我知道以下代码将沿泊松分布抽取随机样本: import numpy as np import matplotl
我正在使用带有 python 的 spark 2.2.0。我试图弄清楚在 Tweedie 系列的情况下,Spark 在 GeneralizedLineraModel 中接受的 Link 函数的默认参数
我是一名优秀的程序员,十分优秀!