我想用weka进行文本分类。我有火车和测试文件(波斯语)。首先我加载火车文件,然后选择"字符串到字矢量"在预处理中。而且由于选择了这一点,班级职位开始了。要将类移动到其索引(文件中为2),我可以转到"编辑"部分并右键单击类列,然后选择"属性为类"或者只是在分类菜单中,选择(NOM)类。 (除非大多数算法都处于非活动状态)。我运行SMO并保存模型。问题是,在打开测试文件后,单击"在当前测试集上重新评估模型",出现此错误," ...类索引不同:1!= 2& #34 ;.我知道这是因为在打开测试文件后,类列再次开始。对于火车部分,我解决了上面描述的问题。但是我怎样才能为测试部分解决它呢?
答案 0 :(得分:1)
在使用测试集评估训练模型之前,应该在测试集上使用相同的变换。使用GUI时,您可以使用资源管理器中的预处理器视图,手动应用相同的转换,然后将该集保存到新的arff文件中。当您想进行一系列实验时,我建议您编写一个例程,为您进行转换。
这看起来有点像这样:
import weka.core.Instances;
import weka.core.converters.ArffSaver;
import weka.core.converters.CSVLoader;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.Remove;
import weka.filters.unsupervised.attribute.Reorder;
import weka.filters.unsupervised.attribute.NumericToNominal;
import java.io.File;
public class DataConverter
{
public static void Convert(String sourcepath,String destpath) throws Exception
{
CSVLoader loader = new CSVLoader();
loader.setSource(new File(sourcepath));
Instances data = loader.getDataSet();
Remove remove = new Remove();
remove.setOptions(weka.core.Utils.splitOptions("-R 1"));
remove.setInputFormat(data);
data = Filter.useFilter(data, remove);
Reorder reorder = new Reorder();
reorder.setOptions(weka.core.Utils.splitOptions("-R first-29,31-last,30"));
reorder.setInputFormat(data);
data = Filter.useFilter(data, reorder);
NumericToNominal ntn = new NumericToNominal();
ntn.setOptions(weka.core.Utils.splitOptions("-R first,last"));
ntn.setInputFormat(data);
data = Filter.useFilter(data, ntn);
// save ARFF
ArffSaver saver = new ArffSaver();
saver.setInstances(data);
saver.setFile(new File(destpath));
//saver.setDestination(new File(destpath));
saver.writeBatch();
}
public static void main(String args[]) throws Exception
{
File folder = new File("..\\..\\data\\output\\learning\\csv\\");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
String target = listOfFiles[i].getName();
target = target.substring(0, target.lastIndexOf("."));
System.out.println("converting file " + (i + 1) + "/" + listOfFiles.length);
Convert("..\\..\\data\\output\\learning\\csv\\" + listOfFiles[i].getName(), "..\\..\\data\\output\\learning\\arff\\" + target + ".arff");
}
}
}
}
另外:重新排序过滤器可以帮助您将目标类放在文件的末尾。它将旧索引的新顺序作为参数。在这种情况下,您可以应用Reorder -R 2-last,1
答案 1 :(得分:0)
首先,我根据列车文件中1000个最常用的单词将文件更改为向量,并为列车和测试文件创建一个数字arff文件,然后在&#34;分类&#34;菜单中&#34;测试选项&#34;我选择了&#34;(Nom)课程。