python - 使用 YellowBrick 的分类报告
问题描述
我最近在 iris 数据集上实现了概率神经网络。我试图使用 YellowBrick 分类器打印分类报告,但是当我运行此代码时出现错误。如下。
from neupy import algorithms
model = algorithms.PNN(std=0.1, verbose=True, batch_size = 500)
model.train(X_train, Y_train)
predictions = model.predict(X_test)
from yellowbrick.classifier import ClassificationReport
visualizer = ClassificationReport(model, support=True)
visualizer.fit(X_train, Y_train) # Fit the visualizer and the model
visualizer.score(X_test, Y_test) # Evaluate the model on the test data
visualizer.show()
此代码返回此错误。
YellowbrickTypeError: This estimator is not a classifier; try a regression or clustering score visualizer instead!
当我为其他分类模型尝试相同的分类报告代码时,它可以工作。我不知道。为什么会这样?谁能帮我解决这个问题?
解决方案
Yellowbrick 旨在与 scikit-learn 一起使用,并使用 sklearn 的类型检查系统来检测模型是否适合特定类别的机器学习问题。如果 neupyPNN
模型实现了 scikit-learn 估计器 API(例如fit()
和predict()
) - 可以直接使用模型并通过使用force_model=True
如下参数绕过类型检查:
visualizer = ClassificationReport(model, support=True, force_model=True)
然而,在快速浏览一下neupy 文档后,似乎这不一定有效,因为 neupy 方法是命名的train
,而不是命名fit
的,因为 PNN 模型没有实现score()
方法,也不支持_
后缀学习参数。
解决方案是创建一个轻量级包装器,围绕PNN
模型将其公开为 sklearn 估计器。在 Yellowbrick 数据集上进行测试,这似乎可行:
from sklearn import metrics
from neupy import algorithms
from sklearn.base import BaseEstimator
from yellowbrick.datasets import load_occupancy
from yellowbrick.classifier import ClassificationReport
from sklearn.model_selection import train_test_split
class PNNWrapper(algorithms.PNN, BaseEstimator):
"""
The PNN wrapper implements BaseEstimator and allows the classification
report to score the model and understand the learned classes.
"""
@property
def classes_(self):
return self.classes
def score(self, X_test, y_test):
y_hat = self.predict(X_test)
return metrics.accuracy_score(y_test, y_hat)
# Load the binary classification dataset
X, y = load_occupancy()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Create and train the PNN model using the sklearn wrapper
model = PNNWrapper(std=0.1, verbose=True, batch_size=500)
model.train(X_train, y_train)
# Create the classification report
viz = ClassificationReport(
model,
support=True,
classes=["not occupied", "occupied"],
is_fitted=True,
force_model=True,
title="PNN"
)
# Score the report and show it
viz.score(X_test, y_test)
viz.show()
尽管 Yellowbrick 目前不支持 neupy,但如果您有兴趣 - 可能值得提交一个建议将 neupy 添加到 contrib 的问题,类似于 Yellowbrick 中statsmodels
的实现方式。
推荐阅读
- dynamics-crm - Dynamics 365 门户 odata 列表 URL 异常
- gradle - 为什么Gradle在使用dependsOn时总是按字母顺序执行任务依赖
- amazon-web-services - 例如不接受传入连接的健康检查
- python-3.x - 如何在python3中可靠地测试输出终端的颜色能力?
- pandas - 带有条形图的 Pandas DataFrame
- jwplayer - 如何在 javascript 中使用 jwplayer API
- java - 以编程方式删除自定义操作栏上的按钮
- javascript - 删除与 Jquery 相同的 Attr 中的元素
- css - IE11按钮文字溢出按钮,如果太大,应该扩大按钮宽度并移动到新行
- angularjs - 重写规则 - 区分 Angular #! 和 Angular 没有 #!