通过python-weka-wrapper v0.3.10将数据从Numeric转换为Nominal时出现重复标签的异常

时间:2017-04-16 14:12:25

标签: python weka

使用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成功转换为名义类型。

我很感激,任何想法都可以提供帮助。

谢谢!

2 个答案:

答案 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)