0

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

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

我希望我能够清楚地说明我的问题。

4

3 回答 3

3

一些选项:

  1. 编写代码生成器来读取文件的元数据并生成等效的类文件。
  2. 不要为上课而烦恼;将数据保存在 or 的数组中,ObjectString根据需要进行转换。
  3. 为您需要的所有类型创建一个包含DataElements和子类DataElements的集合的类,并使用元数据在运行时创建正确的类。
于 2012-05-07T16:43:48.547 回答
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
 }

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

于 2012-05-07T18:20:55.207 回答
0

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

根据您的问题,尚不清楚您打算如何使用这些数据,所以我根据个人经验来回答。

于 2012-05-07T16:56:44.043 回答