Почему я не могу обернуть ЛГБМ?Python

Программы на Python
Ответить
Anonymous
 Почему я не могу обернуть ЛГБМ?

Сообщение Anonymous »

Я использую LGBM для прогнозирования относительного изменения числовой величины. Я использую функцию потерь MSLE (среднеквадратичная логарифмическая ошибка), чтобы оптимизировать мою модель и получить правильное масштабирование ошибок. Поскольку MSLE не является родным для LGBM, мне придется реализовать его самому. Но, к счастью, математику можно существенно упростить. Это моя реализация;

Код: Выделить всё

class MSLELGBM(LGBMRegressor):
def __init__(self,  **kwargs):
super().__init__(**kwargs)

def predict(self, X):
return np.exp(super().predict(X))

def fit(self, X, y, eval_set=None, callbacks=None):
y_log = np.log(y.copy())
print(super().get_params())  # This doesn't print any kwargs
if eval_set:
eval_set = [(X_eval, np.log(y_eval.copy())) for X_eval, y_eval in eval_set]
super().fit(X, y_log, eval_set=eval_set, callbacks=callbacks)
Как видите, оно очень минимальное. По сути, мне просто нужно применить логарифмическое преобразование к целевой модели и возвести прогнозы в степень, чтобы вернуться в наш собственный нелогарифмический мир.
Однако моя оболочка не работает. Я звоню в класс с помощью;

Код: Выделить всё

model = MSLELGBM(**lgbm_params)
model.fit(data[X_cols_all], data[y_col_train])
И я получаю следующее исключение:

Код: Выделить всё

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[31], line 38
32 callbacks = [
33     lgbm.early_stopping(10, verbose=0),
34     lgbm.log_evaluation(period=0),
35 ]
37 model = MSLELGBM(**lgbm_params)
---> 38 model.fit(data[X_cols_all], data[y_col_train])
40 feature_importances_df = pd.DataFrame([model.booster_.feature_importance(importance_type='gain')], columns=X_cols_all).T.sort_values(by=0, ascending=False)
41 feature_importances_df.iloc[:30]

Cell In[31], line 17
15 if eval_set:
16     eval_set = [(X_eval, np.log(y_eval.copy())) for X_eval, y_eval in eval_set]
---> 17 super().fit(X, y_log, eval_set=eval_set, callbacks=callbacks)

File c:\X\.venv\lib\site-packages\lightgbm\sklearn.py:1189, in LGBMRegressor.fit(self, X, y, sample_weight, init_score, eval_set, eval_names, eval_sample_weight, eval_init_score, eval_metric, feature_name, categorical_feature, callbacks, init_model)
1172 def fit(  # type: ignore[override]
1173     self,
1174     X: _LGBM_ScikitMatrixLike,
(...)
1186     init_model: Optional[Union[str, Path, Booster, LGBMModel]] = None,
1187 ) -> "LGBMRegressor":
1188     """Docstring is inherited from the LGBMModel."""
...
--> 765 if isinstance(params["random_state"], np.random.RandomState):
766     params["random_state"] = params["random_state"].randint(np.iinfo(np.int32).max)
767 elif isinstance(params["random_state"], np.random.Generator):

KeyError: 'random_state'
Я понятия не имею, почему в методе fit отсутствует random_state, поскольку он даже не требуется для этой функции. У меня такое впечатление, что это сложная проблема разработки программного обеспечения, которая выше моего понимания. Кто-нибудь знает, в чем дело?
Если это вам поможет, я попытался проиллюстрировать то, что хочу, используя более простую структуру, отличную от lgbm;
Изображение

Я просто хочу передать любые параметры, которые я предоставляю MSLELGBM, в оригинал ЛГБМ, но при этом у меня возникает масса проблем.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -wrap-lgbm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»