使用 weka jar 在 java 代码中加载朴素贝叶斯模型
Load Naïve Bayes model in java code using weka jar
我使用了 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 将字符串属性转换为数字表示:
此过滤器的重要功能:
- tf-idf表示法
- 词干提取
- 小写单词
- 停用词
- n-gram表示法*
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 = Filter.useFilter(trainingData, filter);
创建 LibLinear 分类器
- 下面的SVMType 0对应L2正则化逻辑回归
设置setProbabilityEstimates(true)
打印输出概率
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();
从 .arff
文件创建测试实例
实例 trainingData = getDataFromFile(pathToArffFile);
加载classifier
Classifier myCls = (Classifier) weka.core.SerializationHelper.read(path+"mymodel.model");
使用与上面相同的 StringToWordVector 过滤器或为 testingData 创建一个新过滤器,但请记住为该命令使用 trainingData:filter.setInputFormat(trainingData);
这将使训练和测试实例兼容。
或者你可以使用 InputMappedClassifier
将过滤器应用于测试数据:testingData = Filter.useFilter(testingData, filter);
分类!
1.Get 测试集中每个实例的 class 值
for (int j = 0; j < testingData.numInstances(); j++) {
双 res = myCls.classifyInstance(testingData.get(j));
}
res
是一个双精度值,对应于 .arff
文件中定义的名义 class。要获得名义上的 class 使用:testintData.classAttribute().value((int)res)
2.Get每个实例的概率分布
for (int j = 0; j < testingData.numInstances(); j++) {
double[] dist = first.distributionForInstance(testInstances.get(j));
}
dist
是一个双精度数组,其中包含 .arff
文件
中定义的每个 class 的概率
注。分类器应支持概率分布并启用它们:myClassifier.setProbabilityEstimates(true);
我使用了 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 将字符串属性转换为数字表示:
此过滤器的重要功能:
- tf-idf表示法
- 词干提取
- 小写单词
- 停用词
- n-gram表示法*
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 = Filter.useFilter(trainingData, filter);
创建 LibLinear 分类器
- 下面的SVMType 0对应L2正则化逻辑回归
设置
setProbabilityEstimates(true)
打印输出概率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();
从
.arff
文件创建测试实例实例 trainingData = getDataFromFile(pathToArffFile);
加载classifier
Classifier myCls = (Classifier) weka.core.SerializationHelper.read(path+"mymodel.model");
使用与上面相同的 StringToWordVector 过滤器或为 testingData 创建一个新过滤器,但请记住为该命令使用 trainingData:
filter.setInputFormat(trainingData);
这将使训练和测试实例兼容。 或者你可以使用InputMappedClassifier
将过滤器应用于测试数据:
testingData = Filter.useFilter(testingData, filter);
分类!
1.Get 测试集中每个实例的 class 值
for (int j = 0; j < testingData.numInstances(); j++) { 双 res = myCls.classifyInstance(testingData.get(j)); }
res
是一个双精度值,对应于.arff
文件中定义的名义 class。要获得名义上的 class 使用:testintData.classAttribute().value((int)res)
2.Get每个实例的概率分布
for (int j = 0; j < testingData.numInstances(); j++) {
double[] dist = first.distributionForInstance(testInstances.get(j));
}
dist
是一个双精度数组,其中包含 .arff
文件
注。分类器应支持概率分布并启用它们:myClassifier.setProbabilityEstimates(true);