Вопрос или проблема
Вот код для назначения переменных
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 имеют неподходящие типы данных. Рассмотрим проблему более подробно и предложим возможные решения.
Анализ Проблемы
-
Типы Данных: Судя по вашему коду, переменная
X
создается с использованиемnumpy
и содержит несколько столбцов:day
,spend
,platform
,month
иyear
. Вы получаете ошибку, потому что XGBoost ожидает, что все входные данные будут иметь типы данныхint
,float
,bool
илиcategory
. Однако, как видно из сообщения об ошибке, составные кортежи, такие как('day',): object
, указывают на то, что данные представлены в виде объектов, а не непосредственно числовых типов. -
Создание DataFrame: Вы используете конструкцию
np.c_[]
для создания вашего DataFrameX
. Это может привести к тому, что тип данных какого-либо из столбцов будет определён какobject
, если передаваемые данные не являются чистыми массивами чисел. Это, вероятно, и произошло с вашими столбцами. -
Проверка Данных: Вы правильно проверили типы данных с помощью
df.dtypes
, но помните, что после создания DataFrameX
с помощьюnp.c_
, типы данных могли измениться.
Решение
Чтобы исправить ошибку, вы можете предпринять следующие шаги:
- Создание 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.
- Проверка и Конвертация Типов Данных: После создания 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.
- Убедитесь, что Категориальные Переменные Обрабатываются: Если вы работаете с категориальными переменными, убедитесь, что они представлены в виде чисел или используйте
enable_categorical = True
при подготовке ваших данных, однако лучше всего предварительно преобразовать категориальные переменные в числа с помощью подхода one-hot encoding или label encoding.
Заключение
Исправление типа данных при создании DataFrame — ключевой момент, который позволит успешно обучить модель XGBoost без возникновения ошибок связанных с типами данных. Перепробуйте предложенный способ создания DataFrame, и обязательно проверяйте типы данных перед обучением модели, чтобы избежать будущих проблем.