使用Weka预测测试数据集中的文本数据标签?

我正在使用Weka的图形界面在数据集上训练一个SVM分类器(使用libSVM)。.arff文件中的数据是

@relation Expandtext@attribute message string @attribute Class {positive, negative, objective}@data

我将其转换为词袋,使用String-to-Word Vector运行SVM,并获得了不错的分类率。现在我有了我的测试数据,我想预测它们的标签,这些标签是我不知道的。同样,它的头部信息是相同的,但对于每个类别,它都被标记为问号(?),即

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

我再次对其进行了预处理,string-to-word-vector,类别与训练数据的位置相同。

我进入“分类”菜单,加载我训练好的SVM模型,选择“提供的测试数据”,加载测试数据,然后右键点击模型说“在当前测试集上重新评估模型”,但它给了我一个错误,说测试和训练数据不兼容。我不确定为什么会这样。

我这样做来标记测试数据的方法是否正确?我做错了什么?


回答:

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

问题可能在于你独立地预处理了训练集和测试集,而StrintToWordVectorFilter会为每个集合创建不同的特征。因此,在训练集上训练的模型与测试集不兼容。

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

这个问题在Weka: ReplaceMissingValues for a test file中有讨论,但我在这里重复相关部分:

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

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

如果训练和测试必须在不同的运行或程序中进行,应该可以序列化初始化后的过滤器和模型。当你加载(反序列化)模型时,你也可以加载过滤器并将其应用于测试数据。现在它们应该兼容了。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注