2

我需要以编程方式使用 weka 对一些文本进行分类,但是我遇到了问题,因为训练数据和要分类的数据在与分类器一起使用之前需要过滤(以相同的方式)。

我目前解决这个问题的方法是:使用带有字符串属性和类的训练数据创建一个 arff。在数据集上使用 StringToWordVector 并保存过滤器以供将来使用。对结果数据使用 Attributeselection 过滤器并保存过滤器以备将来使用。使用该数据训练分类器并保存分类器。创建一个与 arff 具有相同属性的“实例”,并用我要分类的实例填充它,并且缺少类属性的值。加载 StringToWordVector 过滤器并使用它来过滤实例。加载 AttributeSlection 过滤器并使用它来过滤结果。加载分类器并对结果进行分类。

似乎 StringToWordVector 正在按我的预期工作,并且对新数据使用与旧数据相同的一组单词。问题在于 AttributeSelection 似乎再次尝试运行,但并不知道我只是希望它使用它之前已经过滤的属性。

4

1 回答 1

1
  1. 重用相同的属性选择设置:属性选择是一个过滤器,您应该使用批量过滤方法才能重用它并获得兼容的数据(http://weka.wikispaces.com/Use+Weka+in+your +Java+code#Batch%20filtering ) => 在声明你的过滤器和设置后,你应该调用 setInputFormat(即 myfilter.setInputFormat(train)),在训练数据上使用它(Filter.useFilter(train, myfilter)),序列化如果您想稍后在测试数据上使用数据。setInputFormat(Instances) 方法始终必须是应用过滤器之前的最后一次调用。

  2. 不重新运行属性选择:使用 AttributeSelection 对象的 reduceDimensionality 方法(即 myfilter.reduceDimensionality() 将减少维度以仅包含“由上次运行属性选择”选择的那些属性)。我认为这是你现在的主要问题。

  3. 如果您想重复使用多个过滤器(即 StringToWordVector、标准化、选择),您应该测试一个多过滤器解决方案。

    StringToWordVector swv = new StringToWordVector(); AttributeSelection as = new AttributeSelection(); 标准化 st = new Standardize(); MultiFilter mf = new MultiFilter(); Filter[] 过滤器 = {swv, st, as}; mf.setFilters(过滤器);

泽维尔

于 2014-07-13T23:43:03.910 回答