我正在使用xgboost进行排名
param = {'objective':'rank:pairwise', 'booster':'gbtree'}
Run Code Online (Sandbox Code Playgroud)
据我所知,通过计算学习决策树的加权和来实现梯度增强.如何访问分配给每个学习助推器的权重?我想在训练后尝试对加权进行后处理,以加快预测步骤,但我不知道如何获得单独的权重.使用时dump_model(),可以在创建的文件中看到不同的决策树,但不存储加权.在API中我没有找到合适的功能.或者我可以用收缩参数手动计算重量eta吗?
我正在尝试使用XGBoost技术进行预测.由于我的因变量是连续的,我使用XGBoost进行回归,但是各种门户中可用的大多数参考都是用于分类.虽然我知道通过使用
objective = "reg:linear"
Run Code Online (Sandbox Code Playgroud)
我们可以进行回归,但我仍然需要对其他参数进行一些清晰度.如果有人可以提供R片段,这将是一个很大的帮助.
我知道,弹性搜索在计算查询检索到的文档的分数时会考虑字段的长度.场越短,重量越大(参见场长标准).
我喜欢这样的行为:当我搜索iphone我更感兴趣的是iphone 6比Crappy accessories for: iphone 5 iphone 5s iphone 6.
现在,我想尝试提升这些东西,让我们说我想要加倍它的重要性.
我知道可以使用功能分数修改分数,我想我可以通过脚本分数达到我想要的效果.
我试图在这个分数中添加另一个字段长度范数:
{
"query": {
"function_score": {
"boost_mode": "replace",
"query": {...},
"script_score": {
"script": "_score + norm(doc)"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是我失败了,得到了这个错误: [No parser for element [function_score]]
编辑:
我的第一个错误是我没有将功能分数包装在"查询"中.现在我编辑了上面的代码.我的新错误说
GroovyScriptExecutionException[MissingMethodException
[No signature of method: Script5.norm() is applicable for argument types:
(org.elasticsearch.search.lookup.DocLookup) values:
[<org.elasticsearch.search.lookup.DocLookup@2c935f6f>]
Possible solutions: notify(), wait(), run(), run(), dump(), any()]]
Run Code Online (Sandbox Code Playgroud)
编辑:我提供了第一个答案,但我希望有一个更好的答案
我使用XGBBoost训练多标签分类模型,并希望在另一个系统中编写此模型.
是否可以在XGB Booster中将我的XGBClassifier模型的文本输出视为dump_model.
编辑:我发现model._Booster.dump_model(outputfile)返回一个转储文件,如下所示.但是,没有任何内容可以指定类.在我的模型中,有10个类,但是在dumpfile中只有一个助推器.所以,我不确定它是所有类的模型还是只是其中之一.
booster[0]:
0:[101<0.142245024] yes=1,no=2,missing=1
1:[107<0.102833837] yes=3,no=4,missing=3
3:[101<0.039123565] yes=7,no=8,missing=7
7:leaf=-0.0142603116
8:leaf=0.023763923
4:[101<0.0646461397] yes=9,no=10,missing=9
9:leaf=-0.0345750563
10:leaf=-0.0135767004
2:[107<0.238691002] yes=5,no=6,missing=5
5:[103<0.0775454491] yes=11,no=12,missing=11
11:leaf=0.188941464
12:leaf=0.0651629418
6:[101<0.999929309] yes=13,no=14,missing=13
13:leaf=0.00403384864
14:leaf=0.236842111
booster[1]:
0:[102<0.014829753] yes=1,no=2,missing=1
1:[102<0.00999682024] yes=3,no=4,missing=3
3:[107<0.0966737345] yes=7,no=8,missing=7
7:leaf=-0.0387153365
8:leaf=-0.0486520194
4:[107<0.0922582299] yes=9,no=10,missing=9
9:leaf=0.0301927216
10:leaf=-0.0284226239
2:[102<0.199759275] yes=5,no=6,missing=5
5:[107<0.12201979] yes=11,no=12,missing=11
11:leaf=0.093562685
12:leaf=0.0127987256
6:[107<0.298737913] yes=13,no=14,missing=13
13:leaf=0.227570012
14:leaf=0.113037519
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写自己的梯度提升算法。我知道有像这样的现有包gbm,xgboost,但我想通过编写自己的包来了解算法的工作原理。
我正在使用iris数据集,我的结果是Sepal.Length(连续)。我的损失函数是mean(1/2*(y-yhat)^2)(基本上是前面有 1/2 的均方误差),所以我对应的梯度就是残差y - yhat。我将预测初始化为 0。
library(rpart)
data(iris)
#Define gradient
grad.fun <- function(y, yhat) {return(y - yhat)}
mod <- list()
grad_boost <- function(data, learning.rate, M, grad.fun) {
# Initialize fit to be 0
fit <- rep(0, nrow(data))
grad <- grad.fun(y = data$Sepal.Length, yhat = fit)
# Initialize model
mod[[1]] <- fit
# Loop over a total of M iterations
for(i in 1:M){
# Fit base learner (tree) …Run Code Online (Sandbox Code Playgroud) 假设我符合以下神经网络的二进制分类问题:
model = Sequential()
model.add(Dense(21, input_dim=19, init='uniform', activation='relu'))
model.add(Dense(80, init='uniform', activation='relu'))
model.add(Dense(80, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(x2, training_target, nb_epoch=10, batch_size=32, verbose=0,validation_split=0.1, shuffle=True,callbacks=[hist])
Run Code Online (Sandbox Code Playgroud)
如何使用AdaBoost增强神经网络?keras有没有这方面的命令?
我试图基于 lightGBM 中的这篇论文来实现这个零膨胀对数正态损失函数(https://arxiv.org/pdf/1912.07753.pdf)(第 5 页)。但是,不可否认,我只是不知道怎么做。我不明白如何获取这个函数的梯度和粗麻布,以便在 LGBM 中实现它,而且我过去从来不需要实现自定义损失函数。
\n本文作者开源了他们的代码,该函数在tensorflow中可用(https://github.com/google/lifetime_value/blob/master/lifetime_value/zero_inflated_lognormal.py),但是我\xe2\x80\x99m无法将其转换为适合 LightGBM 中自定义损失函数所需的参数。LGBM 如何接受自定义损失函数\xe2\x80\x94 对数似然损失的示例将写为:
\ndef loglikelihood(preds, train_data):\n labels = train_data.get_label()\n preds = 1. / (1. + np.exp(-preds))\n grad = preds - labels\n hess = preds * (1. - preds)\n return grad, hess\nRun Code Online (Sandbox Code Playgroud)\n同样,我需要定义一个自定义评估指标来配合它,例如:
\ndef binary_error(preds, train_data):\n labels = train_data.get_label()\n preds = 1. / (1. + np.exp(-preds))\n return \'error\', np.mean(labels != (preds > 0.5)), False\nRun Code Online (Sandbox Code Playgroud)\n上面两个例子都取自以下存储库:
\n\n我将不胜感激对此的任何帮助,特别是详细的指导,以帮助我学习如何自己做到这一点。
\n根据自定义损失函数的 LGBM 文档: …
我正在使用渐变增强进行分类.虽然结果有所改善,但我在有效率方面获得了NaN.
Model = gbm.fit(
x= x_Train ,
y = y_Train ,
distribution = "bernoulli",
n.trees = GBM_NTREES ,
shrinkage = GBM_SHRINKAGE ,
interaction.depth = GBM_DEPTH ,
n.minobsinnode = GBM_MINOBS ,
verbose = TRUE
)
Run Code Online (Sandbox Code Playgroud)
结果
如何调整参数以获得有效的参数.
我使用 LightGBM 模型(版本 2.2.1)。它在火车上显示下一个警告:
[LightGBM] [警告] 从 2.1.2 版本开始,“binary”目标中“boost_from_average”参数的默认值为true。与以前版本的 LightGBM 相比,这可能会导致明显不同的结果。如果您的旧模型产生不好的结果,请尝试设置 boost_from_average=false
我找到了它的内容:github link。
但是我不使用任何旧模型或遗留代码(它是在 LightGBM 2.2.1 版本上创建的新项目),所以我不需要每次都看到这个警告。
我也知道我可以更改verbose和关闭所有警告。但这并不是很好 - 另一个可能有用!
所以我的问题是:是否可以仅关闭(隐藏)此警告?
我正在使用 Solr 6.5.1
LatLonType 现在已弃用 ( https://lucene.apache.org/solr/guide/6_6/spatial-search.html ),我正在尝试使用 LatLonPointSpatialField。我还需要它具有多重价值。
我的字段定义如下:
<fieldType name="location" class="solr.LatLonPointSpatialField" docValues="true"/>
之前我曾经在我的 LatLonType 字段上提升:
boost=recip(geodist(sfield,45.15,-93.12),3 ,10000,3000) (我正在使用 eDisMax)。
更改空间数据类型后,出现此错误:
A ValueSource isn't directly available from this field. Instead try a query using the distance as the score. 我不明白。
该文档没有说明将geodist函数与 edismax 一起使用以在boost=参数中使用它。相反,它只是建议使用函数值进行排序:https :
//lucene.apache.org/solr/guide/6_6/spatial-search.html#SpatialSearch-geodist
但是这对我不起作用,我不需要按距离排序,我希望geodist()函数与分数相乘以改变结果分数。