CatBoost带分类特征对接Scikit-Learn CalibratedClassifierCV预测报错如何解决
问题原因
报错的核心逻辑为:
- Scikit-Learn的
CalibratedClassifierCV调用基模型预测接口前,会统一将输入的pandas DataFrame转换为numpy浮点数组,丢失原始列类型、列名元信息 - 提前拟合的CatBoostClassifier已经指定了
cat_features参数,收到全浮点类型的numpy数组时无法识别分类特征列,触发参数校验报错
LightGBM可正常运行是因为其预测接口对numpy数组输入的分类特征兼容性更高,不会做同类强校验。
可行解决方案
方案1:封装CatBoostClassifier适配接口(改动最小)
自定义继承自CatBoostClassifier的包装类,重写预测相关方法,自动把输入的numpy数组转回与训练时结构一致的DataFrame再执行预测:
from catboost import CatBoostClassifier import pandas as pd class CalibratableCatBoost(CatBoostClassifier): # 初始化时传入训练集的特征列名,适配不同特征结构的场景 def __init__(self, feature_cols, **kwargs): super().__init__(**kwargs) self.feature_cols = feature_cols def predict_proba(self, X, **kwargs): if not isinstance(X, pd.DataFrame): X = pd.DataFrame(X, columns=self.feature_cols) return super().predict_proba(X, **kwargs) # 调用示例 feature_cols = ['a','b','c','d'] model = CalibratableCatBoost(feature_cols=feature_cols) model.fit(X,y,verbose=False,cat_features=[3]) model_cat = CalibratedClassifierCV(base_estimator=model,cv='prefit') model_cat.fit(X,y) # 可正常调用预测接口 model_cat.predict(X)
方案2:手动实现概率校准流程(完全可控)
避开CalibratedClassifierCV的中间转换逻辑,自行拆分数据集完成校准:
from sklearn.isotonic import IsotonicRegression from sklearn.model_selection import train_test_split # 拆分训练集、校准集 X_train, X_calib, y_train, y_calib = train_test_split(X, y, test_size=0.2, random_state=42) # 训练基模型 base_model = CatBoostClassifier() base_model.fit(X_train, y_train, verbose=False, cat_features=[3]) # 获取校准集预测分数,训练校准器 calib_scores = base_model.predict_proba(X_calib)[:, 1] calibrator = IsotonicRegression(out_of_bounds='clip') calibrator.fit(calib_scores, y_calib) # 预测逻辑 def get_calibrated_result(X, threshold=0.5): raw_scores = base_model.predict_proba(X)[:, 1] calibrated_proba = calibrator.predict(raw_scores) return (calibrated_proba >= threshold).astype(int), calibrated_proba
该方案可自定义校准算法、校准集比例,适配性更强。
方案3:不使用prefit模式
如果不需要复用预训练的CatBoost模型,可删除cv='prefit'参数,将cat_features放在CatBoost的初始化参数中,让CalibratedClassifierCV完整执行训练+校准流程,也可规避该问题。
内容的提问来源于stack exchange,提问作者zonna
相关产品推荐
相关产品推荐

