微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 LightGBM 中的 R2 分数为零?

如何解决为什么 LightGBM 中的 R2 分数为零?

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 分数给,那么为什么在 LGBMRegressor 中得到零值? 我没有拆分我的数据 train_test 因为我的数据集很小。

解决方法

此示例无法完全重现,因为 "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,)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。