首页 > 解决方案 > 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],这是我们的初始概率。

标签: lightgbmboosting

解决方案


推荐阅读