Как разбить модель XGBClassifier/XGBRegressor на подмодели?

Этот документ показывает, что обученную модель 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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в подсказке типа, которую вы даете clf_xgb.Booster, которая не соответствует существующему аргументу. Пытаться:

clf_xgb_sliced: xgb.Booster = clf_xgb.get_booster()[3:7]

вместо.

Спасибо. Я думаю, что забыл информацию об «импорте» первого сегмента кода. Я отредактировал свой пост для этой информации. Первый сегмент кода показывает, что он работает для модели XGBoost, обученной с помощью XGBoost API. Второй сегмент кода показывает, что я хочу сделать то же самое с моделью XGBoost, обученной с помощью интерфейса Scikit-Learn Wrapper, но потерпел неудачу.

SC Chen 06.05.2022 13:43

В коде, которым вы делитесь, все, что я вижу, это AttributeError, который я помог вам исправить, можете ли вы поделиться кодом для случая sklearn?

Learning is a mess 06.05.2022 14:16

Спасибо за ваш вопрос. Во втором сегменте кода используется XGBClassifier().fit(..., и это случай sklearn (интерфейс-оболочка). Документ API интерфейса оболочки sklearn XGBoost — здесь для справки. Я чаще использую интерфейс оболочки sklearn для обучения модели XGBoost, но я не могу нарезать такую ​​модель XGBoost, как это было сделано в документ, который я нашел (как в начале моего поста). Я надеюсь, что есть способ сделать это.

SC Chen 06.05.2022 15:21

Хорошо, я наконец понял ваш вопрос (по крайней мере, я так думаю) и соответственно обновил свой ответ, пожалуйста, посмотрите.

Learning is a mess 06.05.2022 15:42

Большое спасибо за эту идею. Это работает следующим образом. Но она становится моделью xgboost.Booster, а не моделью xgboost.XGBClassifier. Если я хочу предсказать, я должен использовать xgboost.Booster.predict, но я привык предсказывать с помощью xgboost.XGBClassifier.predict(). Знаете ли вы, как преобразовать нарезанный xgboost.Booster обратно в xgboost.XGBClassifier?

SC Chen 06.05.2022 16:45

Да, я знаю классификатор booster !=, хотя, если вы заинтересованы только в прогнозировании, оба дадут вам одинаковые прогнозы. Конвертировать некрасиво, но надёжно Сюда

Learning is a mess 06.05.2022 16:48

Благодарю вас! Оно работает! Я пробую 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)

SC Chen 06.05.2022 20:39

Другие вопросы по теме