7

計算言語学の学生として、私は機械学習実験を頻繁に行っています。そこでは、生または注釈付きのテキストコーパスや構文ツリーバンクなど、あらゆる種類のさまざまなリソースからトレーニングデータを準備する必要があります。すべての新しいタスクとすべての新しい実験について、必要な機能と値を抽出し、データをある形式から別の形式に変換するプログラム(通常はPython、場合によってはJava)を作成します。これにより、通常、非常に多くの非常に大きなファイルと、いくつかの機械学習フレームワーク(Wekaのarffファイルなど)の入力を取得するためにそれらを処理する非常に多くの小さなプログラムが生成されます。

それを処理し、大量のデータの重要な特性、例外、またはエラーを見逃さないように細心の注意を払ってプログラムするために、非常によく組織化する必要があります。設計パターンやリファクタリングパラダイムなどの優れたソフトウェア設計の多くの原則は、セキュリティ、保守性、持続可能性などはそれほど重要ではないため、これらのタスクにはあまり使用されません。プログラムがデータを正常に処理すると、データは不要になります。これはこれまでのところ、Pythonコードとプログラムで単純な手続き的な方法でクラスや関数を使用することさえまったく気にしないようになっています。次の実験では、独自の特性と異なる形式の異なるデータセットが必要になるため、いずれにせよ、それらの準備を最初からプログラムする必要があります。これまでの私の経験はそれが プロジェクトの時間の80〜90%をトレーニングデータの準備に費やすのは珍しいことではありません。何時間も何日も、あるデータ形式から別のデータ形式に移行する方法を考えるだけで過ぎ去ります。時々、これはかなりイライラすることがあります。

さて、あなたはおそらく私が意図的にさえ少し誇張していると推測しました、しかし私はあなたが私が言おうとしていることを理解していると確信しています。私の質問は、実際には、これです:

これらのタスクに取り組むための一般的なフレームワーク、アーキテクチャ、ベストプラクティスはありますか?最適な設計があれば、私が書いたコードのどれだけが再利用可能であると期待できますか?

4

2 に答える 2

2

私は主にGNUcoreutilsのtextutilsとflexをコーパスの準備に使用し、少なくとも私が作成する必要のある準備が正規表現や簡単なフィルタリングなどのために十分に単純な場合は、単純なスクリプトで物事を連鎖させています。

物事を再利用可能にすることはまだ可能ですが、一般的なルールもここに適用されます。ベストプラクティスなどに関係なくプログラミングを行っていて、手続き的にプログラミングするだけの場合、新しいプロジェクトを開始するときにすべてを最初から行う必要があるのも不思議ではありません。

フォーマット要件は大きく異なりますが、それでも多くの一般的なタスクがあります。タグの削除、タグの翻訳、選択、集計、トークンの数、文などの簡単なデータ収集。高い再利用性を目指してこれらのタスクをプログラミングすると、最初は時間がかかりますが、効果があります。

于 2010-01-14T18:33:14.173 に答える
1

私はそのようなフレームワークを知りません-それらがそこにないという意味ではありません。私は、時間をかけて洗練/微調整/借用したコードスニペットのコレクションであり、問​​題に応じてさまざまな構成でチェーンできる独自のコードスニペットを使用することを好みます。すでにPythonを知っている場合は、NumPyですべてのデータ準備を処理することを強くお勧めします-ご存知のように、MLデータセットは大きくなる傾向があります-何千もの行ベクトルがfloatでパックされています。NumPyはそのようなことに対して素晴らしいです。さらに、MLのトレーニングデータを準備するために、そのような取り組みのほぼすべてで発生し、問題ごとに大きく変化しないタスクがいくつかあることをお勧めします。これらのスニペットを以下に示します。

正規化(データのスケーリングと平均-オーバーウェイトを回避するための中央揃え。ご存知のとおり、-1から1または0から1にスケーリングできます。私は通常、スパースパターンを利用できるように後者を選択しました。Pythonでは、NumPyライブラリを使用:

import numpy as NP
data = NP.linspace( 1, 12, 12).reshape(4, 3)
data_norm = NP.apply_along_axis( lambda x : (x - float(x.min())) / x.max(), 
                                             0, data )

交差検定(デフォルトの引数を「5」に設定したので、テストセットは5%、トレーニングセットは95%です。これを関数に入れると、k-foldがはるかに簡単になります)

def divide_data(data, testset_size=5) :
  max_ndx_val = data.shape[0] -1
  ndx2 = NP.random.random_integers(0, max_ndx_val, testset_size)
  TE = data_rows[ndx2]
  TR = NP.delete(data, ndx2, axis=0)
  return TR, TE

最後に、これが明確で完全な優れたケーススタディ(IMHO)であり、生データの収集からMLアルゴリズム(この場合はMLP)への入力までのプロセス全体を文字通り示しています。また、コードも提供します。

于 2010-01-15T01:00:52.107 に答える