最近谷歌译员访问很是不顺,翻译只能先放着了
这篇的格式也不调了,每次粘贴过来都要手动调整格式,太累了,也不知是我格式的问题还是OSC博客的问题
看不顺的话可以点这,会好些。
16.2 数据载入
在任何过滤器,分类的聚类器可以应用之前,数据必须存在。Weka能从文件(各种格式的文件)和从数据库中加载数据。在后者的情况下,假定在该数据库连接设置和工作。如何正确配置Weka与JDBC(Java数据库连接)URL的详细信息,请参阅第13章详细说明。
若要使用本节中介绍的功能, wekaexamples.core.converters 包的 WEKA实例 集合有例子。
下面的一些类用于在内存中存储数据:
• weka.core.Instances-拥有一个完整的数据集。这个数据结构是基于行的;单一的行可以通过从0开始索引的instance(int) 方法获得。有关列的信息可以通过attribute(int)方法获得。此方法返回 weka.core.Attribute对象(见下文)。
• weka.core.Instance。-封装了一个单行。它基本上是一个双原语数组的包装。因为这个类不包含关于列的类型的任何信息,它总是需要访问weka.core.Instances对象(见方法 dataset 和 setDataset 。weka.core.SparseInstance 类在稀疏数据的情况下使用。
• weka.core.Attribute -拥有数据集中单个列的类型信息。它存储属性的类型,以及标称属性的标签,字符串属性可能的值或关系属性的数据集(这些也都是weka.core.Instances对象)。
16.2.1 从文件加载数据
当从文件加载数据时,可以让WEKA根据文件的扩展名选择合适的加载器(可用的加载器在 weka.core.converters 包中),或可以直接使用正确的装载机。如果文件没有正确的扩展名,应使用后一种方法。
DataSource类(内部类的 weka.core.converters的。ConverterUtils 类),可用于有适当的文件扩展名的文件中读取数据。{0}下面是一些例子:{/0}
import weka.core.converters.ConverterUtils.DataSource; import weka.core.Instances; ...
Instances data1 = DataSource.read("/some/where/dataset.arff");
Instances data2 = DataSource.read("/some/where/dataset.csv");
Instances data3 = DataSource.read("/some/where/dataset.xrff");
如果文件没有一个与加载器关联的特殊扩展名,则要直接使用加载器。下面的示例加载一个CSV(逗号分隔值)文件:
import weka.core.converters.CSVLoader;
import weka.core.Instances; import java.io.File; ...
CSVLoader loader = new CSVLoader();
loader.setSource(new File("/some/where/some.data"));
Instances data = loader.getDataSet();
注意: 不是所有的文件格式都可以存储关于类属性的信息(例如,ARFF不存储类属性的信息,但XRFF存储)。今后,如果一个类属性是必需的,例如,当使用一个分类器,可以通过 setClassIndex(int) 方法设置:
// 使用第一属性作为类属性 if (data.classIndex() == -1) data.setClassIndex(0); ...
//使用最后一个属性作为类属性 if(data.classIndex()== -1)
data.setClassIndex(data.numAttributes() - 1) ;
16.2.2 加载数据库中的数据
对于从数据库中加载数据,可以使用下面的两个类之一:
• weka.experiment.InstanceQuery
• weka.core.converters.DatabaseLoader
它们之间的差异是, InstanceQuery 类允许检索稀疏数据而 DatabaseLoader 可以增量地检索数据。
下面是一个使用 InstanceQuery 类的:
import weka.core.Instances; import weka.experiment.InstanceQuery; ...
InstanceQuery query = new InstanceQuery(); query.setDatabaseURL("jdbc_url"); query.setUsername("the_user"); query.setPassword("the_password");
query.setQuery("select * from whatsoever");
/ /如果你的数据是稀疏的,那么你可以这样写:
// query.setSparseData(true);
Instances data = query.retrieveInstances();
使用DatabaseLoader类“批处理检索“的一个例子:
import weka.core.Instances;
import weka.core.converters.DatabaseLoader; ...
DatabaseLoader loader = new DatabaseLoader(); loader.setSource("jdbc_url", "the_user", "the_password"); loader.setQuery("select * from whatsoever");
Instances data = loader.getDataSet();
DatabaseLoader 在“增量模式”使用如下:
import weka.core.Instance;
import weka.core.Instances; import weka.core.converters.DatabaseLoader; ...
DatabaseLoader loader = new DatabaseLoader(); loader.setSource("jdbc_url", "the_user", "the_password"); loader.setQuery("select * from whatsoever");
Instances structure = loader.getStructure();
Instances data = new Instances(structure);
Instance inst;
while ((inst = loader.getNextInstance(structure)) != null) data.add(inst);
注:
• 不是所有的数据库系统都允许增量检索。
• 并非所有的查询都具有一个唯一的key用于增量检索。在这种情况下,可以用setKeys(String) 方法(以逗号分隔的列)提供必要的列 。
• 如果不能以增量方式检索数据,它是首先完全加载到内存中,然后一行一行提供(“伪增量”)。
来源:oschina
链接:https://my.oschina.net/u/225435/blog/91789