4

ReplaceMissingValuesWeka を使用して、テストarff データセットのみに欠損値を入力し、トレーニング データセットには欠損値を入力しないと、少し心配です。以下はコマンドラインです:

java -classpath weka.jar weka.filters.unsupervised.attribute.ReplaceMissingValues -c last  -i "test_file_with_missing_values.arff" -o "test_file_with_filled_missing_values.arff"

以前の投稿 (欠損値を平均値に置き換える (Weka)ReplaceMissingValues ) から、Wekaは各欠損値を対応する属性の平均値に単純に置き換えることを知りました。これは、属性ごとに平均を計算する必要があることを意味します。この平均の計算は、トレーニング ファイルではまったく問題ありませんが、テスト ファイルでは問題ありません。

これは、典型的なテスト シナリオでは、入力欠損値のテスト属性の平均値がわかっていると想定してはならないためです。テスト ファイルにテスト レコードのセット全体を含めるのではなく、分類用の複数の属性を持つ 1 つのテスト レコードのみを使用します。したがって、代わりに、トレーニング データを使用して計算された平均値に基づいて欠損値を入力します。次に、別の入力 (トレーニング属性の手段) が必要になるため、上記のコマンドは正しくなくなります。

誰もこれについて前に考えたことがありますか?weka を使用してこれをどのように回避しますか?

4

1 に答える 1

2

簡単です。バッチ フィルタリングを参照してください。

Instances train = ...   // from somewhere
Instances test = ...    // from somewhere
Standardize filter = new Standardize();
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

フィルターはトレーニング データを使用して初期化され、トレーニング データとテスト データの両方に適用されます。

問題は、処理パイプラインの外部で ReplaceMissingValue フィルターを適用する場合です。これは、フィルター処理されたデータを書き込んだ後、「実際の」値と「代入された」値を区別できなくなるためです。これが、FilteredClassifier を使用するなど、単一のパイプラインで行う必要があるすべてのことを行う必要がある理由です。

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier
-t "training_file_with_missing_values.arff"
-T "test_file_with_missing_values.arff"
-F weka.filters.unsupervised.attribute.ReplaceMissingValues
-W weka.classifiers.functions.MultilayerPerceptron -- -L 0.3 -M 0.2 -H a

この例では、" training _file_with_missing_values.arff" データ セットを使用して ReplaceMissingValues フィルターを初期化し、" test _file_with_missing_values.arff" (トレーニング セットから学習する手段を使用) にフィルターを適用し、フィルター処理されたトレーニング データで多層パーセプトロンをトレーニングします。フィルタリングされたテスト データのクラスを予測します。

于 2013-03-10T18:52:26.400 に答える