结合GridSearchCV、Pipeline时Keras Functional模型predict调用报错
问题1:Pipeline无法调用predict的原因
该报错与Pipeline实例本身无关,根因是TensorFlow 2.6及以上版本移除了tf.keras.Model(包含Functional结构模型)的predict_classes方法。你使用的KerasClassifier属于旧版本scikit-learn兼容包装器,它的predict方法默认会调用底层Keras模型的predict_classes获取分类结果,而你用的Functional结构模型不存在该方法,因此抛出属性错误。
问题2:获取预测结果的解决方案
可选用以下任意一种方式解决:
方案一:调用
predict_proba后手动转换分类结果
二分类场景下直接替换cv.predict(X_test)的代码即可:# 获取所有样本的分类概率 y_pred_proba = cv.predict_proba(X_test) # 以0.5为阈值划分类别,可根据实际需求调整阈值 y_predicted = (y_pred_proba[:, 1] >= 0.5).astype(int)该方案无需修改原有封装逻辑,还可灵活调整分类阈值适配不平衡数据集等特殊场景。
方案二:自定义兼容新版TensorFlow的分类器包装器
如果你需要保留scikit-learn风格的predict调用逻辑,可重写KerasClassifier的predict方法:from tensorflow.keras.wrappers.scikit_learn import KerasClassifier as BaseKerasClassifier class CustomKerasClassifier(BaseKerasClassifier): def predict(self, x, **kwargs): proba = self.model.predict(x, verbose=0) if proba.shape[-1] > 1: return proba.argmax(axis=-1) return (proba >= 0.5).astype(int).reshape(-1)后续将原有代码中的
KerasClassifier替换为CustomKerasClassifier,即可正常调用cv.predict(X_test)获取分类结果。
内容的提问来源于stack exchange,提问作者Chrissi.k
相关产品推荐
相关产品推荐

