2013-03-15 148 views
1

我正在使用Weka gui在数据集上训练SVM分类器(使用libSVM)。在.arff文件中的数据是使用Weka预测测试数据集中的文本数据标签?

@relation Expandtext 

@attribute message string 
@attribute Class {positive, negative, objective} 

@data 

我把它变成文字的袋字符串到字向量,运行SVM和得到一个体面的分类率。现在我有我的测试数据,我想预测他们的标签,但我不知道。再次它的报头信息是相同的,但对每个类别它标记有一个问号(?),即

'Musical awareness: Great Big Beautiful Tomorrow has an ending\u002c Now is the time does not', ? 

再次我预先进行处理,字符串到字向量,类是在相同的位置作为训练数据。

我进入“分类”菜单,加载我的训练SVM模型,选择“提供的测试数据”,加载测试数据,右键单击“重新评估当前测试集上的模型”的模型,但是它给了我测试和训练不兼容的错误。我不知道为什么。

我该怎么办这个错误的方式来标记测试数据?我究竟做错了什么?

回答

2

对于几乎所有的机器学习算法,训练数据和测试数据都需要具有相同的格式。这意味着,两者必须具有相同的特征,即Weka中的属性,格式相同,包括类。

问题可能是您独立预处理训练集和测试集,并且StrintToWordVectorFilter将为每组创建不同的特征。因此,在训练集上训练的模型与测试集不兼容。

你想要做的是初始化训练集上的过滤器,然后将其应用于训练和测试集。

问题Weka: ReplaceMissingValues for a test file涉及这个问题,但我会在这里重复相关部分:

Instances train = ... // from somewhere 
Instances test = ... // from somewhere 
Filter filter = new StringToWordVector(); // could be any filter 
filter.setInputFormat(train); // initializing the filter once with training set 
Instances newTrain = Filter.useFilter(train, filter); // configures the Filter based on train instances and returns filtered instances 
Instances newTest = Filter.useFilter(test, filter); // create new test set 

现在,你可以训练SVM和应用测试数据生成的模型。

如果培训和测试必须在单独的运行或程序中,则应该可以将初始化过滤器与模型一起使用serialize。加载(反序列化)模型时,还可以加载筛选器并将其应用于测试数据。他们现在应该兼容。