为什么 LightGBM 中 R2 分数为零?

问题描述 投票:0回答:1
import numpy as np
import pandas as pd
import lightgbm
from sklearn.metrics import r2_score,mean_squared_error as MSE
dataset = pd.read_excel("Prali Marble.xlsx")
X = dataset.iloc[:,2].values.reshape((-1, 1))
Y = dataset.iloc[:,3].values

from lightgbm import LGBMRegressor
lgb_r = LGBMRegressor()
lgb_r.fit(X,Y)
y_pred = lgb_r.predict(X)
print("LGBM R2_SCORE:", r2_score(Y, lgb_r.predict(X)))

R2 得分为 ZERO,那么为什么在 LGBMRegressor 中获得零值呢? 我没有分割我的数据 train_test 因为我的数据集很小。

python lightgbm
1个回答
3
投票

此示例无法完全重现,因为不包含

"Prali Marble.xlsx"
的内容。

但是,我可以使用以下代码重现 0.0 R2,我认为该代码与您的示例非常匹配。与您的代码类似,这会在具有单个特征的数据集上训练 LightGBM 回归模型。

此代码在 Python 3.8 上使用

lightgbm
3.1.1。

import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import r2_score,mean_squared_error as MSE

X = pd.DataFrame({
    "feat1": np.append(np.repeat(0.5, 99), np.ones(1))
})
Y = np.random.random(100, )

lgb_r = lgb.LGBMRegressor()
lgb_r.fit(X,Y)

y_pred = lgb_r.predict(X)
print("LGBM R2_SCORE:", r2_score(Y, lgb_r.predict(X)))

LGBM R2_SCORE:0.0

在这种情况下,R2 为 0,因为模型只是预测

Y
的平均值。您可以通过检查模型的结构来看到这一点。

lgb_r.booster_.trees_to_dataframe()

这将返回 1 行数据帧,当 LightGBM 不添加任何树时会发生这种情况。

LightGBM 有一些参数用于防止过度拟合。这里有两个相关:

您可以通过将这些参数设置为 0 来告诉 LightGBM 忽略这些过拟合保护。

import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import r2_score

X = pd.DataFrame({
    "feat1": np.append(np.repeat(0.5, 99), np.ones(1))
})
Y = np.random.random(100, )

lgb_r = lgb.LGBMRegressor(
    min_data_in_leaf=0,
    min_sum_hessian_in_leaf=0.0
)
lgb_r.fit(X,Y)

y_pred = lgb_r.predict(X)
print("LGBM R2_SCORE:", r2_score(Y, lgb_r.predict(X)))
© www.soinside.com 2019 - 2024. All rights reserved.