如何在Weka中使用创建的模型和新数据

时间:2016-10-24 17:07:11

标签: java weka

我正在尝试对weka进行一些测试,希望有人可以帮助我,我可以让自己清楚。

第1步:对我的数据进行标记

@attribute text string
@attribute @@class@@ {derrota,empate,win}

@data
'O Grêmio perdeu para o Cruzeiro por 1 a 0',derrota
'O Grêmio venceu o Palmeiras em um grande jogo de futebol, nesta quarta-feira na Arena',vitoria

第2步:在标记化数据上构建模型

加载后我应用StringToWordVector。应用此过滤器后,我保存一个新的arff文件,其中包含单词tokenized。像...这样的东西。

@attribute @@class@@ {derrota,vitoria,win}
@attribute o numeric
@attribute grêmio numeric
@attribute perdeu numeric
@attribute venceu numeric
@ and so on .....

@data
{0 derrota, 1 1, 2 1, 3 1, 4 0, ...}
{0 vitoria, 1 1, 2 1, 3 0, 4 1, ...}

确定!现在基于这个arff我构建我的分类器模型并保存它。

第3步:使用“模拟新数据”进行测试

如果我想用“模拟新数据”来测试我的模型,我实际上正在编辑这个最后一个arff并制作一行像

{0?,1 1,2 1,2 1,3 1,...}

第4步(我的问题):如何使用真正的新数据进行测试

到目前为止一切顺利。我的问题是当我需要将这个模型与“真正的”新数据一起使用时。 例如,如果我有一个字符串“OGrêmiocaiudiante do Palmeiras”。我有4个新单词,在我的模型中不存在,2个存在。

如何使用可以在我的模型中拟合的新数据创建一个arff文件? (好吧,我知道4个新单词不会出现,但我怎么能用它?)

提供不同的测试数据后,将显示以下消息

enter image description here

1 个答案:

答案 0 :(得分:1)

如果您以编程方式使用Weka,那么您可以相当轻松地完成此任务。

  • 创建您的培训文件(例如training.arff)
  • 从培训文件创建实例。 Instances trainingData = ..
  • 使用 StringToWordVector 将字符串属性转换为数字表示形式:

示例代码:

    StringToWordVector() filter = new StringToWordVector(); 
    filter.setWordsToKeep(1000000);
    if(useIdf){
        filter.setIDFTransform(true);
    }
    filter.setTFTransform(true);
    filter.setLowerCaseTokens(true);
    filter.setOutputWordCounts(true);
    filter.setMinTermFreq(minTermFreq);
    filter.setNormalizeDocLength(new SelectedTag(StringToWordVector.FILTER_NORMALIZE_ALL,StringToWordVector.TAGS_FILTER));
    NGramTokenizer t = new NGramTokenizer();
    t.setNGramMaxSize(maxGrams);
    t.setNGramMinSize(minGrams);    
    filter.setTokenizer(t);  
    WordsFromFile stopwords = new WordsFromFile();
    stopwords.setStopwords(new File("data/stopwords/stopwords.txt"));
    filter.setStopwordsHandler(stopwords);
    if (useStemmer){
        Stemmer s = new /*Iterated*/LovinsStemmer();
        filter.setStemmer(s);
    }
    filter.setInputFormat(trainingData);
  • 将过滤器应用于trainingData:trainingData = Filter.useFilter(trainingData, filter);

  • 选择分类器以创建模型

LibLinear分类器的示例代码

        Classifier cls = null;
        LibLINEAR liblinear = new LibLINEAR();
        liblinear.setSVMType(new SelectedTag(0, LibLINEAR.TAGS_SVMTYPE));
        liblinear.setProbabilityEstimates(true);
        // liblinear.setBias(1); // default value
        cls = liblinear;
        cls.buildClassifier(trainingData);
  • 保存模型

示例代码

    System.out.println("Saving the model...");
    ObjectOutputStream oos;
    oos = new ObjectOutputStream(new FileOutputStream(path+"mymodel.model"));
    oos.writeObject(cls);
    oos.flush();
    oos.close();
  • 创建测试文件(例如testing.arff)

  • 从培训文件创建实例:Instances testingData=...

  • 加载分类器

示例代码

Classifier myCls = (Classifier) weka.core.SerializationHelper.read(path+"mymodel.model");
  • 使用与上面相同的StringToWordVector过滤器或为testingData创建一个新过滤器,但请记住对此命令使用trainingData:filter.setInputFormat(trainingData); 这将保留训练集的格式,不会添加不在训练集中的单词。

  • 将过滤器应用于testingData:testingData = Filter.useFilter(testingData, filter);

  • 分类<!/ p>

示例代码

 for (int j = 0; j < testingData.numInstances(); j++) {
    double res = myCls.classifyInstance(testingData.get(j));
 }
  1. 不确定是否可以通过GUI完成。
  2. 保存和加载步骤是可选的。
  3. 编辑:经过Weka GUI的一些挖掘后,我认为可以做到这一点。在 classify 选项卡中,在 Supply测试集字段中设置测试集。之后,您的套装通常应该是不兼容的。要解决此问题,请在以下对话框中单击“是”

    enter image description here

    你很高兴。