使用Weka的ReplaceMissingValues
仅为测试 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"
从上一篇文章(Replace missing values with mean (Weka))中,我发现Weka的ReplaceMissingValues
只是用相应属性的平均值替换每个缺失值。这意味着需要为每个属性计算平均值。虽然这个平均值的计算对于训练文件来说是完全正确的,但对于测试文件来说并不合适。
这是因为在典型的测试场景中,我们不应该假设我们知道输入缺失值的测试属性的平均值。我们只有一个具有多个属性的测试记录用于分类,而不是在测试文件中包含整套测试记录。因此,我们将基于使用训练数据计算的平均值输入缺失值。然后上面的命令将变得不正确,因为我们需要另一个输入(列车属性的方法)。
以前有人想过这件事吗?你是如何使用weka解决这个问题的?
答案 0 :(得分: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
此示例将使用“ training _file_with_missing_values.arff”数据集初始化ReplaceMissingValues过滤器,然后在“ test _file_with_missing_values.arff”上应用过滤器(使用从训练集中学习),然后在过滤的训练数据上训练多层感知器并预测过滤的测试数据的类别。