MOA(Massive Online Analysis)
背景
是waikato大学开发的一款java框架(用于数据分析,online training等数据分析)。
官网在这里
API在这里
其中作者是著名的aibet,然后这款框架配有GUI,而且也和yahoo实验室合作推出了MOA的研究平台SAMOA(不太作为框架而是作为软件使用)
0.3.0的API在这里
但个人觉得还是google查询api比在api网站里找快(网站不提供检索)。
而且两个库很多地方都是重叠相似的。
使用原因
有很多generator可以做实验!
有很多classifier,即使不太明白原理,也可以先调参测试,之后再搞懂原理,也剩下了自己实现原理算法的时间。
作为一个框架有很多值得学习的地方,也比自己从0开始写来的规范。
使用的困难
api基本介绍都很少,得靠函数名猜测含义,或者通过别人写的demo来确定含义。
自己的java水平有限
MOA的一般训练结构
确定Classifier训练器--->hoeffding tree
确定Source数据源--->RandomRBFGenerator
都prepareForUse()--->初始化内部参数
对于数据源每一个nextInstance()我们进行Classifier.trainOnInstance()
并且使用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要用到