lightgbm - LightGBM 使用 init_score 不会导致提升
问题描述
似乎如果 lightgbm.train 与初始分数(init_score)一起使用,它就无法提高这个分数。
这是一个简单的例子:
params = {"learning_rate": 0.1,"metric": "binary_logloss","objective": "binary",
"boosting_type": "gbdt","num_iterations": 5, "num_leaves": 2 ** 2,
"max_depth": 2, "num_threads": 1, "verbose": 0, "min_data_in_leaf": 1}
x = pd.DataFrame([[1, 0.1, 0.3], [1, 0.1, 0.3], [1, 0.1, 0.3],
[0, 0.9, 0.3], [0, 0.9, 0.3], [0, 0.9, 0.3]], columns=["a", "b", "prob"])
y = pd.Series([0, 1, 0, 0, 1, 0])
d_train = lgb.Dataset(x, label=y)
model = lgb.train(params, d_train)
y_pred_default = model.predict(x, raw_score=False)
在上述情况下,没有使用 init_score。预测是正确的:y_pred_default = [0.33333333, ... ,0.33333333]
d_train = lgb.Dataset(x, label=y, init_score=scipy.special.logit(x["prob"]))
model = lgb.train(params, d_train)
y_pred_raw = model.predict(x, raw_score=True)
在这一部分中,我们假设 x 中的“概率”列是我们的初始猜测(可能是其他模型)。我们应用 logit 并将其用作初始分数。但是,模型无法改进,boosting 将始终返回 0:y_pred_raw = [0, 0, 0, 0, 0, 0]
y_pred_raw_with_init = scipy.special.logit(x["prob"]) + y_pred_raw
y_pred = scipy.special.expit(y_pred_raw_with_init)
上面的这部分显示了我认为将初始分数与提升回概率一起转换的正确方式。由于提升为零,y_pred 产生 [0.3, ..., 0.3],这是我们的初始概率。
解决方案
推荐阅读
- perl - 无法调用第二个子程序“func2”
- python - 无法在 textarea html css 中格式化文本?
- sed - sed,匹配标识符列表中的单词(标识符),除了最后一个
- c# - 在 Umbraco 中创建语言镜像站点
- jmeter - 在 Jmeter 中确定协议
- r - 通过平均将每日数据聚合到每周
- android - 卡在预捕获序列中
- graphql - Apollo GraphQL 查询用其他查询覆盖子元素数组
- android - 将 java 变量从 javacode 传递到 react-native 中的 javascript 代码
- node.js - 发送组件作为对 POST 请求的响应