我需要使用weka以编程方式对某些文本进行分类,但是我遇到了麻烦,因为在与分类器一起使用之前,需要对训练数据和待分类数据进行过滤(同样的方法)。
我目前解决问题的方法是: 使用字符串属性和类创建包含训练数据的arff。 对数据集使用StringToWordVector并保存过滤器以备将来使用。 对结果数据使用Attributeselection过滤器并保存过滤器以供将来使用。 使用该数据训练分类器并保存分类器。 创建一个"实例"与arff具有相同的属性,并使用我想要使用缺少的class属性值进行分类的实例填充它。 加载StringToWordVector过滤器并使用它过滤实例。 加载AttributeSlection过滤器并使用它来过滤结果。 加载分类器并对结果进行分类。
看起来StringToWordVector正如我所期望的那样工作,并且使用与旧数据相同的新数据集。问题在于,AttributeSelection尝试再次运行而不知道我只是想让它使用之前已经过滤过的属性。
答案 0 :(得分:0)
重新使用相同的属性选择设置: 属性选择是一个过滤器,您应该使用批量过滤方法来重新使用它并获得兼容的数据(http://weka.wikispaces.com/Use+Weka+in+your+Java+code#Batch%20filtering)=>在声明您的过滤器&设置时,你应该调用setInputFormat(即myfilter.setInputFormat(train)),在训练数据上使用它(Filter.useFilter(train,myfilter)),如果你想稍后在测试数据上使用它,可以序列化数据。 setInputFormat(Instances)方法必须始终是应用过滤器之前的最后一次调用。
不重新运行属性选择:使用AttributeSelection对象的reduceDimensionality方法(即myfilter.reduceDimensionality()会降低维度,使其仅包含“最后选择的那些属性”运行属性选择“)。我认为这是你现在的主要问题。
如果要重复使用多个过滤器(即StringToWordVector,标准化,选择),则应测试多过滤器解决方案。
StringToWordVector swv = new StringToWordVector(); AttributeSelection as = new AttributeSelection(); 标准化st = new Standardize(); MultiFilter mf = new MultiFilter(); Filter [] filters = {swv,st,as}; mf.setFilters(过滤器);
济