【问题标题】:Predicting text data labels in test data set with Weka?使用 Weka 预测测试数据集中的文本数据标签?
【发布时间】:2013-03-04 13:35:09
【问题描述】:

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

@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 模型,选择“提供的测试数据”,加载测试数据并右键单击模型,显示“在当前测试集上重新评估模型”,但它给我测试和训练不兼容的错误。我不知道为什么。

我是否以错误的方式标记测试数据?我做错了什么?

【问题讨论】:

    标签: machine-learning weka


    【解决方案1】:

    对于几乎任何机器学习算法,训练数据和测试数据都需要具有相同的格式。这意味着,两者必须具有相同的特征,即 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 将初始化的过滤器与模型一起使用。当您加载(反序列化)模型时,您还可以加载过滤器并将其应用于测试数据。它们现在应该兼容了。

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 2016-08-01
      • 2016-01-25
      • 2018-03-18
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      相关资源
      最近更新 更多