2013-02-10 22 views
4

我使用了Weka的ReplaceMissingValues輸入遺漏值僅適用於測試ARFF數據集而不是爲訓練數據集時有點擔心。下面是命令行:Weka的:ReplaceMissingValues的測試文件

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" 

從以前的文章(Replace missing values with mean (Weka)),我才知道了Weka的ReplaceMissingValues只需用相應屬性的平均值替換每個缺失值。這意味着需要爲每個屬性計算平均值。雖然這個平均值的計算對於訓練文件來說是非常好的,但對測試文件來說是不合適的。

這是因爲在典型的測試場景中,我們不應該假設我們知道輸入缺失值的測試屬性的均值。我們只有一個測試記錄具有多個用於分類的屬性,而不是將一組測試記錄存儲在一個測試文件中。因此,我們應該根據使用訓練數據計算出的均值來輸入缺失值。然後上面的命令會變得不正確,因爲我們需要另一個輸入(火車屬性的手段)。

以前有人想過這個嗎?你如何通過使用weka解決這個問題?

回答

2

易見Batch Filtering

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 

這個例子將初始化使用「培訓 _file_with_missing_values.arff」數據集ReplaceMissingValues過濾器,然後將過濾器應用於「測試_file_with_missing_values.arff」(具有從訓練集中學習的方式),然後在過濾的訓練數據上訓練多層感知器並預測過濾的測試數據的類別。

+0

謝謝,雖然有幾個問題。這看起來像它可以工作,但我是新的Weka,甚至更多,所以weka在命令行上...我不需要也運行StringToWordVector?我怎樣才能添加第二個過濾器到同一個命令?還有「非法選項-c last」會被該代碼拋出。此外,我沒有使用MultilayerPerceptron,因爲它具有很多功能,但速度太慢,但我知道如何用LibSVM/NaiveBayes取代 – 2013-03-15 19:38:30

+0

然後,我怎麼才能真正讓它給我未知數據的預測類?標籤標有「?」的標籤。我怎樣才能得到並保存它? – 2013-03-15 19:50:54

+0

@JoshWeissbock也許你應該考慮爲此發佈一個單獨的問題。 – Sentry 2013-03-15 20:03:08