Ошибка DataFrame.dtypes при обучении модели с использованием xgboost

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

Я получаю ошибку 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 и другие, вероятно, содержат категориальные данные или строки, которые невозможно напрямую использовать в модели.

Решение проблемы

  1. Преобразование категориальных данных:
    Чтобы исправить это, вам нужно закодировать категориальные переменные. Один из способов — использовать метки (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) и другими типами данных.

  2. Обработка отсутствующих значений:
    Прежде чем переводить категориальные данные в числовые, убедитесь, что у вас нет пропусков в стандартных значениях. Можно применить различные методы для обработки отсутствующих данных, такие как заполнение медианным или средним значением, или удаление строк с пустыми значениями.

  3. Проверка массива перед обучением:
    Убедитесь, что ваши данные перед обучением (как 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)

Заключение

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

Если у вас есть дополнительные вопросы или вам нужна помощь в процессе подготовки данных, не стесняйтесь обращаться!

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

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