机器学习工具Weka 使用已知进行实时预测

来源:互联网 发布:手机淘宝订单无故消失 编辑:程序博客网 时间:2024/06/06 02:28

本文使用Weka的classifyInstance和已知的机器学习模型来对数据进行实时预测

对数据进行实时预测一般有以下几个要点:

1、自己根据属性构建instance实例。

2、调用之前已经训练的模型,调用时需要将模型强制转变为模型机器学习类型,如NaiveBayes的模型需要这样操作。

Classifier m_Classifier = (NaiveBayes)SerializationHelper.read(new FileInputStream("model/bayes.model"));

以下是本文构建的Weka实时预测功能:

本实例中instance具有四个属性,第一个为double属性,第二个是double属性,第三个是Nominal类型,第四个是Class类型(预测值)。

:本文中使用的模型可以使用Weka图形界面操作生成。

代码思路:

首先,构建一个instances结构,构建instances具有什么样的属性;其次,指定instances的类别索引,即指定哪个属性代表的是类别。之后,构建instance实例,将instances的结构框架指定为instance的数据集,给instance赋值,此处传值时不需要传入Class值,因为这是我们要预测的;最后,使用已知模型的classifyInstance方法对instance进行预测,再根据预测出的索引得到预测类别的值。

以下是编写的Weka实时预测代码:

import java.io.FileInputStream;import java.io.FileNotFoundException;import weka.classifiers.Classifier;import weka.classifiers.bayes.NaiveBayes;import weka.core.Attribute;import weka.core.FastVector;import weka.core.Instance;import weka.core.Instances;import weka.core.SerializationHelper;public class WekaTestInstance {Instances m_Data = null;Classifier m_Classifier = null;public WekaTestInstance() throws FileNotFoundException, Exception{m_Classifier = (NaiveBayes)SerializationHelper.read(new FileInputStream("model/bayes.model"));String nameOfDataset = "messDataset";FastVector attributes = new FastVector();attributes.addElement(new Attribute("aa"));attributes.addElement(new Attribute("bb"));FastVector fvNominalVal = new FastVector(3);fvNominalVal.addElement("blue");fvNominalVal.addElement("gray");fvNominalVal.addElement("black");attributes.addElement(new Attribute("Nominal", fvNominalVal));FastVector classValues = new FastVector(2);classValues.addElement("pos");classValues.addElement("neg");attributes.addElement(new Attribute("Class", classValues));m_Data = new Instances(nameOfDataset, attributes, 10);m_Data.setClassIndex(m_Data.numAttributes()-1);}public void classifyMessage(double aa,double bb,String nominal) throws Exception {Instances testset = m_Data.stringFreeStructure();Instance instance = makeInstance(aa,bb,nominal,testset);System.out.println(m_Data.numAttributes());System.out.println(instance);double predicted = m_Classifier.classifyInstance(instance);System.out.println("predicted:"+predicted);System.out.println("Message classified as : " +m_Data.classAttribute().value((int)predicted));}private Instance makeInstance(double aa,double bb,String nominal,Instances data) {Instance instance = new Instance(4);instance.setDataset(data);Attribute aaAtt = data.attribute("aa");Attribute bbAtt = data.attribute("bb");Attribute nominalAtt = data.attribute("Nominal");instance.setValue(aaAtt, aa);instance.setValue(bbAtt, bb);instance.setValue(nominalAtt, nominal);//instance.setValue((Attribute)instance.attribute(0), aa);//instance.setValue((Attribute)instance.attribute(1), bb);//instance.setValue((Attribute)instance.attribute(2),nominal);return instance;}public static void main(String[] args) throws Exception {WekaTestInstance wTestInstance = new WekaTestInstance();wTestInstance.classifyMessage(5.6,9.9,"gray");}}



0 0