用于神经网络的 Python 库以绘制 ROC、AUC、DET [关闭]

Posted

技术标签:

【中文标题】用于神经网络的 Python 库以绘制 ROC、AUC、DET [关闭]【英文标题】:Library in python for neural networks to plot ROC, AUC, DET [closed] 【发布时间】:2012-05-05 10:56:04 【问题描述】:

我是 python 机器学习的新手,因此请原谅我的幼稚问题。 python中是否有一个用于实现神经网络的库,这样它也给了我ROC和AUC曲线。我知道 python 中实现神经网络的库,但我正在寻找一个库,它也可以帮助我绘制 ROC、DET 和 AUC 曲线。

【问题讨论】:

这可能存在,但您为什么不能使用图形库进行分析以及您最满意的任何神经网络库?绘制 ROC 等曲线只需将测试神经网络的输出传递给绘图函数或库 @spinning_plate 感谢您的回复。你能举一个小例子来说明同样的事情吗?或者一个小提示......我会非常感激同样的 【参考方案1】:

在这种情况下,将您的问题分为 2 个主题是有意义的,因为神经网络与 ROC 曲线几乎没有直接关系。

神经网络

我认为没有什么比通过示例学习更好的方法了,所以我将向您展示一种解决问题的方法,该方法使用由 Feed-Forward 神经网络训练并受 @987654321 启发的二元分类问题@来自pybrain。

首先要定义一个数据集。最简单的可视化方法是在 2D 平面上使用二进制数据集,点从正态分布生成,每个点都属于 2 个类之一。在这种情况下,这将是线性可分的。

from pybrain.datasets            import ClassificationDataSet
from pybrain.utilities           import percentError
from pybrain.tools.shortcuts     import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules   import SoftmaxLayer

from pylab import ion, ioff, figure, draw, contourf, clf, show, hold, plot
from scipy import diag, arange, meshgrid, where
from numpy.random import multivariate_normal

means = [(-1,0),(2,4),(3,1)]
cov = [diag([1,1]), diag([0.5,1.2]), diag([1.5,0.7])]
n_klass = 2
alldata = ClassificationDataSet(2, 1, nb_classes=n_klass)
for n in xrange(400):
    for klass in range(n_klass):
        input = multivariate_normal(means[klass],cov[klass])
        alldata.addSample(input, [klass])

为了形象化,它看起来像这样:

现在你想把它分成训练集和测试集:

tstdata, trndata = alldata.splitWithProportion(0.25)

trndata._convertToOneOfMany()
tstdata._convertToOneOfMany()

并创建您的网络:

fnn = buildNetwork( trndata.indim, 5, trndata.outdim, outclass=SoftmaxLayer )

trainer = BackpropTrainer( fnn, dataset=trndata, momentum=0.1, verbose=True,             weightdecay=0.01)

ticks = arange(-3.,6.,0.2)
X, Y = meshgrid(ticks, ticks)
# need column vectors in dataset, not arrays
griddata = ClassificationDataSet(2,1, nb_classes=n_klass)
for i in xrange(X.size):
    griddata.addSample([X.ravel()[i],Y.ravel()[i]], [0])
griddata._convertToOneOfMany()  # this is still needed to make the fnn feel comfy

现在你需要训练你的网络,看看你最终会得到什么结果:

for i in range(20):
    trainer.trainEpochs( 1 )
    trnresult = percentError( trainer.testOnClassData(),
                              trndata['class'] )
    tstresult = percentError( trainer.testOnClassData(
           dataset=tstdata ), tstdata['class'] )

    print "epoch: %4d" % trainer.totalepochs, \
          "  train error: %5.2f%%" % trnresult, \
          "  test error: %5.2f%%" % tstresult

    out = fnn.activateOnDataset(griddata)
    out = out.argmax(axis=1)  # the highest output activation gives the class
    out = out.reshape(X.shape)

    figure(1)
    ioff()  # interactive graphics off
    clf()   # clear the plot
    hold(True) # overplot on
    for c in range(n_klass):
        here, _ = where(tstdata['class']==c)
        plot(tstdata['input'][here,0],tstdata['input'][here,1],'o')
    if out.max()!=out.min():  # safety check against flat field
        contourf(X, Y, out)   # plot the contour
    ion()   # interactive graphics on
    draw()  # update the plot

