与WEKA一起开发
我在哪里可以得到WEKA的源代码?
每个WEKA版本都附带一个包含完整源代码的JAR归档(这只是一个简单的ZIP归档)。它被称为weka-src.jar
。或者,你也可以从Subversion获得WEKA的源代码。
如何编译WEKA
你可以简单地使用任何(兼容Sun的)Java编译器编译源代码,也可以使用Ant或IDE。请查看关于编译WEKA的文章,其中包含指向更多文章的链接,这些文章涵盖了关于ANT和IDE的主题。
什么是Subversion?我需要做什么才能访问它
Subversion是我们现在对WEKA源代码使用的版本控制系统。有关如何访问存储库并从中检索源代码的更多信息,请参阅Subversion文章。
如何在我自己的代码中使用wekas类
在你自己的代码中使用WEKA类并不难,下面的文章很好地概述了如何做到这一点:
- 在Java代码中使用WEKA。
- 一般来说,标签为“源代码”的文章。
其他资源:
- 请查看Weka手册中使用API的章节(2009年9月8日之前的快照以及>3.6.1和>3.7.0的版本)。
- Weka Examples集合是一个ANT项目,可以通过快照和2009年9月8日之后的版本获得,其中包含大量的示例类。
注意:WEKA是GNU通用公共许可证下的开源软件,这意味着你的代码也必须按照GPL进行许可。
如何编写新的分类器或筛选器
基本上,分类器需要从weka.classfiers.classfier
派生,过滤器需要从weka.filters.Filter
派生,但这只是情况的一部分。以下文章更详细地介绍了新计划的发展:
如果你的方案不在通常的WEKA包之外,你需要让WEKA知道这个包,以便能够在GUI中使用它。请参阅如何添加新的分类器、过滤器、内核等?了解更多关于这方面的信息。
注意:这也包含在WEKA手册3.6.1/3.7.0以后的版本中的扩展WEKA一章,或者2010年10月1日以后的稳定3.6/Developer版本的快照中。此外,本章还介绍了聚类器、属性选择算法和关联器。
我可以将weka编译成本机代码吗?
是的,你有以下选项:
- Excelsior JET-将Java编译成本机代码的商业工具(Windows/Linux)。
- gcj-一个免费的跨平台工具,用于将Java编译成本机代码。
有关更多详细信息,请参阅使用gcj编译WEKA一文。
我可以使用C#中的WEKA吗?
可以。有关更多信息,请阅读在Microsoft.NET框架中使用WEKA一文。还有一个针对IKVM的教程可用。
我可以使用python中的weka吗?
是也不是。如果你正在从头开始,你可能想要考虑Jython,它是Python的重写,以便与Java无缝集成。缺点是,你只能使用Jython实现的库,而不能使用NumPy或SciPy等其他库。本文使用Jython中的WEKA解释了如何使用Jython中的WEKA类,以及如何在Jython中实现新的分类器,并用Jython实现了一个ZeroR示例。
一种利用javax.script
包(Java6中的新功能)的方法是Jepp,即Java Embedded Python。Jepp似乎具有与Jython相同的限制,不能导入Scipy或Numpy,但可以导入纯Python库。通过 JEPP使用 WEKA的弧线包含更多信息和示例。
另一种解决方案是从Python应用程序内部访问Java的JPype,但它还没有完全成熟。
最后,你可以使用python-weka-wrapper Python 2.7库来访问Weka(3.9.x)的大部分非GUI功能:
对于Python3,使用python-weka-wrapper3 Python库:
我可以使用groovy的weka吗?
可以。有关更多信息,请阅读从Groovy使用WEKA一文。本文将告诉你如何设置Groovy CLASSPATH,以便使WEKA类可供Groovy使用,并且还包含一些示例代码。
序列化很好,但是如何从weka类生成实际的java代码呢?
WEKA的一些方案支持基于其内部状态生成Java源代码。有关更多详细信息,请参阅从WEKA类生成源代码一文。
分类/回归的可插拔评估指标
WEKA3.7.8(以及WEKA开发者分支从2012年1月15日开始的每晚快照)有一种机制,允许将新的分类和回归评估指标添加为插件。新的指标将与WEKA的标准评估指标集一起,在命令行上生成的输出中输出,在资源管理器的分类面板中,并由知识流的分类器性能评估器组件进行输出。在命令行上生成的输出中,新的指标将与WEKA的标准评估指标集一起输出。此外,新的插件指标也可用于在实验台中进行分析。
以前,添加新的评估度量涉及编辑和重新编译单一的weka.classfiers.valuation类-即使在最好的情况下,这也是一项令人不寒而栗的工作。使用新的插件机制,可以很容易地添加新指标并通过包管理系统进行部署。如何为包管理系统构建包的“附加配置文件”部分?详细说明如何告诉PluginManager类有关新插件评估指标的信息。
类和接口
所有新指标的主要基类都是weka.classifiers.evaluation.AbstractEvaluationMetric
。该类要求具体的子类实现以下方法:
boolean appliesToNominalClass()
-如果此度量计算的统计信息适用于名义类问题,则为true。boolean appliesToNumericClass()
-如果此度量计算的统计信息适用于数值类问题,则为true。String getMetricName()
-返回指标的名称。String getMetricDescription()
-返回指标的简短描述。List
-返回此指标计算的统计信息列表(例如,“正确”的指标可能同时返回正确分类的数字和正确的百分比)。getStatisticNames() double getStatistic(String statName)
-获取命名统计的计算值。
为了便于计算统计数据,在第一次构造时,主valuation对象(他的类现在位于weka.classfiers.valuation中)将向所有插件指标传递对其自身的引用。因此,插件度量可以访问EVALUATION类中的所有受保护字段,并且可以在计算自己的统计数据时使用这些字段。
除了扩展AbstractEvaluationMetric
之外,插件指标还需要实现以下接口之一:
weka.classifiers.evaluation.StandardEvaluationMetric
接口的“标准”评估指标-即,将成为WEKA正常输出的一部分,而不必打开特定的显示选项。
它定义了以下方法。
String toSummaryString()
-返回一个格式化字符串(适合在控制台或GUI输出中显示),其中包含此指标计算的所有统计数据。void updateStatsForClassifier(double[] predictedDistribution, Instance instance)
-更新有关当前测试实例的分类器性能的统计信息。当类是名义类时调用。只有在无法根据基本评估对象中存储的内容计算其统计信息时,实现者才需要实现此方法。void updateStatsForPredictor(double predictedValue, Instance instance)
-更新有关当前测试实例的预测器性能的统计信息。当类是数值类时调用。只有在无法根据基本评估对象中存储的内容计算其统计信息时,实现者才需要实现此方法。
weka.classifiers.evaluation.InformationTheoreticEvaluationMetric
信息论评估指标要实施的接口。允许命令行界面根据用户提供的选项显示或不显示这些指标。
它定义了以下方法。
String toSummaryString()
-返回一个格式化字符串(适合在控制台或GUI输出中显示),其中包含此指标计算的所有统计数据。void updateStatsForClassifier(double[] predictedDistribution, Instance instance)
-更新有关当前测试实例的分类器性能的统计信息。当类是名义类时调用。只有在无法根据基本评估对象中存储的内容计算其统计信息时,实现者才需要实现此方法。void updateStatsForPredictor(double predictedValue, Instance instance)
-更新有关当前测试实例的预测器性能的统计信息。当类是数值类时调用。只有在无法根据基本评估对象中存储的内容计算其统计信息时,实现者才需要实现此方法。void updateStatsForConditionalDensityEstimator(ConditionalDensityEstimator classifier, Instance classMissing, double classValue)
-基于当前测试实例更新条件密度估计器的统计信息。当类为数值且分类器为ConditionalDensityEstimators时调用。只有在无法根据基本评估对象中存储的内容计算其统计信息时,实现者才需要实现此方法。
weka.classifiers.evaluation.InformationRetrievalMetric
要实现的信息检索评估指标的接口。允许命令行界面根据用户提供的选项显示或不显示这些指标。这些统计数据将在信息检索统计表中显示为新列。因此,不需要toSummaryString()格式的表示形式。
它定义了以下方法。
void updateStatsForClassifier(double[] predictedDistribution, Instance instance)
-更新有关当前测试实例的分类器性能的统计信息。当类是名义类时调用。只有在无法根据基本评估对象中存储的内容计算其统计信息时,实现者才需要实现此方法。double getStatistic(String name, int classIndex)
-获取给定类索引的命名统计的值。如果实现类扩展AbstractEvaluationMetric,则getStatistic(String StatName)的实现应该使用classIndex 0调用此方法。double getClassWeightedAverageStatistic(String statName)
-获取此统计信息的加权(按类)平均值。
weka.classifiers.evaluation.IntervalBasedEvaluationMetric
主要是要实施的基于间隔的评估指标的标记接口。允许命令行界面根据用户提供的选项显示或不显示这些指标。
它定义了以下方法。
String toSummaryString()
-返回一个格式化字符串(适合在控制台或GUI输出中显示),其中包含此指标计算的所有统计数据。void updateStatsForIntervalEstimator(IntervalEstimator classifier, Instance instance, double classValue)
-基于当前测试实例更新区间估计器的统计信息。只有在无法根据基本评估对象中存储的内容计算其统计信息时,实现者才需要实现此方法。
我能为WEKA做些什么呢?
关于如何为WEKA做贡献的信息可以在“如何为包管理系统构建包”的贡献包一节中找到。文章。新分类器(一般方案)的条件是,首先,它们必须在知名会议(例如,ICML)的论文集上发表,或者作为受人尊敬的期刊(例如,机器学习)的文章发表;第二,它们的性能优于其他标准方案(例如,J48/C4.5)。
但是请记住,我们没有很多人力,也就是说,做WEKA维护人员并不是一个全职的职位。