Weka:ReplaceMissingValues用于测试文件

当使用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解决这个问题的?

最佳答案 容易,见
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”(通过从训练集学习的方法),然后在过滤的训练数据上训练多层感知器并预测过滤后的测试数据的类.

点赞