【问题标题】:XGBoost fails to fit dataXGBoost 无法拟合数据
【发布时间】:2022-01-05 04:00:44
【问题描述】:

我有两个独立的工作模型。除了一个使用随机森林和一个使用 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   <--  Added yesterday
amount_tsh            float64   <--  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     <--- 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

包含“train”和“test”的最后一列已消失。

我在 PyCharm 中打开了 df。除了两个新的数字列(233 和 234)之外,NOTHING 未编码。

此外,组合 df 的形状以及分离的 train 和 test df 的形状也显示了删除的最后一列:

(74250, 236)
(59400, 235)
(14850, 235) 

我不知道为什么 XGBoost 认为我传递的是未编码的分类数据。正如我所说,这一切都有效,直到我昨天添加了两个新的数字列。 RF 模型适用于两个新列。

【问题讨论】:

    标签: python-3.x scikit-learn xgboost xgbclassifier


    【解决方案1】:

    嗯……

    一定是 XGBoost 中的错误。

    我将我的“temp”列值从“train”和“test”分别更改为 0 和 1,它可以正常工作。

    “temp”列以这种方式初始化为“int64”。

    我仍然不明白为什么它适用于 RF,但 XGBoost 显然仍然有一些“temp”列是“object”类型的概念。

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 2019-12-08
      • 2022-06-20
      • 1970-01-01
      • 2022-01-07
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多