Библиотека в 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])
чтобы визуализировать, это выглядит примерно так:

теперь вы хотите разделить его на тренировочный и тестовый набор:
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, как для 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>
