1

wekaのjavaapiを使用して「自動トレーニング」を作成しようとしていますが、MultiLayerPerceptronと10のクロス検証または66%のパーセンテージ分割を使用してwekaのインターフェイスを介してARFFファイルをテストするたびに、何か間違ったことをしていると思います。 (約90%)しかし、wekaのAPIを介して同じファイルをテストしようとすると、すべてのテストは基本的に0%の一致を返します(すべての行がfalseを返します)

これがwekaのGUIからの出力です:

===テスト分割の評価======まとめ===

Correctly Classified Instances          78               91.7647 %
Incorrectly Classified Instances         7                8.2353 %
Kappa statistic                          0.8081
Mean absolute error                      0.0817
Root mean squared error                  0.24  
Relative absolute error                 17.742  %
Root relative squared error             51.0603 %
Total Number of Instances               85     

===クラス別の詳細な精度===

                TP Rate   FP Rate   Precision   Recall  F-Measure   ROC Area  Class
                 0.885     0.068      0.852     0.885     0.868      0.958    1
                 0.932     0.115      0.948     0.932     0.94       0.958    0
Weighted Avg.    0.918     0.101      0.919     0.918     0.918      0.958

===混同行列===

  a  b   <-- classified as
 23  3 |  a = 1
  4 55 |  b = 0

これが私がJavaで使用しているコードです(実際にはIKVMを使用して.NET上にあります):

var classifier = new weka.classifiers.functions.MultilayerPerceptron();
classifier.setOptions(weka.core.Utils.splitOptions("-L 0.7 -M 0.3 -N 75 -V 0 -S 0 -E 20 -H a")); //these are the same options (the default options) when the test is run under weka gui

string trainingFile = Properties.Settings.Default.WekaTrainingFile; //the path to the same file I use to test on weka explorer
weka.core.Instances data = null;
data = new weka.core.Instances(new java.io.BufferedReader(new java.io.FileReader(trainingFile))); //loads the file
data.setClassIndex(data.numAttributes() - 1); //set the last column as the class attribute

cl.buildClassifier(data);

var tmp = System.IO.Path.GetTempFileName(); //creates a temp file to create an arff file with a single row with the instance I want to test taken from the arff file loaded previously
using (var f = System.IO.File.CreateText(tmp))
{
    //long code to read data from db and regenerate the line, simulating data coming from the source I really want to test
}

var dataToTest = new weka.core.Instances(new java.io.BufferedReader(new java.io.FileReader(tmp)));
dataToTest.setClassIndex(dataToTest.numAttributes() - 1);

double prediction = 0;

for (int i = 0; i < dataToTest.numInstances(); i++)
{
    weka.core.Instance curr = dataToTest.instance(i);
    weka.core.Instance inst = new weka.core.Instance(data.numAttributes());
    inst.setDataset(data);
    for (int n = 0; n < data.numAttributes(); n++)
    {
        weka.core.Attribute att = dataToTest.attribute(data.attribute(n).name());
        if (att != null)
        {
            if (att.isNominal())
            {
                if ((data.attribute(n).numValues() > 0) && (att.numValues() > 0))
                {
                    String label = curr.stringValue(att);
                    int index = data.attribute(n).indexOfValue(label);
                    if (index != -1)
                        inst.setValue(n, index);
                }
            }
            else if (att.isNumeric())
            {
                inst.setValue(n, curr.value(att));
            }
            else
            {
                throw new InvalidOperationException("Unhandled attribute type!");
            }
        }
    }
    prediction += cl.classifyInstance(inst);
}

//prediction is always 0 here, my ARFF file has two classes: 0 and 1, 92 zeroes and 159 ones

分類器を変更してNaiveBayesとすると、結果がwekaのGUIを介して行われたテストと一致するため面白いです。

4

2 に答える 2

4

非推奨のARFFファイルの読み取り方法を使用しています。このドキュメントを参照してください。代わりにこれを試してください:

 import weka.core.converters.ConverterUtils.DataSource;
 ...
 DataSource source = new DataSource("/some/where/data.arff");
 Instances data = source.getDataSet();

ドキュメントには、データベースに直接接続し、一時的なARFFファイルの作成をバイパスする方法も示されていることに注意してください。さらに、データベースから読み取り、インスタンスを手動で作成して、Instancesオブジェクトにデータを取り込むことができます。

最後に、コードの上部にある分類器タイプをNaiveBayesに変更するだけで問題が解決した場合は、MultilayerPerceptronのweka guiのオプションをチェックして、デフォルトと異なるかどうかを確認します(設定が異なると同じ分類器タイプが異なる結果を生成します)。

更新:コードでweka GUIとは異なるテストデータを使用しているようです(データベースと元のトレーニングファイルのフォールドから)。class 0また、データベース内の特定のデータが実際にMLP分類子のように見える場合もあります。これが当てはまるかどうかを確認するには、wekaインターフェースを使用して、トレーニングarffをtrain / testセットに分割し、コードで元の実験を繰り返します。結果がGUIと同じである場合は、データに問題があります。結果が異なる場合は、コードをさらに詳しく調べる必要があります。あなたが呼び出す関数はこれです(ドキュメントから)

public Instances trainCV(int numFolds, int numFold)
于 2012-06-12T21:53:30.697 に答える
1

私も同じ問題を抱えていました。

Wekaは、Javaでの相互検証と比較して、Explorerで異なる結果をもたらしました。

助けになったもの:

Instances dataSet = ...;
dataSet.stratify(numOfFolds); // use this
         //before splitting the dataset into train and test set!
于 2014-12-29T18:02:09.327 に答える