MOA(Massive Online Analysis)
背景
是waikato大学开发的一款java框架(用于数据分析,online training等数据分析)。
其中作者是著名的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)
原文的举例
- 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要用到
联系方式:clarence_wu12@outlook.com