MOA(Massive Online Analysis)

背景

是waikato大学开发的一款java框架(用于数据分析,online training等数据分析)。

官网在这里
API在这里

其中作者是著名的aibet,然后这款框架配有GUI,而且也和yahoo实验室合作推出了MOA的研究平台SAMOA(不太作为框架而是作为软件使用)
0.3.0的API在这里
但个人觉得还是google查询api比在api网站里找快(网站不提供检索)。

而且两个库很多地方都是重叠相似的。

使用原因

  1. 有很多generator可以做实验!
  2. 有很多classifier,即使不太明白原理,也可以先调参测试,之后再搞懂原理,也剩下了自己实现原理算法的时间。
  3. 作为一个框架有很多值得学习的地方,也比自己从0开始写来的规范。

使用的困难

  1. api基本介绍都很少,得靠函数名猜测含义,或者通过别人写的demo来确定含义。
  2. 自己的java水平有限

MOA的一般训练结构

  1. 确定Classifier训练器--->hoeffding tree
  2. 确定Source数据源--->RandomRBFGenerator
  3. 都prepareForUse()--->初始化内部参数
  4. 对于数据源每一个nextInstance()我们进行Classifier.trainOnInstance()
  5. 并且使用Classifier.correctlyClassifies()来判断是否正确classifiy

MOA + publisher/subscriber的结构

  • 将source数据源作为publisher ----->来发布数据
  • 将trainClassifier训练器作为中间的processor(数据源的subscriber,下面evaluateClassifier的publisher) ----->来训练数据
  • 将evaluateClassifier评估器作为最后的subscriber ----->来计算准确率
  • source---->trainClassifier---->evaluateClassifer

JAVA的IO类:

  • InputStream
  • BufferedReader
  • StringTokenizer

MOA的常见类

数据源类

  • InstanceStream 数据流
    • 继承于ExampleStream
    • 常见函数:
      • estimatedRemainingInstances()
      • hasMoreInstances()
      • nextInstance() ---> 返回Instance
      • restart()
  • Instance 单个数据
    • 获取值: .getData().value(0)
    • 获取代表的dataset: .getData().dataset()

神奇的option类

很多option是com.github.javacliparser类里面的,MOA也创造了自己的ClassOption来给classifer加属性。

  • IntOption
    • IntOption (name, char, purpose, defaultValue, min Value, max Value)
  • FlagOption
    • FlagOption (name, char, purpose)
  • FileOption
    • FileOption (name, char, purpose, default Filename, default File extension, Output)
  • StringOption
    • StringOption (name, char, purpose, defaultValue)
  • ClassOption
    • ClassOption (name, char, purpose, requiredtype, default CLI string)
      原文的举例
public IntOption gracePeriodOption = new
      IntOption(
      "gracePeriod",
      ’g’,
      "The number of instances a leaf should
      observe between split attempts.",
      200, 0, Integer.MAX_VALUE);
public ClassOption splitCriterionOption = new
      ClassOption("splitCriterion",
      ’s’, "Split criterion to use.",
      SplitCriterion.class,
      "InfoGainSplitCriterion");
public FloatOption splitConfidenceOption = new
      FloatOption(
      "splitConfidence",
      ’c’,
      "The allowable error in split decision,
      values closer to 0 will take longer
      to decide.",
      0.0000001, 0.0, 1.0);
public FlagOption binarySplitsOption = new
      FlagOption("binarySplits", ’b’,
      "Only allow binary splits.");Using the API 223
public FileOption dumpFileOption = new
      FileOption("dumpFile", ’d’,
      "File to append intermediate csv
      results to.", null, "csv", true);
public StringOption xTitleOption = new
      StringOption("xTitle", ’m’,
      "Title of the plots’ x-axis.",
      "Processed instances");

想要改变上面option里面的值

• Integer: setValue(int v)
• Float: setValue(double v)
• Flag: setValue(boolean v)
• File: setValue(String v)
• String: setValue(String v)
• Multichoice: setChosenIndex(int index)
• Class: setCurrentObject(Object obj)
• List: setList(Option[] optList)

想要获取option里面的值

• Integer: getValue()
• Float: getValue()
• Flag: isSet()
• File: getFile() 
• String: getValue()
• Multichoice: getChosenIndex()
• Class: getPreparedClassOption(ClassOption classOption)
• List: getList()

使用CLIString对Option设定的set/get设定作为CLIString操作:

getValueAsCLIString()
setValueViaCLIString(String s)

对于CLIString我们可以切割获取自己想要的名字

String[] tmpOptions = weka.core.Utils.splitOptions(CLIString);

可以通过classOption.getPreMaterializedObject()来获得自己想要的moa类(比如InstanceStream)

InstanceStream actualGenerator = (InstanceStream) generator.getPreMaterializedObject();

AbstractOptionHandler类

里面有prepareForUse(),这是moa里面几乎所有类的初始化都要用到的(都继承了这个类)。
比如: InstanceStream要用到,Classifier要用到