-1

我有两个独立的工作模型。除了一个使用随机森林和一个使用 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)外,没有什么是未编码的。

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

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

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

4

1 回答 1

0

嗯……

一定是 XGBoost 中的一个错误。

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

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

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

于 2021-11-27T15:13:01.517 回答