python中用于神经网络绘制ROC、AUC、DET的库

python中用于神经网络绘制ROC、AUC、DET的库,python,numpy,machine-learning,scipy,Python,Numpy,Machine Learning,Scipy,我是python机器学习新手,所以请原谅我的天真问题。python中是否有一个用于实现神经网络的库,这样它也可以给我ROC和AUC曲线。我知道python中实现神经网络的库,但我正在寻找一个库,它也可以帮助我绘制ROC、DET和AUC曲线。当然。首先,看看这个 这是我的总体想法,我正在勾勒出我可以如何处理这个问题,没有一个是经过测试的 从 我们建立一个神经网络,训练它(未显示)并得到输出。你有一个测试集,对吗?使用测试集生成ROC曲线的数据。对于单输出神经网络,您希望为输出值创建一个阈值,以

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

当然。首先,看看这个

这是我的总体想法,我正在勾勒出我可以如何处理这个问题,没有一个是经过测试的

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

这是一个很好的教程

然后你就把它们画出来。或者你也可以试着找到一个为你做这件事的图书馆

我看到了这个

关键是,在ROC曲线上生成并不是神经网络特有的,所以你可能找不到一个库来为你做这件事。我提供了上面的内容,以显示自己的滚动非常简单

*更多详细信息*


您的神经网络将有一个输出,您必须将其转换为分类(可能是/否)。要计算ROC曲线,您需要为是/否取一些阈值(换句话说,.75>是,在这种情况下,将问题分为两个主题是有意义的,因为神经网络与ROC曲线几乎没有直接关系

神经网络 我认为没有什么比通过示例学习更好的了,因此我将向您展示一种解决问题的方法,该方法使用一个由前馈神经网络训练的二进制分类问题,并从中得到启发

第一件事是定义数据集。可视化的最简单方法是在二维平面上使用二进制数据集,点由正态分布生成,每个点都属于这两类中的一类。在这种情况下,这将是线性可分的

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曲线,有一个简单的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曲线所需的类/概率,您只需查看神经网络的激活情况:
activateOnDataset
在pybrain中将为您提供两个类的概率(在我上面的示例中,我们只需取概率的最大值来确定要考虑的类)。从那里,只需将其转换为PyROC所期望的格式,如
随机混合模型
,它应该会给出您的ROC曲线。

这可能存在,但为什么您不能使用图形库进行分析,以及任何您最满意的神经网络库?绘制ROC等曲线只需通过ou即可t将神经网络测试为绘图功能,或者,library@spinning_plate谢谢你的回复。你能给我一个小例子来说明同样的问题吗?或者给我一个小提示。我真的非常感谢sameThanks的帮助。但是我的问题是…就像随机混合模型一样()给出了类和与之相关的概率…如何从pybrain获得相同的值…实际上,给定这两个值,我也可以绘制ROC曲线,而不使用pyroc。但是为了绘制相同的pyroc,还需要我正在搜索的这些关键数据。如果你对此有所了解…这将是一个很大的帮助indeed@user1354510 我刚刚更新了我的帖子,给你提供了更多的细节,看看最后一段,我解释了如何用pybrain获得概率。
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)