为什么 LightGBM 中的 R2 分数为零?
Why R2 Score is zero in LightGBM?
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 因为我的数据集很小。
此示例无法完全重现,因为 "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()
这将 return 一个 1 行数据帧,当 LightGBM 不添加任何树时会发生这种情况。
LightGBM有一些参数用来防止过拟合。两个在这里是相关的:
min_data_in_leaf
(默认=20)
min_sum_hessian_in_leaf
(默认=0.001)
您可以通过将这些参数设置为 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)))
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 因为我的数据集很小。
此示例无法完全重现,因为 "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()
这将 return 一个 1 行数据帧,当 LightGBM 不添加任何树时会发生这种情况。
LightGBM有一些参数用来防止过拟合。两个在这里是相关的:
min_data_in_leaf
(默认=20)min_sum_hessian_in_leaf
(默认=0.001)
您可以通过将这些参数设置为 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)))