使用python-weka-wrapper v0.3.10存在数据预处理问题,这让我感到困惑了几天。
我使用 create_instances_from_matrices()从ndarray生成我的数据集到实例,这是数字类型。
然后通过
将数据集保存到arff文件( numeric_data.arff )Saver(classname="weka.core.converters.ArffSaver")
然后尝试使用
将我的数据集转换为名义类型Filter(classname="weka.filters.unsupervised.attribute.NumericToNominal", options=["-R", "first-last"])
异常消息输出如:
线程中的异常"线程0" java.lang.IllegalArgumentException:A 名义属性(x2)不能有重复的标签(1)。
但是,使用我生成的相同数据集( numeric_data.arff ),可以通过Weka GUI Explorer v3.8.1成功转换为名义类型。
我很感激,任何想法都可以提供帮助。
谢谢!
答案 0 :(得分:0)
问题很可能是你有小的值(< 10 ^ 6),Weka在保存时都变为0.0(Weka默认只输出小数点后的6位数)。如果在保存之前将过滤器应用于数据集,它应该可以正常工作。
或者,您可以告诉ArffSaver
保存文件时要使用的小数位数(-decimal
选项)。另请参阅ArffSaver类的Javadoc。
答案 1 :(得分:0)
(摘自邮件列表中的discussion,正确回答此问题)
NumericToNominal 过滤器是一个非常愚蠢的过滤器。它的唯一目的是有一种简单的方法来转换应该是分类的数值(例如,1.0,2.0到标签1和2)。将数字转换为标签时,它会在6位小数后关闭小数。但是,它没有检查是否会导致生成重复标签。例如,2.00000001和2.0都将生成2(或2.0)作为标签。
您可以使用 NumericCleaner 过滤器删除这些尾随小数,例如:
# round to specified number of decimals
decimals = 3
cleaner = Filter(classname="weka.filters.unsupervised.attribute.NumericCleaner", options=["-R", "first-last", "-decimals", str(decimals)])
cleaner.inputformat(data)
data = cleaner.filter(data)