1

私はWekaを使用してラベルのない文字列を分類しようとしていますが、データマイニングの専門家ではないため、さまざまな用語に苦労しています。私が行っているのは、M5Rules分類子を実行した後、トレーニングデータを提供し、ラベルのない文字列を設定していることです。実際に出力を取得していますが、それが何を意味するのかわかりません。

run:
{17 1,35 1,64 1,135 1,205 1,214 1,215 1,284 1,288 1,309 1,343 1,461 1,493 1,500 1,552 1,806 -0.038168} | -0.03816793850062397
-0.03816793850062397 -> 

Results
======

Correlation coefficient                  0     
Mean absolute error                      0     
Root mean squared error                  0     
Relative absolute error                  0      %
Root relative squared error              0      %
Total Number of Instances                1     

BUILD SUCCESSFUL (total time: 1 second)

ソースコードは次のとおりです。

  public Categorizer(){

    try{

        //***  READ ARRF FILES *///////////////////////////////////////////////////////
        //BufferedReader trainReader = new BufferedReader(new FileReader("c:/Users/Yehia A.Salam/Desktop/dd/training-data.arff"));//File with text examples
        //BufferedReader classifyReader = new BufferedReader(new FileReader("c:/Users/Yehia A.Salam/Desktop/dd/test-data.arff"));//File with text to classify

        // Create trainning data instance
        TextDirectoryLoader loader = new TextDirectoryLoader();
        loader.setDirectory(new File("c:/Users/Yehia A.Salam/Desktop/dd/training-data"));
        Instances dataRaw = loader.getDataSet();

        StringToWordVector filter = new StringToWordVector();
        filter.setInputFormat(dataRaw);
        Instances dataTraining = Filter.useFilter(dataRaw, filter);
        dataTraining.setClassIndex(dataRaw.numAttributes() - 1);

        // Create test data instances
        loader.setDirectory(new File("c:/Users/Yehia A.Salam/Desktop/dd/test-data"));
        dataRaw = loader.getDataSet();
        Instances dataTest = Filter.useFilter(dataRaw, filter);
        dataTest.setClassIndex(dataTest.numAttributes() - 1);


        // Classify
        FilteredClassifier model = new FilteredClassifier();
        model.setFilter(new StringToWordVector());
        model.setClassifier(new M5Rules());
        model.buildClassifier(dataTraining);

        for (int i = 0; i < dataTest.numInstances(); i++) {
             dataTest.instance(i).setClassMissing();
             double cls = model.classifyInstance(dataTest.instance(i));
             dataTest.instance(i).setClassValue(cls);
             System.out.println(dataTest.instance(i).toString() + " | " + cls);
             System.out.println(cls + " -> " + dataTest.instance(i).classAttribute().value((int) cls));

            // evaluate classifier and print some statistics
             Evaluation eval = new Evaluation(dataTraining);
             eval.evaluateModelOnce(cls, dataTest.instance(i));
             System.out.println(eval.toSummaryString("\nResults\n======\n", false));
        }

    }
    catch(FileNotFoundException e){

      System.err.println(e.getMessage());
    }
    catch(IOException i){

      System.err.println(i.getMessage());
    }
     catch(Exception o){

      System.err.println(o.getMessage());
     }
  }

そして最後に、フォルダ階層で何か問題が発生した場合に備えて、いくつかのスクリーンショットを示します。 ラベルのない文字列 健康クラスのトレーニングデータ 搭乗クラスのトレーニングデータ

4

2 に答える 2

1

tl; dr:

  • クラスインデックスをランダムな機能に設定します
  • 回帰アルゴリズムではなく、分類器を使用する必要があります

問題は、データセットを初期化する方法です。wekaは通常、クラスを最後の列に配置しますが、TextDirectoryLoaderは配置しません。実際、クラスインデックスを手動で設定する必要はありません。すでに設定されているため、行を削除してください。

dataTraining.setClassIndex(dataRaw.numAttributes() - 1);
dataTest.setClassIndex(dataTest.numAttributes() - 1);

(生データセットの属性の数を使用するため、最初の行はとにかく間違っていますが、既にフィルター処理されたデータセットの列を選択します。)

次にコードを実行すると、次のようになります。

weka.classifiers.functions.LinearRegression: Cannot handle binary class!

すでに推測したように、M5Rulesは分類子ではなく、回帰用です。J48またはのような分類子を使用するRandomForestと、より適切な出力が得られます。行を変更するだけ

model.setClassifier(new M5Rules());

model.setClassifier(new RandomForest());

あなたの出力に関しては、これが私がそれで作ったものです:

{17 1,35 1,64 1,135 1,205 1,214 1,215 1,284 1,288 1,309 1,343 1,461 1,493 1,500 1,552 1,806 -0.038168} | -0.03816793850062397
-0.03816793850062397 -> 

行の結果です

System.out.println(dataTest.instance(i).toString() + " | " + cls);
System.out.println(cls + " -> " + dataTest.instance(i).classAttribute().value((int) cls));

したがって、インスタンスの機能がスパースARFFの後|にクラスとしてシリアル化されていることがわかります。

通常、クラスは整数である必要がありますが、M5Rulesのドキュメントから、回帰問題の分類子であることがわかります。したがって、離散クラスではなく、連続値を取得できます。-0.03816793850062397

クラスラベルとして数値機能を(誤って)設定したため、M5Rulesは文句を言わず、出力を提供しました。実際の分類子を使用すると、ラベルに「健康」または「旅行」が表示されます。

残りは分類子のパフォーマンスに関する標準的な統計ですが、1つの分類子インスタンスだけではかなり役に立ちません。1つのサンプルが正しく分類されたように見えるため、すべてのエラーはゼロです。

Correlation coefficient                  0     
Mean absolute error                      0     
Root mean squared error                  0     
Relative absolute error                  0      %
Root relative squared error              0      %
Total Number of Instances                1     

于 2013-03-10T15:17:47.503 に答える
0

他の誰かがM5Pで同じエラーを受け取った場合に備えて、Arffが単なるヘッダーなのか空なのかを確認してください。

それ以外の場合は試してください

model.buildClassifier(....) 

それ以外の

model.setClassifier(....); 

それは私にとってそれを解決しました。

于 2016-01-06T04:30:59.840 に答える