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

use*_*510 10 python numpy machine-learning scipy

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

Cha*_*guy 30

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

神经网络

我认为通过示例学习没有什么比这更好的了,所以我将使用前馈神经网络训练的二进制分类问题向您展示您的问题的方法,并受到来自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])
Run Code Online (Sandbox Code Playgroud)

为了可视化,它看起来像这样: 数据集

现在您想将其拆分为训练和测试集:

tstdata, trndata = alldata.splitWithProportion(0.25)

trndata._convertToOneOfMany()
tstdata._convertToOneOfMany()
Run Code Online (Sandbox Code Playgroud)

并创建您的网络:

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
Run Code Online (Sandbox Code Playgroud)

现在您需要训练您的网络并查看最终得到的结果:

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
Run Code Online (Sandbox Code Playgroud)

这在开始时给你一个非常糟糕的界限: 列车启动

但最终得到了一个相当不错的结果:

列车结束

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
Run Code Online (Sandbox Code Playgroud)

这给你一条ROC曲线: 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)
Run Code Online (Sandbox Code Playgroud)

ROC-多

(记住,对角线只是意味着你的分类器是随机的,你可能做错了)

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

现在要获得从你的神经网络绘制你的ROC曲线所需的类/概率,你只需要看一下你的神经网络的激活:activateOnDataset在pybrain中你将给出两个类的概率(在我上面的例子中我们只是采取了最大可能性来确定要考虑的类别).从那里,只需将其转换为PyROC所期望的格式random_mixture_model,它应该为您提供ROC曲线.


dfb*_*dfb 5

当然.首先,看看这个

/sf/ask/159385341/

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

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

>>> from pybrain.structure import FeedForwardNetwork
>>> n = FeedForwardNetwork()
>>> n.activate((2, 2))
array([-0.1959887])
Run Code Online (Sandbox Code Playgroud)

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

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

然后你只是绘制它们.或者您可以尝试找到一个可以帮您完成的库

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

关键是,在ROC曲线上生成并不特定于神经网络,因此您可能找不到为您执行此操作的库.我已经提供了上面的内容,表明你自己推出它是相当简单的

*更多详情*

您的神经网络将具有您必须转换为分类的输出(可能是/否).要计算ROC曲线,您将为是/否采用一些阈值(换句话说,.75>是,<.75否).从此阈值开始,将神经网络的输出转换为分类.通过将这些分类与真实分类进行比较,您会得到假阳性和真阳性率.然后,当您调整该阈值时,您正在绘制误报率和真阳性率.