2

PyML には決定曲面をグラフ化する機能があります。

まず、使用するデータを PyML に指示する必要があります。ここでは、特徴ベクトルで sparsevectordata を使用します。これは、SVM のトレーニングに使用したものです。

demo2d.setData(training_vector)

次に、使用する分類子を指定する必要があります。訓練済みの SVM を与えます。

demo2d.decisionSurface(best_svm, fileName = "dec.pdf")

ただし、次のエラー メッセージが表示されます。

Traceback (most recent call last):
**deleted by The Unfun Cat**
    demo2d.decisionSurface(best_svm, fileName = "dec.pdf")
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/demo/demo2d.py", line 140, in decisionSurface
    results = classifier.test(gridData)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/evaluators/assess.py", line 45, in test
    classifier.verifyData(data)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/classifiers/baseClassifiers.py", line 55, in verifyData
    if len(misc.intersect(self.featureID, data.featureID)) != len(self.featureID) :
AttributeError: 'SVM' object has no attribute 'featureID'
4

1 に答える 1

3

PyML を使用したことがないので、ソースに飛び込みます。オンラインで見つけようとしましたが、オンラインのPyML 0.7.2verifyDataのメソッドを追跡できなかったため、ダウンロードしたソースを検索する必要がありました。

分類子は、クラスのメソッドfeatureIDでのみ設定されます(77 ~ 78 行目)。baseClassifiertrain

if data.__class__.__name__ == 'VectorDataSet' :
        self.featureID = data.featureID[:]

あなたのコードでdata.__class__.__name__は、"SparseDataSet"(または使用している他のクラス)に評価され、式はFalse(featureIDを設定しない)に評価されます。

次にdemo2d.decisionSurface

gridData = VectorDataSet(gridX)
gridData.attachKernel(data.kernel)
results = classifier.test(gridData)

を使用して分類子をテストしようとしますVectorDataSet。この例では、 を使用して、データがトレーニング データと同じ特徴を持っているかどうかを検証しようとするメソッドclassifier.testの呼び出しと同等です。assess.testbaseClassifier.verifyData

def verifyData(self, data) :
  if data.__class__.__name__ != 'VectorDataSet' :
      return
  if len(misc.intersect(self.featureID, data.featureID)) != len(self.featureID) :
       raise ValueError, 'missing features in test data'

次に、渡されたデータのクラス (現在は ) をテストし、作成されたことのない属性"VectorDataSet"へのアクセスを試みます。featureID

基本的に、これはバグか隠れた機能です。

要するに、データを に変換する必要があるのは、 が他の方法で設定されていないVectorDataSetためです。SVM.featureID

また、トレーニング済みのデータ セットを渡す必要はありません。関数が分類子をトレーニングします。

編集:

setDataまた、次の方法にも注目したいと思います。

def setData(data_) :
    global data
    data = data_

型チェックはまったくありませ。そのため、整数や文字列など、dataにでも設定できる可能性があり、エラーが発生する可能性があります。decisionSurface

を使用する場合はsetData、慎重に使用する必要があります ( のみVectorDataSet)。コードは希望するほど柔軟ではないためです。

于 2013-03-05T20:20:43.290 に答える