Библиотека в python для нейронных сетей для построения ROC, AUC, DET [закрыто]

Я новичок в машинном обучении в python, поэтому простите мой наивный вопрос. Есть ли библиотека в python для реализации нейронных сетей, так что она также дает мне кривые ROC и AUC. Я знаю о библиотеках в python, которые реализуют нейронные сети, но я ищу библиотеку, которая также помогает мне в построении кривых ROC, DET и AUC.

2 ответов


в этом случае имеет смысл разделить ваш вопрос на 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])

чтобы визуализировать, это выглядит примерно так: dataset

теперь вы хотите разделить его на тренировочный и тестовый набор:

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

что дает вам очень плохую границу в начале: train-start

но в конце концов довольно хороший результат:

train-end

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-single

конечно, вы также можете постройте несколько кривых 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-multiple

(помните, что диагональ просто означает, что ваш классификатор является случайным и что вы, вероятно, делаете что-то неправильно)

вы, вероятно, можете легко использовать свои модули в любой из ваших задач классификации (не ограничиваясь нейронными сетями), и он будет производить Roc кривые для вас.

теперь, чтобы получить класс / вероятность, необходимую для построения кривой ROC из вашей нейронной сети, вы просто нужно посмотреть на активацию вашей нейронной сети:activateOnDataset в pybrain даст вам вероятность для обоих классов (в моем примере выше мы просто берем максимум вероятностей, чтобы определить, какой класс считать). Оттуда просто преобразуйте его в формат, ожидаемый PyROC, как для random_mixture_model и это должно дать вам вашу кривую ROC.


конечно. Во-первых, проверьте это

https://stackoverflow.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, вы собираетесь взять несколько порогов для ДА / НЕТ (другими словами, .75> да <.75>