通过python weka包装器v0.3.10将数据从数字转换为标称时出现重复标签异常

通过python weka包装器v0.3.10将数据从数字转换为标称时出现重复标签异常,python,weka,Python,Weka,使用PythonWeka包装器v0.3.10存在一个数据预处理问题,这让我困惑了好几天 我正在使用从矩阵创建实例()从数据阵列到实例生成数据集,这是一种数值类型 然后通过将数据集保存到arff文件(numeric_data.arff)中 然后尝试使用将我的数据集转换为标称类型 Filter(classname="weka.filters.unsupervised.attribute.NumericToNominal", options=["-R", "first-last"]) 异常消息输出如

使用PythonWeka包装器v0.3.10存在一个数据预处理问题,这让我困惑了好几天

我正在使用从矩阵创建实例()从数据阵列到实例生成数据集,这是一种数值类型

然后通过将数据集保存到arff文件(numeric_data.arff)中

然后尝试使用将我的数据集转换为标称类型

Filter(classname="weka.filters.unsupervised.attribute.NumericToNominal", options=["-R", "first-last"])
异常消息输出如下所示:

线程“thread-0”java.lang.IllegalArgumentException中的异常:A 标称属性(x2)不能有重复的标签(1)

但是,使用我生成的相同数据集(numeric_data.arff),可以通过Weka GUI Explorer v3.8.1成功地将其转换为标称类型

如果有任何想法能帮上忙,我将不胜感激


谢谢

问题很可能是您的值很小(<10^6),保存时Weka都会将其变为0.0(默认情况下,Weka只输出小数点后的6位数字)。如果在保存数据集之前将过滤器应用于该数据集,则该过滤器应能正常工作

或者,您可以告诉
ArffSaver
保存文件时要使用的小数位数(
-decimal
选项)。另请参阅该类的Javadoc。

(摘自邮件列表,以正确回答此问题)

数字滤波器是一个非常哑的滤波器。它的唯一目的是提供一种简单的方法,将假定为分类值的数值(例如,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)

我尝试过,但仍然失败,没有保存到arff文件。而且,这些重复标签的值都是1(整数),而不是小值。
# 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)