无分类列时拟合XGBoost模型因UInt列触发分类相关报错
问题诱因
报错的核心原因是你列里的UInt8Dtype()、Int64Dtype()是pandas自定义的可空整数扩展类型,不是NumPy原生的数值dtype。
XGBoost默认的输入类型校验白名单只覆盖三类:NumPy原生的int/float/bool类型、pandas原生category类型,它识别不了pandas自己实现的这套带空值支持的扩展整数类型,会直接判定这些列是不支持的非法类型,甚至会误触发分类类型的校验分支,抛出你看到的需要开启enable_categorical的提示——但实际上这些列根本不是分类列。
你列里的dtype('float64')、dtype('int64')是NumPy原生数值类型,这两类是可以正常通过校验、不会触发报错的。
解决方法
你可以根据自己的场景选任意一种方案处理:
- 手动转换扩展类型为NumPy原生类型
如果对应列没有空值,可以直接转成对应位宽的NumPy整数类型;如果有空值(pd.NA),转成NumPy float64即可(NumPy浮点类型原生支持np.nan空值,XGBoost可以正常识别),参考代码:# 筛选所有pandas可空整数类型列 nullable_cols = X.select_dtypes(include=['Int64', 'UInt8']).columns # 无空值场景:转NumPy原生整数 X[nullable_cols] = X[nullable_cols].apply(lambda col: col.to_numpy()) # 有空值场景:转float64,pd.NA会自动转为np.nan X[nullable_cols] = X[nullable_cols].astype('float64') - 升级XGBoost版本
XGBoost 1.7.0及之后的版本已经完成了对pandas可空扩展dtype的适配,升级后不需要做任何类型转换就可以直接传入DataFrame训练,升级命令:pip install -U xgboost - 传入NumPy数组绕过DataFrame类型校验
喂数据给模型的时候直接把DataFrame转成NumPy数组,就能绕开XGBoost对DataFrame的dtype检查逻辑,直接读取数值内容训练:model.fit(X=X.to_numpy(), y=y)
注意:不要为了消报错随便给这些UInt列开
enable_categorical=True,这些列本质是数值列,强行按分类特征处理会严重影响模型训练效果。
内容的提问来源于stack exchange,提问作者aryan singh
相关产品推荐
相关产品推荐

