weka - Weka 异常:训练和测试文件不兼容!尽管有可以纠正这种不兼容性的过滤器,但还是抛出了
问题描述
假设我有以下 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 标头不匹配。我试图通过应用带有多余功能名称作为参数的 RemoveByName 过滤器来解决它,但是它仍然失败并出现错误,即训练和测试文件不兼容!
我正在阅读这封信函,其中指出,过滤器也适用于测试数据,因此它们是兼容的,但看起来它们不适用于我的情况。
我是否必须在外部为 TRAIN 文件中选定功能的每个子集创建一个单独的新文件,或者我可以使用 FilteredClassifier 删除不需要的功能?或者,我可以以某种方式指定用于预测的属性吗?
编辑1:
我需要从命令行运行所有内容,我需要能够为基本分类器和 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 中?
解决方案
问题是,输入可能会在应用过滤之前进行比较,因此您需要将其包装到 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>
参数最后嵌套分类器,然后在参数之后引入嵌套分类器的--
参数。不需要晦涩的引号反斜杠。
推荐阅读
- python - 如何将列表分隔到不同的表格并将表格打印到reportlab中的各个页面pdf?
- node.js - Type-graphql,Mikoorm 查询返回 Ref
而不是用户 - docker - 本地主机窗口 10 中的 Docker 连接被拒绝
- javascript - Javascript地图问题返回一个空值的数组
- java - 如何使用共享主键保持一对一休眠
- node.js - 我们可以将实时数据存储在 mongodb 数据库中吗?
- shell - 将文件中的 shell 变量替换为其实际值
- python - 在python中的列之间动态重新映射或填充值
- javascript - 当组件 A 有更新时更新组件 B
- python - 计算多个数据帧的频率