使用二维嵌套列表训练CatBoost分类器时特征识别错误问题咨询
问题根源
CatBoost 对未做类型规整的 Python 原生嵌套列表的维度解析存在缺陷,不会自动将内层列表的1455个元素识别为独立特征列,反而会把整行的内层列表内容封装为单个字符串形式的特征值,触发数值特征的类型校验报错。
注意不要为了规避报错随意将整行内容标记为类别特征,这类操作会完全违背1455个独立数值特征的建模初衷。
修复步骤
- 第一步:优先将嵌套列表转换为 CatBoost 原生完全兼容的规整格式,避免解析逻辑出错
推荐使用 NumPy 数组格式转换,代码如下:
也可选择转换为 Pandas DataFrame 格式,同样兼容:import numpy as np # 强制指定浮点类型,消除隐式类型转换风险 x_train = np.array(x_train, dtype=np.float64) # 严格校验输出形状,确认维度为(85276, 1455)无嵌套错乱 print(f"转换后特征矩阵形状: {x_train.shape}")import pandas as pd x_train = pd.DataFrame(x_train) # 校验全表数据类型,确保没有混入字符串、嵌套列表 print(f"特征矩阵所有列类型: {x_train.dtypes.unique()}") - 第二步:转换完成后做单值校验,彻底排除结构问题
取首个样本的首个特征值,确认其类型为单浮点数值,而非列表或字符串:
正常输出应为# NumPy 格式校验示例 print(f"单值类型: {type(x_train[0, 0])}") # Pandas DataFrame 格式校验示例 print(f"单值类型: {type(x_train.iloc[0, 0])}")<class 'numpy.float64'>或<class 'float'>,如果返回类型为列表、字符串,说明原始嵌套列表存在三维嵌套的结构错误(比如每一行的元素又被包了一层列表),需要手动拆解多余的嵌套层级。 - 第三步:用转换后的规整数据重新执行模型训练,原有训练代码无需修改即可正常运行。
内容的提问来源于stack exchange,提问作者amrha
相关产品推荐
相关产品推荐

