Weka 异常:训练和测试文件不兼容!尽管有过滤器可以纠正这种不兼容性,但仍然抛出
Weka exception: Train and test file not compatible! thrown despite having filters that shall correct that incompatibility
假设我有以下 ARFF 格式的数据:
火车:
@ATTRIBUTE A NUMERIC
@ATTRIBUTE B NUMERIC
@ATTRIBUTE C NUMERIC
测试
@ATTRIBUTE ID NUMERIC
@ATTRIBUTE A NUMERIC
@ATTRIBUTE B NUMERIC
@ATTRIBUTE C NUMERIC
@ATTRIBUTE D NUMERIC
@ATTRIBUTE E NUMERIC
现在,为了解释属性差异,在 TRAIN 数据上,进行了特征选择,因此删除了一些属性。我需要从在 TRAIN 数据集上训练的分类器获得对 TEST 数据集的预测,但 TRAIN 和 TEST headers 不匹配。
我试图通过应用 RemoveByName 过滤器并将多余的特征名称作为参数来解决它,但是它仍然失败并出现错误,即训练和测试文件不兼容!
我正在阅读 this 通信,其中指出过滤器也适用于测试数据,因此它们是兼容的,但看起来它们不适合我。
我是否必须在外部为 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 异常:非法选项:-F weka.filters.unsupervised.attribute.RemoveByName -E ^ID$ -F weka.filters.unsupervised.attribute.RemoveByName -E ^OD_VALUE$
谁能帮我正确嵌套命令,这样我就可以将基分类器包装到 FilteredClassifier 中,然后将过滤后的分类器包装到 InputClassifier 中?
如上所示,我在测试中创建了数字属性 ID...E,在训练中创建了 A...C。
我在训练集上使用了线性回归分类器(预测 C)。我收到这条消息:
我选择了 "Yes",并得到了这个输出,它似乎映射正确:
=== 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),至少使用线性回归作为分类器。你用的是什么分类器?让我知道,我会试试看。
问题是,在应用过滤之前可能会比较输入,因此您需要将其包装到 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>
参数来嵌套分类器,然后在 --
参数之后引入嵌套分类器的参数。不需要晦涩的引用反斜杠。
假设我有以下 ARFF 格式的数据:
火车:
@ATTRIBUTE A NUMERIC
@ATTRIBUTE B NUMERIC
@ATTRIBUTE C NUMERIC
测试
@ATTRIBUTE ID NUMERIC
@ATTRIBUTE A NUMERIC
@ATTRIBUTE B NUMERIC
@ATTRIBUTE C NUMERIC
@ATTRIBUTE D NUMERIC
@ATTRIBUTE E NUMERIC
现在,为了解释属性差异,在 TRAIN 数据上,进行了特征选择,因此删除了一些属性。我需要从在 TRAIN 数据集上训练的分类器获得对 TEST 数据集的预测,但 TRAIN 和 TEST headers 不匹配。 我试图通过应用 RemoveByName 过滤器并将多余的特征名称作为参数来解决它,但是它仍然失败并出现错误,即训练和测试文件不兼容!
我正在阅读 this 通信,其中指出过滤器也适用于测试数据,因此它们是兼容的,但看起来它们不适合我。
我是否必须在外部为 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 异常:非法选项:-F weka.filters.unsupervised.attribute.RemoveByName -E ^ID$ -F weka.filters.unsupervised.attribute.RemoveByName -E ^OD_VALUE$
谁能帮我正确嵌套命令,这样我就可以将基分类器包装到 FilteredClassifier 中,然后将过滤后的分类器包装到 InputClassifier 中?
如上所示,我在测试中创建了数字属性 ID...E,在训练中创建了 A...C。
我在训练集上使用了线性回归分类器(预测 C)。我收到这条消息:
我选择了 "Yes",并得到了这个输出,它似乎映射正确:
=== 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),至少使用线性回归作为分类器。你用的是什么分类器?让我知道,我会试试看。
问题是,在应用过滤之前可能会比较输入,因此您需要将其包装到 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>
参数来嵌套分类器,然后在 --
参数之后引入嵌套分类器的参数。不需要晦涩的引用反斜杠。