这在开始时给你一个非常糟糕的边界:

不过最后还是一个不错的结果:

ROC 曲线

至于 ROC 曲线,here 是一个不错且简单的 Python 库,可用于解决随机玩具问题:

from pyroc import *
random_sample  = random_mixture_model()  # Generate a custom set randomly

#Example instance labels (first index) with the decision function , score (second index)
#-- positive class should be +1 and negative 0.
roc = ROCData(random_sample)  #Create the ROC Object
roc.auc() #get the area under the curve
roc.plot(title='ROC Curve') #Create a plot of the ROC curve

这为您提供了一条 ROC 曲线:

当然你也可以在同一张图上绘制多条 ROC 曲线:

x = random_mixture_model()
r1 = ROCData(x)
y = random_mixture_model()
r2 = ROCData(y)
lista = [r1,r2]
plot_multiple_roc(lista,'Multiple ROC Curves',include_baseline=True)

(请记住,对角线只是意味着您的分类器是随机的,并且您可能做错了什么)

您可以轻松地在任何分类任务中使用您的模块(不限于神经网络),它会为您生成 ROC 曲线。

现在要从神经网络中获取绘制 ROC 曲线所需的类别/概率,您只需查看神经网络的激活情况:pybrain 中的activateOnDataset 将为您提供这两个类别的概率(在我的上面的例子我们只取概率的最大值来确定要考虑哪个类)。从那里,只需将其转换为 PyROC 所期望的格式,例如 random_mixture_model,它就会为您提供 ROC 曲线。

【讨论】:

非常感谢您的帮助。但我的问题是......就像 random_mixture_model() 给出了类和与之相关的概率......如何从 pybrain 获得相同的......实际上给定这两个值我可以绘制 ROC 曲线而不使用 pyroc 也。但为了绘制相同的 pyroc,还需要我正在寻找的这些关键数据。如果您对此有所了解...确实会很有帮助 @user1354510 我刚刚更新了我的帖子以提供更多详细信息,请查看最后一段,我解释了如何使用 pybrain 获取概率。【参考方案2】:

当然。首先,看看这个

https://***.com/questions/2276933/good-open-source-neural-network-python-library

这是我的一般想法,我正在勾勒出我可能会如何处理这个问题,这些都没有经过测试

从 http://pybrain.org/docs/tutorial/netmodcon.html#feed-forward-networks

>>> from pybrain.structure import FeedForwardNetwork
>>> n = FeedForwardNetwork()
>>> n.activate((2, 2))
array([-0.1959887])

我们构建一个神经网络,对其进行训练(未显示)并获得输出。你有一个测试集,对吧?您使用测试集生成 ROC 曲线的数据。对于单个输出神经网络,您希望为输出值创建一个阈值,以将它们转换为是或否响应,从而为您的任务获得最佳程度的特异性/敏感性

这是一个很好的教程 http://webhome.cs.uvic.ca/~mgbarsky/DM_LABS/LAB_5/Lab5_ROC_weka.pdf

然后你只需绘制它们。或者你可以尝试找到一个为你做这件事的图书馆

我看到了 http://pypi.python.org/pypi/yard

关键是,在 ROC 曲线上生成并不特定于神经网络,因此您可能找不到适合您的库。我已经提供了上面的内容,以表明自己滚动是相当简单的

* 更多细节 *

您的神经网络将有一个输出,您必须将其转换为分类(可能是/否)。要计算 ROC 曲线,您需要为是/否设置几个阈值(换句话说,0.75> 是,<.75>

【讨论】:

以上是关于用于神经网络的 Python 库以绘制 ROC、AUC、DET [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

python 使用sklearn绘制roc曲线选取合适的分类阈值

ROC曲线绘制(Python)

如何在 Python 中绘制 ROC 曲线

如何从具有 2 个输出神经元的 softmax 二元分类器绘制 ROC 曲线?

r R脚本用于从数据生成和绘制ROC曲线

python ML - 绘制ROC曲线