#python-3.x #scikit-learn #xgboost #xgbclassifier
#python-3.x #scikit-учись #xgboost #xgbклассификатор
Вопрос:
У меня есть две отдельные рабочие модели. Они идентичны, за исключением того, что один использует Случайный лес, а другой использует XGBoost.
Вчера я внес изменения в данные (добавил два столбца) и обучил модель RF. Теперь он набирает примерно на 4% больше, чем до того, как я добавил эти две колонки.
Поэтому сегодня я прокомментировал модель RF и подключил модель XGBoost (из существующей рабочей модели).
Когда я пытаюсь запустить модель XGBoost, я теперь получаю:
ValueError: DataFrame.dtypes for data must be int, float, bool or categorical. When categorical type is supplied, DMatrix parameter `enable_categorical` must be set to `True`.
Я НЕ передаю незашифрованные категориальные данные в XGBoost.
Характеристики данных:
construction_year int32 lt;-- Added yesterday amount_tsh float64 lt;-- Added yesterday basin category region_code category lga category extraction_type category management category payment category quality_group category quantity category source category waterpoint_type category cluster category temp object lt;--- HOLD ON. See below. dtype: object
«temp» существует только для того, чтобы разделить df после кодирования обратно на отдельные наборы поездов и тестов, прежде чем я обучу модель. Он удаляется после того, как я выполняю разделение.
X = dfx[dfx[temp_df.shape[1]-1] == 'train'] X2 = dfx[dfx[temp_df.shape[1]-1] == 'test'] print(X.head()) print(X2.head()) X = X.iloc[:, :-1] X2 = X2.iloc[:, :-1] print(X.head()) print(X2.head())
И доказательство:
0 1 2 3 4 5 6 7 8 9 10 11 ... 224 225 226 227 228 229 230 231 232 233 234 235 0 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 1999 1200.000 train 1 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 2010 0.000 train 2 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2009 25.000 train 3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1986 0.000 train 4 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2006 0.000 train 0 1 2 3 4 5 6 7 8 9 10 11 ... 224 225 226 227 228 229 230 231 232 233 234 235 59400 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2012 0.000 test 59401 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2000 0.000 test 59402 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2010 0.000 test 59403 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 1987 0.000 test 59404 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 2000 500.000 test 0 1 2 3 4 5 6 7 8 9 10 11 ... 223 224 225 226 227 228 229 230 231 232 233 234 0 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 1999 1200.000 1 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 2010 0.000 2 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2009 25.000 3 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1986 0.000 4 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2006 0.000 0 1 2 3 4 5 6 7 8 9 10 11 ... 223 224 225 226 227 228 229 230 231 232 233 234 59400 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2012 0.000 59401 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2000 0.000 59402 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2010 0.000 59403 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 1987 0.000 59404 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 ... 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 2000 500.000
Последняя колонка, содержащая «поезд» и «тест», исчезла.
Я открыл df в PyCharm. НИЧТО не является некодированным, за исключением двух новых числовых столбцов(233 и 234).
Кроме того, форма комбинированного df и формы отдельных поездов и тестовых df также показывают, что последний столбец удален:
(74250, 236) (59400, 235) (14850, 235)
Я не понимаю, почему XGBoost думает, что я передаю ему некодированные категориальные данные. Как я уже говорил, все это работало до тех пор, пока вчера я не добавил два новых числовых столбца. Модель RF работает с двумя новыми столбцами.
Ответ №1:
Хммм…
Должно быть, ошибка в XGBoost.
Я изменил значения столбца «температура» для разделения с «поезд» и «тест» на 0 и 1 соответственно, и это работает.
Таким образом, столбец «temp» инициализируется как «int64».
Я все еще не понимаю, почему это работает с RF, но XGBoost, по-видимому, все еще имеет некоторое представление о том, что столбец «temp» является типом «объект».