10

私はPythonでの機械学習に慣れていないので、素朴な質問を許してください。ニューラルネットワークを実装するためのPythonのライブラリがあり、ROC曲線とAUC曲線も提供されます。ニューラルネットワークを実装するPythonのライブラリについては知っていますが、ROC、DET、AUC曲線のプロットにも役立つライブラリを探しています。

4

2 に答える 2

30

この場合、ニューラルネットワークはROC曲線に直接関連することはほとんどないため、質問を2つのトピックに分割することは理にかなっています。

ニューラルネットワーク

例で学ぶのにこれ以上良いものはないと思うので、フィードフォワードニューラルネットワークによってトレーニングされ、 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-シングル

もちろん、同じグラフに複数の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曲線が生成されます。

ここで、ニューラルネットワークからROC曲線をプロットするために必要なクラス/確率を取得するには、ニューラルネットワークのアクティブ化を確認する必要がありますactivateOnDataset。pybrainでは、両方のクラスの確率が得られます(上記の例では、検討するクラスを決定する確率の最大値)。そこから、のようにPyROCで期待される形式に変換するだけでrandom_mixture_model、ROC曲線が得られます。

于 2012-04-27T22:27:07.830 に答える
5

もちろん。まず、これをチェックしてください

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曲線での生成はニューラルネットに固有のものではないため、それを実行するライブラリが見つからない場合があるということです。自分でロールするのがかなり簡単であることを示すために、上記を提供しました

* より詳しく *

ニューラルネットワークには、分類に変換する必要のある出力があります(おそらくyes / no)。ROC曲線を計算するには、yes / noのいくつかのしきい値を使用します(つまり、.75> yes、<。75 no)。このしきい値から、ニューラルネットの出力を分類に変換します。これらの分類を真の分類と比較することにより、偽陽性率と真陽性率が得られます。次に、そのしきい値を微調整すると、偽陽性率と真陽性率がプロットされます。

于 2012-04-25T15:30:41.640 に答える