gpt4 book ai didi

java - 使用 weka jar 在 java 代码中加载朴素贝叶斯模型

转载 作者:行者123 更新时间:2023-12-01 17:59:55 24 4
gpt4 key购买 nike

我使用了 weka 并通过使用 weka GUI 制作了朴素贝叶斯分类器。然后我按照这个 tutorial 保存了这个模型。现在我想通过Java代码加载这个模型,但我找不到任何方法来使用weka加载保存的模型。

这是我的要求,我必须单独制作模型,然后在单独的程序中使用它。

如果有人能在这方面指导我,我将非常感激。

最佳答案

您可以使用以下命令轻松加载 Java 中保存的模型:

Classifier myCls = (Classifier) weka.core.SerializationHelper.read(pathToModel);

对于 Java 中的完整工作流程,我在 SO 文档中编写了以下文章,现在复制到此处:

Weka 中的文本分类

使用 LibLinear 进行文本分类

  • 从 .arff 文件创建训练实例

    private static Instances getDataFromFile(String path) throws Exception{

    DataSource source = new DataSource(path);
    Instances data = source.getDataSet();

    if (data.classIndex() == -1){
    data.setClassIndex(data.numAttributes()-1);
    //last attribute as class index
    }

    return data;
    }
<小时/>
Instances trainingData = getDataFromFile(pathToArffFile);
  • 使用StringToWordVector将字符串属性转换为数字表示形式:

    • 此过滤器的重要功能:

      1. tf-idf 表示
      2. 词干提取
      3. 小写单词
      4. 停用词
      5. n 元语法表示*

     

    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 分类器

      1. 下面的 SVMType 0 对应于 L2 正则化逻辑回归
      2. 设置setProbabilityEstimates(true)以打印输出概率

        分类器 cls = null;
        LibLINEAR liblinear = new LibLINEAR();
        liblinear.setSVMType(new SelectedTag(0, LibLINEAR.TAGS_SVMTYPE));
        liblinear.setProbabilityEstimates(true);
        //liblinear.setBias(1);//默认值
        cls=lib线性;
        cls.buildClassifier(trainingData);

    • 保存模型

      System.out.println("正在保存模型...");
      对象输出流 oos;
      oos = new ObjectOutputStream(new FileOutputStream(path+"mymodel.model"));
      oos.writeObject(cls);
      oos.flush();
      oos.close();

    • .arff 文件创建测试实例

      实例trainingData = getDataFromFile(pathToArffFile);

    • 加载分类器

    分类器 myCls = (分类器) weka.core.SerializationHelper.read(path+"mymodel.model");

    • 使用与上面相同的 StringToWordVector 过滤器或为testingData 创建一个新过滤器,但请记住为此命令使用trainingData:filter.setInputFormat(trainingData); 这将使训练和测试实例兼容。或者,您可以使用InputMappedClassifier

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

    • 分类!

    1.获取测试集中每个实例的类值

    for (int j = 0; j res 是一个 double 值,对应于 .arff 文件中定义的标称类。要获取标称类,请使用: testintData.classAttribute().value((int)res)

<小时/>

2.获取每个实例的概率分布

 for (int j = 0; j < testingData.numInstances(); j++) {
double[] dist = first.distributionForInstance(testInstances.get(j));
}

dist 是一个 double 组,其中包含 .arff 文件中定义的每个类的概率

注意。分类器应支持概率分布并通过以下方式启用它们:myClassifier.setProbabilityEstimates(true);

关于java - 使用 weka jar 在 java 代码中加载朴素贝叶斯模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41821762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com