【发布时间】:2021-02-26 05:22:38
【问题描述】:
我收到了错误
[LightGBM] [Fatal] 检查失败:(train_data->num_features()) > (0)
对于形状为 (40,7) 的数据集 X。我正在尝试为自定义损失函数运行梯度提升
将不胜感激任何解决方案或提示。
在线出现错误
gbm.fit(
X_train,
y_train,
eval_set=[(X_valid, y_valid)],
eval_metric=custom_asymmetric_valid,
verbose=False,
)
完整代码如下:
import lightgbm
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
train = pd.read_csv("Data_Train.csv")
X, y = train.iloc[:, 1:-1], train.iloc[:, -1]
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.20, random_state=42)
print(np.shape(X_train),np.shape(X_valid))
test = pd.read_csv("Data_Test.csv")
X_test, y_test = test.iloc[:, 1:-1], test.iloc[:, -1]
# Defining custom loss function
def custom_asymmetric_train(y_true, y_pred):
residual = (y_true - y_pred).astype("float")
grad = np.where(residual<0, -2*10.0*residual, -2*residual)
hess = np.where(residual<0, 2*10.0, 2.0)
return grad, hess
def custom_asymmetric_valid(y_true, y_pred):
residual = (y_true - y_pred).astype("float")
loss = np.where(residual < 0, (residual**2)*10.0, residual**2)
return "custom_asymmetric_eval", np.mean(loss), False
# default lightgbm model with sklearn api
gbm = lightgbm.LGBMRegressor(random_state=33)
# updating objective function to custom
# default is "regression"
# also adding metrics to check different scores
gbm.set_params(**{'objective': custom_asymmetric_train}, metrics = ["mse", 'mae'])
# fitting model
gbm.fit(
X_train,
y_train,
eval_set=[(X_valid, y_valid)],
eval_metric=custom_asymmetric_valid,
verbose=False,
)
y_pred = gbm.predict(X_valid)
# create dataset for lightgbm
lgb_train = lgb.Dataset(X_train, y_train, free_raw_data=False)
lgb_eval = lgb.Dataset(X_valid, y_valid, reference=lgb_train, free_raw_data=False)
params = {
'objective': 'regression',
'verbose': 0
}
gbm = lgb.train(params,
lgb_train,
num_boost_round=10,
init_model=gbm,
fobj=custom_asymmetric_train,
feval=custom_asymmetric_valid,
valid_sets=lgb_eval)
y_pred = gbm.predict(X_valid)
【问题讨论】: