1

Weka gui を使用して、データセットで SVM 分類器 (libSVM を使用) をトレーニングしています。.arff ファイルのデータは

@relation Expandtext

@attribute message string 
@attribute Class {positive, negative, objective}

@data

String-to-Word Vector を使用して単語の袋に変換し、SVM を実行して、適切な分類率を取得します。今、私は知らないラベルを予測したいテストデータを持っています。繰り返しますが、ヘッダー情報は同じですが、すべてのクラスで疑問符 (?) のラベルが付けられています。

'Musical awareness: Great Big Beautiful Tomorrow has an ending\u002c Now is the time does not', ?

繰り返しますが、文字列から単語ベクトルへの前処理を行い、クラスはトレーニング データと同じ位置にあります。

「分類」メニューに移動し、トレーニング済みの SVM モデルをロードし、「提供されたテスト データ」を選択し、テスト データをロードして、「現在のテスト セットでモデルを再評価する」というモデルを右クリックしますが、 test と train に互換性がないというエラー。理由はわかりません。

テストデータにラベルを付ける方法が間違っているのでしょうか? 私は何を間違っていますか?

4

1 に答える 1

2

ほとんどすべての機械学習アルゴリズムでは、トレーニングデータとテストデータは同じ形式である必要があります。つまり、両方が同じ機能、つまりクラスを含む同じ形式のwekaの属性を持っている必要があります。

問題は、トレーニングセットとテストセットを個別に前処理し、セットStrintToWordVectorFilterごとに異なる機能を作成することです。したがって、トレーニングセットでトレーニングされたモデルは、テストセットと互換性がありません。

むしろやりたいのは、トレーニングセットでフィルターを初期化し、それをトレーニングセットとテストセットの両方に適用することです。

質問Weka:テストファイルのReplaceMissingValuesはこの問題を扱っていますが、ここで関連する部分を繰り返します。

Instances train = ...   // from somewhere
Instances test = ...    // from somewhere
Filter filter = new StringToWordVector(); // could be any filter
filter.setInputFormat(train);  // initializing the filter once with training set
Instances newTrain = Filter.useFilter(train, filter);  // configures the Filter based on train instances and returns filtered instances
Instances newTest = Filter.useFilter(test, filter);    // create new test set

これで、SVMをトレーニングし、結果のモデルをテストデータに適用できます。

トレーニングとテストを別々の実行またはプログラムで行う必要がある場合は、初期化されたフィルターをモデルと一緒にシリアル化できる必要があります。モデルをロード(逆シリアル化)するときに、フィルターをロードしてテストデータに適用することもできます。彼らは今、互換性があるはずです。

于 2013-03-15T18:39:49.943 に答える