该package的主要目标是将外部存在的各种各式的数据与weka内部的数据表示进行相互转换,以解决数据的导入导出问题。主要含有Loader和Saver,一个负责加载,一个负责导出。
1. Loader及其继承体系
Loader的继承体系如下:
Loader是个Interface,其接口定义如下:
Loader定义了3种数据加载的模式常量,NONE/BATCH/INCREMENTAL。另外,定义了设置2种类型的数据源,File/InputStream的方法。获取Header的方法getStructure和实际数据的方法getDataSet;和获取下一行数据的方法getNextInstance
1.1 AbstractLoader
提供了所有Loader的默认实现,内部定义了m_retrieval field,用来保存Loader中定义的三种retrieval模式之一。对2个setSource方法提供了默认实现,该实现直接抛出异常,避免子类误用,这2个方法是为基于File的Loader子类设置的。
AbstractFileLoader是所有基于File的Loader的父类,其定义了如下fields:
field name | 作用 | 备注 |
---|---|---|
m_File | CWD,当前工作路径 | |
m_structure | 解析后的header | |
m_sourceFile | 存储数据的文件 | |
m_useRelativePath | 如何解释m_sourceFile的路径 | |
m_env | 用来将形如”${}”的变量替换成实际值 | 以增加系统的可移植性 |
1.2 AbstractFileLoader的子类
所有File-based Loader的实现:
Class | 职责 | 备注 |
---|---|---|
ArffLoader | 加载Arff格式文件 | |
XRFFLoader | 加载XML形式的Arff文件 | |
C45Loader | 加载C4.5格式的文件 | .names和.data文件分开 |
CSVLoader | CSV格式的文件 | |
JSONLoader | JSON格式的文件 | |
LibSVMLoader | 加载LibSVM需要的格式文件 | 参见libSVM网站 |
SVMLightLoader | 加载svm light格式的文件 | 参见svmLight网站 |
MatlabLoader | 加载Matlab格式文件 | |
SerializedInstancesLoader | 加载java ObjectStream序列化之后的Instances |
1.3 DatabaseLoader
基于JDBC的,从数据库中加载数据的Loader子类。
1.3.1 fields
DatabaseLoader的field主要含有如下几类:
1. 与数据库connection相关的属性,m_URL、m_User、m_Password、m_CustomPropsFile
2. 读取模式控制字段,m_pseudoIncremental(实际是批量加载到内存,但是对weka是透明的)、m_checkForTable、m_nominalToStringLimit
3. 读取表数据时用到查询和字段,m_query、m_Keys、m_orderBy、m_idColumn、
4. 读取过程中的状态数据,m_firstTime、m_counter
5. 读取到的结果数据,m_structure、m_datasetPseudoInc、m_oldStructure、m_nominalStrings
1.3.2 methods
这里需要注意的是,DatabaseLoader并没有override AbstractLoader中的setSource(File)和setSource(InputStream)方法,因为它是从数据库中加载,不是面向File和InputStream的,这也是AbstractLoader中为这2个方法提供的默认实现都直接throw exeption的原因——避免DatabaseLoader这样的子类误用这些方法。
DataBase中的数据类型到不同type的Attribute之间的映射关系如下,参见readInstance(ResultSet)方法:
DataBase Type | Attribute Type | 备注 |
---|---|---|
STRING | String/Nominal | 实际Instance中存储码值,int类型,具体String还是nominal,受参数nominalToStringLimit参数控制,超过该值weka认为是取值过多,是String类型 |
TEXT | String/Nominal | |
BOOL | Nominal | true:1.0,false:0.0 |
BYTE | Numeric | up cast to double |
SHORT | Numeric | up cast to double |
INTEGER | Numeric | up cast to double |
LONG | Numeric | up cast to double |
DATE | Date | 存储Date.getTime()值 |
TIME | Date | 存储Time.getTime()值 |
1.4 TextDirectoryLoader
从一个含有text文件的目录中加载Arff文件的AbstractLoader的实现类。由于用的不多,不做过多分析。
1.4.1 fields
1.4.2 methods
2 Saver
Saver的继承体系如下,可以看出,基本与Loader的继承体系一一对应。
同Loader理,Save也定义了3种写入模式,NONE/BATCH/INCREMENTAL,该模式会影响写入的执行过程。Loader接口还定义set写入目的地的基于File和Stream的方法,以及关键的执行写入的writeBatch和writeIncremental方法。
2.1 AbstractSaver
2.1.1 fields
2.1.2 methods
略过
3 Capability
算法和数据的适应性能力匹配的类。
Capabilities内部定义了一个Enum,用来枚举可供检测的Capability,如果不匹配,应该Fail-Fast。