Вопрос или проблема
Я получаю ошибку DataFrame.dtypes
в процессе выполнения последних шагов этого учебника.
Вот мой код:
import xgboost as xgb
regr = xgb.XGBRegressor(colsample_bytree=0.2,
gamma=0.0,
learning_rate=0.05,
max_depth=6,
min_child_weight=1.5,
n_estimators=7200,
reg_alpha=0.9,
reg_lambda=0.6,
subsample=0.2,
seed=42,
silent=1)
regr.fit(train_new, label_df)
А это ошибка, которую я получаю:
ValueErrorTraceback (most recent call last)
<ipython-input-64-010296d611e9> in <module>()
12 silent=1)
13
---> 14 regr.fit(train_new, label_df)
D:\anacodna\lib\site-packages\xgboost\sklearn.pyc in fit(self, X, y, sample_weight, eval_set, eval_metric, early_stopping_rounds, verbose, xgb_model, sample_weight_eval_set, callbacks)
358 missing=self.missing, nthread=self.n_jobs)
359 else:
--> 360 trainDmatrix = DMatrix(X, label=y, missing=self.missing, nthread=self.n_jobs)
361
362 evals_result = {}
D:\anacodna\lib\site-packages\xgboost\core.pyc in __init__(self, data, label, missing, weight, silent, feature_names, feature_types, nthread)
378 data, feature_names, feature_types = _maybe_pandas_data(data,
379 feature_names,
--> 380 feature_types)
381
382 data, feature_names, feature_types = _maybe_dt_data(data,
D:\anacodna\lib\site-packages\xgboost\core.pyc in _maybe_pandas_data(data, feature_names, feature_types)
237 msg = """DataFrame.dtypes for data must be int, float or bool.
238 Did not expect the data types in fields """
--> 239 raise ValueError(msg + ', '.join(bad_fields))
240
241 if feature_names is None:
ValueError: DataFrame.dtypes for data must be int, float or bool.
Did not expect the data types in fields Alley, Condition2, Electrical, GarageType, GarageYrBlt, Heating, LandContour, LandSlope, LotShape, MiscFeature, PavedDrive, RoofMatl, Street, Utilities
Проверьте значения train_new. Вы увидите, что указанные столбцы не имеют ожидаемых типов.
Еще одно предложение: я не уверен, как xgboost обрабатывает значения null. Возможно, это также касается этих столбцов.
Выполните кодирование меток для признаков, таких как Alley, Condition2 и т.д. (упомянутых в вашей ошибке).
Например:
train_new['Electrical'] = le.fit_transform(train_new['Electrical'].astype(str))
Выше приведен пример для вашего сведения. Не применяйте .astype(str)
только для Condition2. Исключая это, вам нужно применить строку, которую я вам дал, ко всем атрибутам (упомянутым в ошибке). Надеюсь, это решит вашу ошибку.
Преобразуйте типы данных в массив numpy. Это сработало для меня.
X_train = np.array(X_train)
X_test = np.array(X_test)
Ответ или решение
При обучении моделей машинного обучения важно правильно подготовить данные, особенно когда речь идет о библиотеке XGBoost. Ошибка, с которой вы столкнулись, связана с типами данных в вашем DataFrame. Давайте подробнее разберем вашу ситуацию и предложим пути ее решения.
Проблема с типами данных DataFrame
Ваша ошибка:
ValueError: DataFrame.dtypes for data must be int, float or bool.
Did not expect the data types in fields Alley, Condition2, Electrical, GarageType, GarageYrBlt, Heating, LandContour, LandSlope, LotShape, MiscFeature, PavedDrive, RoofMatl, Street, Utilities
свидетельствует о том, что в указанных полях содержатся данные, которые XGBoost не может обработать. Ожидается, что все столбцы в вашем DataFrame имеют типы данных: int
, float
или bool
. Однако поля, такие как Alley
, Condition2
и другие, вероятно, содержат категориальные данные или строки, которые невозможно напрямую использовать в модели.
Решение проблемы
-
Преобразование категориальных данных:
Чтобы исправить это, вам нужно закодировать категориальные переменные. Один из способов — использовать метки (Label Encoding). Для этого вы можете использовать классLabelEncoder
из библиотекиsklearn
. Пример кода для преобразования может выглядеть так:from sklearn.preprocessing import LabelEncoder le = LabelEncoder() categorical_columns = ['Alley', 'Condition2', 'Electrical', 'GarageType', 'Heating', 'LandContour', 'LandSlope', 'LotShape', 'MiscFeature', 'PavedDrive', 'RoofMatl', 'Street', 'Utilities'] for column in categorical_columns: train_new[column] = le.fit_transform(train_new[column].astype(str))
Убедитесь, что применяете
astype(str)
для всех категориальных столбцов, чтобы избежать проблем с отсутствующими значениями (NaN) и другими типами данных. -
Обработка отсутствующих значений:
Прежде чем переводить категориальные данные в числовые, убедитесь, что у вас нет пропусков в стандартных значениях. Можно применить различные методы для обработки отсутствующих данных, такие как заполнение медианным или средним значением, или удаление строк с пустыми значениями. -
Проверка массива перед обучением:
Убедитесь, что ваши данные перед обучением (какtrain_new
, так и целевая переменнаяlabel_df
) имеют правильные типы и формы. Вы можете конвертировать ваши данные в массивы NumPy перед передачей в методfit
.import numpy as np X_train = np.array(train_new) y_train = np.array(label_df) regr.fit(X_train, y_train)
Заключение
Проблема, с которой вы столкнулись, часто возникает при работе с библиотеками машинного обучения из-за недостаточной предобработки данных. Правильное кодирование категориальных переменных и корректная обработка отсутствующих значений могут значительно упростить обучение вашей модели и улучшить ее работу.
Если у вас есть дополнительные вопросы или вам нужна помощь в процессе подготовки данных, не стесняйтесь обращаться!