我有两个独立的工作模型。除了一个使用随机森林和一个使用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"类型的概念。