2012-05-07 52 views
0

我正在使用Java来读取和处理来自UCI Machine Learning Repository的一些数据集。 我开始为每个数据集创建一个类并使用特定的类文件。数据集中的每个属性都由所需类型的类中的相应数据成员表示。这种方法运行良好,直到没有。属于< 10-15。我只是增加或减少了该类的数据成员,并将其类型更改为对新数据集建模。我还对功能进行了必要的更改。在Java中读取大量数据

问题: 现在我必须使用很多大型数据集。拥有20-30个属性的人对这种方式的工作非常乏味。我不需要查询。我的数据离散化算法只需要对数据进行4次扫描即可将其离散化。我的工作在离散化后立即结束。这将是一个有效的策略?

我希望我能够清楚地陈述我的问题。

+0

有些问题:1)您如何计划使用数据?如果你想查询或做类似的事情,可能数据库是你最好的选择。 2)你如何从存储库中获取数据? – javydreamercsw

+0

当你说大型数据集时,你是什么意思?数据的问题究竟是什么?你能提供一个例子吗? – Behe

+0

我正在测试一种新的数据离散化算法。为此,我需要读取数据并在Java中处理它 –

回答

1

创建一个包含类似下面的成员一个简单的DataSet类:

public class DataSet { 
    private List<Column> columns = new ArrayList<Column>(); 
    private List<Row> rows = new ArrayList<Row>(); 

    public void parse(File file) { 
     // routines to read CSV data into this class 
    } 
} 

public class Row { 
    private Object[] data; 

    public void parse(String row, List<Column> columns) { 
     String[] row = data.split(","); 
     data = new Object[row.length]; 

     int i = 0; 
     for(Column column : columns) { 
      data[i] = column.convert(row[i]); 
      i++; 
     } 
    } 
} 

public class Column { 
    private String name; 
    private int index; 
    private DataType type; 

    public Object convert(String data) { 
     if(type == DataType.NUMERIC) { 
      return Double.parseDouble(data); 
     } else { 
      return data; 
     } 
    } 
} 

public enum DataType { 
    CATEGORICAL, NUMERIC 
} 

这会处理任何数据集要使用。唯一的问题是用户必须定义​​数据集,方法是将数据列及其各自的数据类型定义到数据集。您可以在代码中执行此操作,也可以从文件中读取任何您认为更简单的内容。你可能能够默认很多配置数据(比如说CATEGORICAL),或者试图解析字段,如果失败它必须是CATEGORICAL,否则它的数字。通常情况下,该文件包含一个您可以解析的标题以查找列的名称,然后您只需查看该列中的数据即可确定数据类型。猜测数据类型的简单算法对于帮助您有很大的帮助。基本上,这是每隔一个包使用这种数据的完全相同的数据结构(例如R,Weka等)。

+0

非常感谢。这与我正在执行的实现最接近。似乎并非来自UCI Repo的所有文件都包含标题中的信息。我正在将我的离散数据集提供给Weka。这是一个很大的帮助! –

+0

并非UCI Repo中的所有数据集都有一个标题,但这可以是您为解析器提供的可配置参数。它是否有一个头文件,或者不是真正的只是你的解析器查找与否的参数。最后,标题只是简单的用户友好标签,用户可以使用它来引用列和配置数据集。如果它在那里解析人类友好的标签。如果不是F1,F2,F3等可以使用。你的用户必须提供信息,比如哪一列是预测,可能是数据类型(字符串,浮点数)等等。 – chubbsondubs

+0

谢谢。上面的代码只是一些小的更正 '公共无效解析(字符串行,列表列){ String [] cols = row.split(“,”); data = new Object [cols.length]; int i = 0; (列col:列){ data [i] = col.convert(cols [i]); i ++; } }' –

3

一些选项:

  1. 写代码生成器来读取文件的元数据,并生成等价类文件。
  2. 不要打扰类;将数据保存在ObjectString的数组中,并根据需要进行转换。
  3. 创建包含的DataElements和子DataElements您需要和使用元数据在运行时创建正确的类所有类型的集合类。
+0

谢谢。这为我开辟了新的学习途径。我从来没有像你正在谈论的代码生成器那样做。你能否提供一些指导我可以开始了解它的地方? –

+0

在这种情况下,您只需编写一个输出Java类文件的程序。有很多方法可以做到这一点,但基本上只是基于元数据打印出类骨架和成员变量,就像手动操作一样。 – dfb

0

我在我的一个项目中做过类似的事情;大量的可变数据,在我的情况下,我从互联网上获取数据。由于我需要查询,排序等,我花了一些时间设计数据库以适应数据的所有变化(并非所有条目都具有相同数量的属性)。它需要一段时间,但最终我使用相同的代码来获取任何条目的数据(在我的情况下使用JPA)。我的IDE(NetBeans)直接使用数据库模式创建了大部分代码。

从你的问题,目前还不清楚你打算如何使用数据,所以我回答基于个人经验。