我正在使用Weka gui在数据集上训练SVM分类器(使用libSVM)。 .arff文件中的数据是
@relation Expandtext
@attribute message string
@attribute Class {positive, negative, objective}
@data
我把它变成了一个包含Word-to-Word Vector的单词包,运行SVM并获得了不错的分类率。现在我有我的测试数据,我想预测他们不知道的标签。同样,它的标题信息是相同的,但对于每个类,它都标有问号(?),即
'Musical awareness: Great Big Beautiful Tomorrow has an ending\u002c Now is the time does not', ?
我再次预处理它,字符串到字的向量,类与训练数据处于相同的位置。
我进入“分类”菜单,加载我训练过的SVM模型,选择“提供的测试数据”,加载测试数据并右键单击模型“重新评估当前测试集上的模型”但是它给我一个测试和训练不兼容的错误。我不知道为什么。
我是否以错误的方式标记测试数据?我做错了什么?
答案 0 :(得分: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初始化过滤器和模型。加载(反序列化)模型时,还可以加载过滤器并将其应用于测试数据。他们现在应该是兼容的。