Этот документ показывает, что обученную модель XGBoost API можно разбить на слайсы с помощью следующего кода:
from sklearn.datasets import make_classification
import xgboost as xgb
booster = xgb.train({
'num_parallel_tree': 4, 'subsample': 0.5, 'num_class': 3},
num_boost_round=num_boost_round, dtrain=dtrain)
sliced: xgb.Booster = booster[3:7]
Я попробовал, и это сработало.
Поскольку XGBoost предоставляет интерфейс Scikit-Learn Wrapper, я попробовал что-то вроде этого:
from xgboost import XGBClassifier
clf_xgb = XGBClassifier().fit(X_train, y_train)
clf_xgb_sliced: clf_xgb.Booster = booster[3:7]
Но получил следующую ошибку:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-18-84155815d877> in <module>
----> 1 clf_xgb_sliced: clf_xgb.Booster = booster[3:7]
AttributeError: 'XGBClassifier' object has no attribute 'Booster'
Поскольку у XGBClassifier нет атрибута «Booster», есть ли способ нарезать модель XGBClassifier (/XGBRegressor), обученную интерфейсом Scikit-Learn Wrapper?
Проблема в подсказке типа, которую вы даете clf_xgb.Booster
, которая не соответствует существующему аргументу. Пытаться:
clf_xgb_sliced: xgb.Booster = clf_xgb.get_booster()[3:7]
вместо.
В коде, которым вы делитесь, все, что я вижу, это AttributeError, который я помог вам исправить, можете ли вы поделиться кодом для случая sklearn?
Спасибо за ваш вопрос. Во втором сегменте кода используется XGBClassifier().fit(...
, и это случай sklearn (интерфейс-оболочка). Документ API интерфейса оболочки sklearn XGBoost — здесь для справки. Я чаще использую интерфейс оболочки sklearn для обучения модели XGBoost, но я не могу нарезать такую модель XGBoost, как это было сделано в документ, который я нашел (как в начале моего поста). Я надеюсь, что есть способ сделать это.
Хорошо, я наконец понял ваш вопрос (по крайней мере, я так думаю) и соответственно обновил свой ответ, пожалуйста, посмотрите.
Большое спасибо за эту идею. Это работает следующим образом. Но она становится моделью xgboost.Booster, а не моделью xgboost.XGBClassifier. Если я хочу предсказать, я должен использовать xgboost.Booster.predict, но я привык предсказывать с помощью xgboost.XGBClassifier.predict(). Знаете ли вы, как преобразовать нарезанный xgboost.Booster обратно в xgboost.XGBClassifier?
Да, я знаю классификатор booster !=, хотя, если вы заинтересованы только в прогнозировании, оба дадут вам одинаковые прогнозы. Конвертировать некрасиво, но надёжно Сюда
Благодарю вас! Оно работает! Я пробую new_clf_xgb_replace_booster = XGBClassifier() --> new_clf_xgb_replace_booster._Booster = clf_xgb_sliced
по вашей ссылке и могу преобразовать clf_xgb_sliced
(модель xgboost.Booster
) обратно в new_clf_xgb_replace_booster
(модель xgboost.XGBClassifier
). Есть интересная вещь, что clf_xgb_sliced.predict() выводит результаты вида array([[0.26339364, 0.21337277, 0.5232336 ], [0.16507962, 0.5867635 , 0.24815688], ..., [0.20555478, 0.2272.9847] type , 6d3, 0.22729845, 4at3 в то время как new_clf_xgb_replace_booster.prodict() выводит массив ([2, 1, ..., 2], dtype = int64)
Спасибо. Я думаю, что забыл информацию об «импорте» первого сегмента кода. Я отредактировал свой пост для этой информации. Первый сегмент кода показывает, что он работает для модели XGBoost, обученной с помощью XGBoost API. Второй сегмент кода показывает, что я хочу сделать то же самое с моделью XGBoost, обученной с помощью интерфейса Scikit-Learn Wrapper, но потерпел неудачу.