XGBoost无法拟合数据



我有两个独立的工作模型。除了一个使用随机森林和一个使用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"one_answers"test"的最后一列不见了

我在PyCharm中打开了df。除了两个新的数字列(233和234(之外,没有任何内容是未编码的。

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

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

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

嗯。。。

肯定是XGBoost中的一个错误。

我将我的"temp"列值从"train"one_answers"test"分别更改为0和1,这很有效。

"temp"列通过这种方式初始化为"int64"。

我仍然不明白为什么它能和RF一起工作,但XGBoost显然仍然有一些"temp"列是"object"类型的概念。

最新更新