検索クエリを {Artist, Actor, Politician, Athlete, Facility, Geo, Definition, QA} のいずれかに分類する分類子を作成しました。2 つの csv ファイルがあります。1 つは分類子のトレーニング用 (300 クエリを含む) で、もう 1 つは分類子のテスト用 (現在約 200 クエリを含む) です。weka knowledgeflow を使用して分類子をトレーニング/評価するためにトレーニングセットとテストセットを使用すると、ほとんどのクラスでかなりの精度が得られます。Weka ナレッジ フロー トレーニング/テスト状況のセットアップ:
トレーニングの後、MultiLayer Perceptron 分類子をナレッジフローから classifier.model に保存しました。これを Java コードで使用してクエリを分類しました。
このモデルを Java コードで逆シリアル化し、それを使用してテスト セット CSV ファイルのすべてのクエリを分類すると (逆シリアル化された分類子で distributionForInstance() メソッドを使用)、ナレッジフローですべての「Geo」クエリが「施設」として分類されます。クエリとすべての「QA」クエリを「定義」クエリとして。ClassifierPerformanceEvaluator は、'Geo' クエリと 'QA' クエリのスコアが非常に高く、テスト クエリが同じである (同じ CSV ファイルが使用された) 混同行列を示したので、これには少し驚きました。distributionForInstance() メソッドを使用する他のすべてのクエリ分類は正常に機能しているように見えるため、ナレッジフローの混同行列を見て予想される動作を示しています。
私が考えることができる 1 つのことは次のとおりです。testing-CSV ファイルには、他の属性の中でも、すべて大文字のケースで多くの公称値属性が含まれています。Javaコードで分類する前にインスタンスのすべての属性の値を出力すると、これらの値は小文字に変換されているようです(DataSource.getDataSet()メソッドはこのように動作するようです)。これらの属性の大文字と小文字が区別されていることが原因で、testing-CSV ファイルの一部のインスタンスが異なる方法で分類される可能性がありますか? 公称値属性は大文字と小文字を区別するという Weka 仕様を読みました。ただし、weka は、これらの値が公称属性に対して事前定義されていないという例外をスローするため、Java ファイルでこれらの値を大文字に変更します。