Weka manual 3.6翻译: 16.3 在内存中创建数据集

第十六章  Weka API 使用

16.3 在内存中创建数据集

从磁盘或数据库加载数据集不是Weka获取数据的唯一的方式:数据集可以在内存中创建或在运行时创建。生成数据集的存储结构(即weka.core.Instances 对象)是一个两阶段的过程:

1. 通过设置属性定义数据的格式。

2. 一行一行地添加实际数据。

WEKA实例集合[3]中的类wekaexamples.core.CreateInstances生成一个实例对象,该对象包含了Weka现在能处理的所有的属性类型。

16.3.1 定义格式

目前,在Weka中有五种不同类型的属性可用:

     数字 -连续变量

     日期 -日期变量

     标称 -预定义的标签

     字符串 -文本数据

     关系 -包含其他关系,例如,多实例数据的情况下的袋

对于所有不同的属性类型,WEKA使用同一类weka.core.Attribute ,但使用不同的构造函数。在下文中,对这些不同的构造函数进行说明。

     数字 -最容易创建的属性类型,因为它只需要属性的名称:

Attribute numeric = new Attribute("name_of_attr");

     日期 -在内部,日期属性处理的处理方式同数值属性,但为了正确地分析和呈现日期值,需要指定日期的格式。Java 文档 java.text.SimpleDateFormat 类详细解释了日期和时间的模式。在下文中,使用日期格式的年(4位数),月份(2位数)和天数(2位数)创建一个日期属性,它们由连字符分隔:

Attribute date = new Attribute("name_of_attr", "yyyy-MM-dd");

     标称 - 由于标称属性包含预定义的标签,标签存储在一个weka.core.FastVector 对象中,我们要预先提供这些

FastVector labels = new FastVector();
labels.addElement("label_a");
labels.addElement("label_b");
labels.addElement("label_c");
labels.addElement("label_d");

Attribute nominal = new Attribute("name_of_attr", labels) ;

     字符串 -与标称属性相反,此类型不存储预定义列表标签。通常用于存储文本数据,即,用于文本分类的文档内容。其使用与标称属性相同的构造函数,但要提供一个 null 值,而不是一个 FastVector 实例:

Attribute string = new Attribute("name_of_attr", (FastVector) null);

     关系 -这个属性只需要另一个 weka.core.Instances 对象在构造函数中定义关系结构。下面的代码片段生成一个关系属性,其包含有两个属性,一个数字和一个标称属性的关系:

FastVector atts = new FastVector();
atts.addElement(new Attribute("rel.num"));
FastVector values = new FastVector();
values.addElement("val_A");
values.addElement("val_B");
values.addElement("val_C");

atts.addElement(new Attribute("rel.nom", values));

Instances rel_struct = new Instances("rel", atts, 0) ;

Attribute relational = new Attribute("name_of_attr", rel_struct);

一个 weka.core.Instances 对象,通过提供一个包含所有属性对象的 FastVector 对象来创建下面的示例创建一个带有两个数字属性和标称类属性(两个标签)的数据集:

Attribute num1 = new Attribute("num1");

Attribute num2 = new Attribute("num2");
FastVector labels = new FastVector(); 

labels.addElement("no");
labels.addElement("yes");

Attribute cls = new Attribute("class", labels);
FastVector attributes = new FastVector();

attributes.addElement(num1);
attributes.addElement(num2);
attributes.addElement(cls);

Instances dataset = new Instances("Test-dataset", attributes, 0) ;

在上面的 Instances 构造函数的最后一个参数告诉Weka该保留多少内存给即将到来的 weka.core.Instances对象。如果事先知道多少行将会被添加到数据集,那么它应该被指定,这样节省了今后昂贵的开辟内存的操作。如果是想要添加大量的行,没关系,使用compactify() 方法始终是可以再次 修剪(trim) 数据集的。

16.3.2 添加数据

数据集的结构定义之后,就可以给它添加实际数据,一行接一行。基本上, weka.core.Instances 类有两个构造函数可以用于此目的:

     Instance(double weight, double[] attValues)生成一个 Instance 对象,该对象拥有给定的权重和double值。 Weka的内部格式为所有属性类型使用double值。对于标称,字符串和关系属性,这仅仅是一个存储值的索引。

     Instance(int numAttributes) 生成一个新的Instance 对象,该对象拥有权重1.0,并且没有任何值。

第二个构造函数可能更容易使用,但通过 Instance 类的方法设置值开销大点,特别是如果要加入了大量的行。因此,下面的代码示例涵盖(cover)了第一个构造函数。为简单起见, 这里使用上面使用过的Instances 对象data 其基于之前介绍不同属性所使用的代码片段,因为它包含了所有可能的属性类型。

对于每个实例,第一步骤是创建一个新的double数组来保存属性值。不要重复使用这个数组,而是总是创建一个新的,这很重要。因为当实例化Instance对象时,Weka只引用它,不创建它的一个副本。重用意味着改变之前生成的 Instance 对象

double[] values = new double[data.numAttributes()];

然后,为double数组填充实际值:

     数字 -只要设置数值:

values[0] = 1.23 ;

     日期 -将日期字符串转换成一个double值:

values[1] = data.attribute(1).parseDate("2001-11-09");

     标称 -决定了标签索引值:

values[2] = data.attribute(2).indexOf("label_b");

字符串 -决定了字符串的索引值,使用 addStringValue 方法(在内部,一个Hashtable保存所有的字符串值):

values[3] = data.attribute(3).addStringValue("This is a string");

     关系 -首先,在确定索引之前,要创建一个新的,基于其属性关系定义的 Instances 对象,使用 addRelation 方法:

Instances dataRel = new Instances(data.attribute(4).relation(),0);
valuesRel = new double[dataRel.numAttributes()];
valuesRel[0] = 2.34 ;

valuesRel[1] = dataRel.attribute(1).indexOf("val_C");
dataRel.add(new Instance(1.0, valuesRel));
values[4] = data.attribute(4).addRelation(dataRel);

最后,通过初始化double数组,一个Instance对象生成了,并添加到数据集:

Instance inst = new Instance(1.0, values);
data.add(inst);

-----------------------------------------------------------------------------------------------------


译得不是很顺,原文去Weka手册中找对应的章节,
 也可访问Google Drive查看: https://docs.google.com/document/d/1kdXGdG3lhxvIXjuqX4YpaFNwxyN4MVZD4x0jFqLRl2k/edit

 

转载于:https://my.oschina.net/leopardsaga/blog/91000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值