1

これは、weka の使用に関する私の 2 回目の投稿です (最初の投稿はここに投稿されました)。TextDirectoryLoader を使用して、トレーニングとサンプル テスト データを Weka に提供することに成功しました。よく働く。これを本番環境に移行したいので、分類するデータは mysql テーブルから取得します。これが私がやっている方法です:

    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);

    // Create test data instances[this works, but the sample data now needs to come frm the db instead, see below]
    //loader.setDirectory(new File("c:/Users/Yehia A.Salam/Desktop/dd/test-data"));
    //dataRaw = loader.getDataSet();
    //Instances dataTest = Filter.useFilter(dataRaw, filter);

    InstanceQuery query = new InstanceQuery();
    query.setUsername("myusername");
    query.setPassword("mypassword");
    String sql = "SELECT d.desc FROM deals d WHERE d.j48 = 1";
    query.setQuery(sql);
    Instances dataTest = Filter.useFilter(query.retrieveInstances(), filter);

    // Classify
    J48 model = new J48();
    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(cls + " -> " + dataTest.instance(i).classAttribute().value((int) cls));

    }

残念ながら、これは機能していません。weka は次の行で予期せず停止します。

Instances dataTest = Filter.useFilter(query.retrieveInstances(), filter);

だから私の質問は、この部分をどのように変換するかだと思います

// Create test data instances[this works, but the sample data now needs to come frm the db instead, see below]
//loader.setDirectory(new File("c:/Users/Yehia A.Salam/Desktop/dd/test-data"));
//dataRaw = loader.getDataSet();
//Instances dataTest = Filter.useFilter(dataRaw, filter);

SQLベースのデータへ

InstanceQuery query = new InstanceQuery();
query.setUsername("myusername");
query.setPassword("mypassword");
String sql = "SELECT d.desc FROM deals d WHERE d.j48 = 1";
query.setQuery(sql);
Instances dataTest = Filter.useFilter(query.retrieveInstances(), filter);

データベース接続に問題はなく、実際に適切な数のインスタンスを取得していることに注意してください。

非常に近い、助けに感謝します。

4

2 に答える 2

0

コードは、 Text Collections の Arff Filesに基づくTextDirectoryLoaderクラスを使用します。彼らのヘルプファイルによると

"Loads all text files in a directory and 
 uses the subdirectory names as class labels. 
 The content of the text files will be stored in a String attribute, 
 the filename can be stored as well."

次のコードを参照してください

 double[] newInst = new double[2];
 newInst[0] = (double)data.attribute(0).addStringValue(files[i]);
 ....
 newInst[1] = (double)data.attribute(1).addStringValue(txtStr.toString());
 data.add(new Instance(1.0, newInst));

ご覧のとおり、このコードでは、データ セットを追加するために 2 つの属性値が必要です。しかし、あなたのSQLは1つの属性しか提供しません。

 String sql = "SELECT d.desc FROM deals d WHERE d.j48 = 1";

これが、コード newInst 1部分の「(java.lang.ArrayIndexOutOfBoundsException)」の問題の原因である可能性があります。Weka は 2 番目の属性を見つけることができません。

于 2013-03-27T07:27:03.457 に答える
-1

私は初心者ですが、参考までに、DatabaseLoaderクラスとDatabaseConverterインターフェイスがあることをご存知でしょうか。

于 2013-07-18T12:11:00.943 に答える