Ошибка XGB DataFrame.dtypes

Вопрос или проблема

Вот код для назначения переменных

X = pd.DataFrame(np.c_[df['day'], df['spend'], df['platform'],df['month'],df['year']], columns=[['day', 'spend','platform','month','year']])
y = pd.DataFrame(np.c_[df['revenue']], columns=['revenue'])
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.1, random_state = 123)

и следующие строки для подгонки модели

xgb_r = xg.XGBRegressor(objective="reg:squarederror", booster="gbtree", n_estimators=350, max_depth=10, learning_rate=0.1)
xgb_r.fit(train_X, train_y)

Я получаю следующую ошибку

DataFrame.dtypes for data must be int, float, bool or category. When categorical type is supplied, The experimental DMatrix parameter`enable_categorical` must be set to `True`.  Invalid columns:('day',): object, ('spend',): object, ('platform',): object, ('month',): object, ('year',): object

тем не менее, когда я проверяю тип данных с помощью

df.dtypes

я получаю следующее

platform          int64
day               Int64
spend           float64
revenue        float64
year            int64
month           int64

Может кто-нибудь подсказать, в чем проблема?

Столбцы состоят из объектов numpy, которые сами по себе состоят из int или float. Попробуйте переключиться с объектов numpy на списки, а затем создайте датафрейм из списков.

Ответ или решение

Ошибка DataFrame.dtypes for data must be int, float, bool or category возникает при попытке передать данные в модель XGBoost и связана с тем, что некоторые столбцы вашего DataFrame имеют неподходящие типы данных. Рассмотрим проблему более подробно и предложим возможные решения.

Анализ Проблемы

  1. Типы Данных: Судя по вашему коду, переменная X создается с использованием numpy и содержит несколько столбцов: day, spend, platform, month и year. Вы получаете ошибку, потому что XGBoost ожидает, что все входные данные будут иметь типы данных int, float, bool или category. Однако, как видно из сообщения об ошибке, составные кортежи, такие как ('day',): object, указывают на то, что данные представлены в виде объектов, а не непосредственно числовых типов.

  2. Создание DataFrame: Вы используете конструкцию np.c_[] для создания вашего DataFrame X. Это может привести к тому, что тип данных какого-либо из столбцов будет определён как object, если передаваемые данные не являются чистыми массивами чисел. Это, вероятно, и произошло с вашими столбцами.

  3. Проверка Данных: Вы правильно проверили типы данных с помощью df.dtypes, но помните, что после создания DataFrame X с помощью np.c_, типы данных могли измениться.

Решение

Чтобы исправить ошибку, вы можете предпринять следующие шаги:

  1. Создание DataFrame Без Использования NumPy: Вместо использования np.c_, рекомендуется использовать конструктор DataFrame непосредственно на основе данных Pandas:
X = pd.DataFrame({
    'day': df['day'],
    'spend': df['spend'],
    'platform': df['platform'],
    'month': df['month'],
    'year': df['year']
})

Этот подход гарантирует, что типы данных сохранятся правильно, и X будет иметь согласованные типы, которые ожидает XGBoost.

  1. Проверка и Конвертация Типов Данных: После создания DataFrame, вы можете проверить типы данных и при необходимости конвертировать их:
X['day'] = X['day'].astype(int)
X['platform'] = X['platform'].astype(int)
X['month'] = X['month'].astype(int)
X['year'] = X['year'].astype(int)

Возможно, потребуется привести данные к обычному типу int из Int64, если вы хотите избежать проблем с dtype в XGBoost.

  1. Убедитесь, что Категориальные Переменные Обрабатываются: Если вы работаете с категориальными переменными, убедитесь, что они представлены в виде чисел или используйте enable_categorical = True при подготовке ваших данных, однако лучше всего предварительно преобразовать категориальные переменные в числа с помощью подхода one-hot encoding или label encoding.

Заключение

Исправление типа данных при создании DataFrame — ключевой момент, который позволит успешно обучить модель XGBoost без возникновения ошибок связанных с типами данных. Перепробуйте предложенный способ создания DataFrame, и обязательно проверяйте типы данных перед обучением модели, чтобы избежать будущих проблем.

Оцените материал
Добавить комментарий

Капча загружается...