catboost需显式指定cat_features参数识别类别特征,不自动识别pandas category类型;字符串列须预处理填充缺失值、统一转str、避免高基数;ots编码需调prior等参数防噪声,否则易致oom或性能骤降。

CatBoost 能直接吃字符串类别特征,不用你手动 pd.get_dummies() 或 LabelEncoder ——但必须显式告诉它哪些列是类别型,否则它会当成数值型乱切。
必须用 cat_features 显式指定列索引或列名
哪怕你的 DataFrame 里某列已经是 category 类型(比如 df['city'].astype('category')),CatBoost 也不会自动识别。它只认你传给 fit() 的 cat_features 参数。
- 传索引:如果 X 是 numpy array 或 list of lists,用列下标,如
cat_features=[0, 2, 5] - 传列名:如果 X 是 pandas DataFrame,可以直接传字符串列表,如
cat_features=['sex', 'embarked', 'product_id'] - 别传错类型:传
cat_features=['0', '2'](字符串数字)会报ValueError: cat_feature index should be integer - 字符串列不等于类别列:像
'user_id'这种高基数、无语义的字符串列,硬塞进cat_features会导致内存暴涨、训练极慢,甚至 OOM
Ordered Target Statistics 编码不是“开箱即用”的黑盒
CatBoost 对每个类别值做的编码,本质是“只看排在它前面的样本的目标均值”,背后有 default_value、counter_calc_method、prior 等隐式控制项。你不调,它用默认值,但默认值未必适合你的数据分布。
- 低频类别(出现 ≤ 10 次)容易被噪声带偏:默认
prior=1.0太小,建议对稀疏列加大,比如prior=5.0 - 二分类任务中,
prior实际对应正类先验概率,不是随便填的数字;可设为全局正类比例:prior=y_train.mean() - 训练集 shuffle 是默认开启的,但如果你用了
cv或自定义划分,得确认每次 fold 的排列是独立的,否则跨 fold 泄漏风险仍在 - 别指望训练完再拿
model.get_cat_feature_statistics()反查编码值——它返回的是内部中间态,结构不稳定,不适合做离线映射
字符串类别列不能含缺失值(np.nan 或 None)
CatBoost 不像 LightGBM 那样能自动把 nan 当作独立类别处理。遇到缺失,它会直接报错:ValueError: CatBoost doesn't support NaN values in categorical features。
- 必须提前填充:用占位符字符串,如
'MISSING'、'UNKNOWN',再塞进cat_features - 别用空字符串
'':某些版本会和真实空值混淆,引发不可预期行为 - 如果原始列是 object 类型混了数字和字符串(比如
['A', 123, 'B']),pandas 读入后可能变成object,但 CatBoost 会拒绝这种混合类型,报TypeError: Unsupported type for categorical feature—— 必须统一转成字符串:df[col] = df[col].astype(str)
真正麻烦的不是“怎么让模型跑起来”,而是当类别列基数突然从 100 跳到 10 万时,cat_features 列表没动、prior 没调、缺失值填充策略也没变,结果训练内存翻四倍、单棵树构建时间从毫秒级涨到分钟级——这些细节不会报错,只会让你在深夜盯着日志发呆。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











