Weka异常。Train and test file not compatible!"抛出,尽管有过滤器可以纠正这种不兼容的情况

问题描述 投票:0回答:1

假设我有以下ARFF格式的数据。

TRAIN:

@ATTRIBUTE A NUMERIC
@ATTRIBUTE B NUMERIC
@ATTRIBUTE C NUMERIC

TEST

@ATTRIBUTE ID NUMERIC
@ATTRIBUTE A NUMERIC
@ATTRIBUTE B NUMERIC
@ATTRIBUTE C NUMERIC
@ATTRIBUTE D NUMERIC
@ATTRIBUTE E NUMERIC

现在,为了解释属性差异,在train数据上,进行了特征选择,所以删除了一些属性。我需要从TRAIN数据集上训练的分类器在TEST数据集上得到预测,但是TRAIN和TEST头不匹配.我试着用多余的特征名作为参数,应用RemoveByName过滤器来解决,然而还是失败了,出现错误,Train和test文件不兼容!

我在阅读 这个 的对应关系,其中指出,过滤器也应用于测试数据,所以它们是兼容的,但看起来在我的情况下它们不是。

我是否必须在外部为TRAIN文件中的每个选定特征子集创建一个单独的新文件,或者我可以使用FilteredClassifier来删除不需要的特征?或者,我能否以某种方式指定哪些属性用于预测?

EDIT1:

我需要从命令行运行所有的东西,我需要能够为基础分类器和FilteredClassifier提供可变的参数和可变的过滤器,正如@zbicyclist所建议的那样,我试图通过InputMappedClassifier来实现它的工作,命令如下。

java -Xmx4096m -cp data/java/weka.jar weka.classifiers.misc.InputMappedClassifier -t train.arff -T test_bin.arff -classifications weka.classifiers.evaluation.output.prediction.CSV -p first -file FILE.arff -suppress -S 1 -W weka.classifiers.meta.FilteredClassifier -- -F weka.filters.MultiFilter -F "weka.filters.unsupervised.attribute.RemoveByName -E ^ID$" -F "weka.filters.unsupervised.attribute.RemoveByName -E ^OD_VALUE$" -W weka.classifiers.rules.DecisionTable -- -I

当我添加新行时,它看起来像这样(必须在运行之前被删除)。

java -Xmx4096m -cp data/java/weka.jar 
weka.classifiers.misc.InputMappedClassifier
  -t train.arff
  -T test_bin.arff
  -classifications weka.classifiers.evaluation.output.prediction.CSV
  -p first
  -file FILE.arff
  -suppress
  -S 1
  -W weka.classifiers.meta.FilteredClassifier
--
  -F weka.filters.MultiFilter
  -F "weka.filters.unsupervised.attribute.RemoveByName -E ^ID$"
  -F "weka.filters.unsupervised.attribute.RemoveByName -E ^OD_VALUE$"
  -W weka.classifiers.rules.DecisionTable
--
  -I

但它没有工作,并说: Weka异常: Illegal options: -F weka.filters.unsystem: -F weka.filters.unsupervised.attribute.RemoveByName -E ^ID$ -F weka.filters.unsupervised.attribute.RemoveByName -E ^OD_VALUE$ -F weka.filters.unsupervised.attribute.RemoveByName -E ^OD_VALUE$ -F weka.filters.unsupervised.attribute.RemoveByName -E ^OD_VALUE$

谁能帮我正确地嵌套这个命令,让我把基础分类器包装成FilteredClassifier,再把过滤后的分类器包装成InputClassifier?

weka feature-selection
1个回答
1
投票

如上图所示,我在测试中创建了数字属性ID...E的文件,在训练中创建了A...C的文件。

我在训练集上使用了一个线性回归分类器(预测C)。我得到了这个消息。enter image description here

我选择了 "是",然后得到了这个输出, 似乎是正确的映射。

=== Run information ===

Scheme:       weka.classifiers.misc.InputMappedClassifier -I -trim -W weka.classifiers.functions.LinearRegression -- -S 0 -R 1.0E-8 -num-decimal-places 4
Relation:     Stack_train
Instances:    80
Attributes:   3
              A
              B
              C
Test mode:    user supplied test set:  size unknown (reading incrementally)

=== Classifier model (full training set) ===

InputMappedClassifier:


Linear Regression Model

C =

      0.888  * A +
      1.0225 * B +
      0.4933
Attribute mappings:

Model attributes        Incoming attributes
----------------        ----------------
(numeric) A         --> 2 (numeric) A
(numeric) B         --> 3 (numeric) B
(numeric) C         --> 4 (numeric) C


Time taken to build model: 0.02 seconds

=== Evaluation on test set ===

Time taken to test model on supplied test set: 0.02 seconds

=== Summary ===

Correlation coefficient                  0.8341
Mean absolute error                      0.2493
Root mean squared error                  0.2904
Relative absolute error                 59.797  %
Root relative squared error             56.5247 %
Total Number of Instances               80  

所以事情似乎是正确的(Weka 3.9),至少使用线性回归作为分类器。 你用的是什么分类器?让我知道,我会试试。


1
投票

问题是,在应用过滤之前,可能已经对输入进行了比较,因此你需要将其封装到InputMappedClassifier中,只有在输入的训练特征被映射到正确的输入测试特征之后,才过滤不必要的列。

我想出了以下命令。

java -Xmx4096m -cp data/java/weka.jar weka.classifiers.misc.InputMappedClassifier \
-t train.arff \
-T test_bin.arff \
-classifications \
    "weka.classifiers.evaluation.output.prediction.CSV \
    -p first \
    -file FILE.arff \
    -suppress" \
-W weka.classifiers.meta.FilteredClassifier\
--\
    -F "weka.filters.MultiFilter -F \"weka.filters.unsupervised.attribute.RemoveByName -E ^ID$\" -F \"weka.filters.unsupervised.attribute.RemoveByName -E ^OD_VALUE$\""\
    -S 1\
    -W weka.classifiers.rules.DecisionTable \
    --\
        -I

似乎能满足我的需求

它可以通过使用 -W <classifier.name> 参数,然后在后面引入嵌套分类器的参数。-- 争论。不需要晦涩的引号反斜线。

© www.soinside.com 2019 - 2024. All rights reserved.