Keras二分类DNN调用Yellowbrick分类报告报YellowbrickTypeError求助
报错原因
- Yellowbrick的
ClassificationReport仅支持符合Scikit-learn接口规范的分类器,会通过校验_estimator_type属性是否为classifier判断模型类型。你传入的finalDNNModel是原生Keras Sequential实例,无该属性,因此触发类型校验错误。 - 你已经定义了适配Sklearn接口的
KerasClassifier包装实例finalDNNModel_wrap,但可视化时未使用该实例,直接传入了原生Keras模型。
解决方案
方案1:使用KerasClassifier包装后的模型(推荐)
修正KerasClassifier的定义逻辑,直接使用包装后的模型完成训练、预测、可视化流程,代码示例如下:
import numpy as np optimizer = RMSprop(0.001) # build_fn需传入可调用对象,不可直接调用函数传返回值 def build_model(): model = Sequential() model.add(Dense(32, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy',optimizer=optimizer, metrics=['accuracy']) return model finalDNNModel_wrap = KerasClassifier(build_fn=build_model, epochs=750, batch_size=10, verbose=0) # 训练使用包装后的模型 finalDNNModel_wrap.fit(X_pca_train,y_train) # 可视化时传入包装后的模型即可 classes = ["Not Parkinson", "Parkinson"] pd.set_option('precision',2) vizDNN = ClassificationReport(finalDNNModel_wrap, classes=classes, cmap="YlGnBu", is_fitted=True, title="DNN") vizDNN.score(X_pca_validation, y_validation) vizDNN.show()
方案2:给原生Keras模型添加校验属性(快速适配)
如果不想修改原有训练逻辑,直接在初始化可视化实例前,给原生Sequential模型添加两个属性即可绕过Yellowbrick的类型校验:
# 新增两行代码,给原生模型添加Sklearn分类器标识属性 finalDNNModel._estimator_type = "classifier" finalDNNModel.classes_ = np.array([0,1]) # 原有可视化代码无需修改 classes = ["Not Parkinson", "Parkinson"] pd.set_option('precision',2) vizDNN = ClassificationReport(finalDNNModel,classes = classes,cmap="YlGnBu",is_fitted=True, force_model=True, title="DNN") vizDNN.score(X_pca_validation, y_validation) vizDNN.show()
内容的提问来源于stack exchange,提问作者Bil
相关产品推荐
相关产品推荐

