Weka manual 3.6翻译: 16.2 数据载入

蹲街弑〆低调 提交于 2020-03-01 10:30:36

最近谷歌译员访问很是不顺,翻译只能先放着了 
这篇的格式也不调了,每次粘贴过来都要手动调整格式,太累了,也不知是我格式的问题还是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对象(见方法 datasetsetDatasetweka.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) 方法(以逗号分隔的列)提供必要的列

      如果不能以增量方式检索数据,它是首先完全加载到内存中,然后一行一行提供(“伪增量”)。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!