2012-05-07 12 views
0

私はJavaを使用して、UCI Machine Learning Repositoryからいくつかのデータセットを読み込んで処理しています。 各データセットのクラスを作成し、特定のクラスファイルを操作することから始めました。データセットのすべての属性は、必要なタイプのクラスの対応するデータメンバーによって表されていました。このアプローチはうまくいきました。帰属したのは< 10-15です。私は、クラスのデータメンバーを増減し、新しいデータセットをモデル化するために型を変更しました。私はまた、関数に必要な変更を加えました。Javaで大量のデータを読み取る

問題: 私は今、非常に大規模なデータセットと仕事をしなければなりません。 > 20-30の属性を持つものは、この方法で作業するのが面倒です。私はクエリをする必要はありません。私のデータ離散化アルゴリズムでは、離散化するためにデータのスキャンが4回必要です。私の仕事は離散化の直後に終わります。ここで効果的な戦略は何でしょうか?

私は自分の問題をはっきりと述べることができたらいいと思う。

+0

いくつかの質問:1)データの使用をどのように計画していますか?あなたがクエリをしたり、おそらくデータベースのような何かをしたい場合は、あなたの最善の策です。 2)リポジトリからどのようにデータを取得しますか? – javydreamercsw

+0

大規模なデータセットを言うとどういう意味ですか?データの問題は何ですか?例を教えてください。 – Behe

+0

私はデータ離散化のための新しいアルゴリズムをテストしています。そのために、データを読み込んでJavaで処理する必要があります –

答えて

1

次のようなメンバーを含む単純なデータセットクラスを作成します。

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

ありがとう。これは私がthikingしていた実装に最も近いです。 UCI Repoのすべてのファイルにヘッダーの情報が含まれているとは思われません。離散化されたデータセットをWekaに供給しています。これは大きな助けになります! –

+0

UCI Repoのすべてのデータセットにヘッダーがあるわけではありませんが、パーサーに与える設定可能なパラメータにすることができます。ヘッダーを持っているかどうか、それを探すかどうかをパーサに伝えるパラメータではありません。最後にヘッダーは、単にユーザーが列を参照してデータセットを構成するために使用できるユーザーフレンドリーなラベルです。そこにあれば人間のフレンドリーなラベルを解析する。そうでなければF1、F2、F3などを使うことができます。あなたのユーザーは、予測の列、おそらくデータ型(文字列、浮動小数点数)などの情報を提供する必要があります。 – chubbsondubs

+0

ありがとうございます。上記のコードにちょっとした修正を加えました。 'public void parse(String row、List columns){ String [] cols = row.split( "、"); data =新しいオブジェクト[cols.length]; int i = 0; for(列col:列){ data [i] = col.convert(cols [i]); i ++; } } ' –

3

いくつかのオプション:

  1. は、ファイルのメタデータを読み込み、同等のクラスファイルを生成するコードジェネレータを書きます。
  2. クラスを気にしないでください。データをObjectまたはStringの配列に保ち、必要に応じてキャストします。
  3. DataElementsとサブクラスのコレクションを含むクラスを作成し、必要なすべてのタイプのDataElementsを実行し、実行時に適切なクラスを作成するためにメタデータを使用します。
+0

ありがとうございました。これは私にとって学習の新しい道を開きます。あなたが話しているコードジェネレータのようなことは一度もありません。あなたは、おそらく私がそれについて学ぶことができる場所へのいくつかの指針を提供することができますか? –

+0

この場合、Javaクラスファイルを出力するプログラムを作成するだけです。これを行うにはたくさんの方法がありますが、手動で行う場合と同じように、基本的にクラススケルトンとメンバー変数をメタデータに基づいて出力するだけです。 – dfb

0

私は私のプロジェクトの一つにそのような何かをしました。さまざまなデータがあり、私の場合はインターネットからデータを取得しました。私はクエリやソートなどが必要だったので、データのすべてのバリエーションに対応できるようにデータベースを設計しました(すべてのエントリが同じ数のプロパティを持っているわけではありません)。それはしばらく時間がかかりましたが、私は同じコードを使用して(私の場合はJPAを使用して)どんなエントリのデータも取得しました。私のIDE(NetBeans)はデータベーススキーマを使用してコードの大部分を作成しました。

あなたの質問から、それはあなたが、私は個人的な経験に基づいて答えてるようにデータを使用する予定の方法については明確ではありません。

関連する問題