14

私はいくつかの AI クラスを受講しており、実験したいいくつかの基本的なアルゴリズムについて学びました。私は、データ分析コンテストを主催するKaggleを通じて、多くの優れた現実世界のデータを含むいくつかのデータ セットにアクセスすることができました。

機械学習のスキルを向上させるためにいくつかのコンテストに参加しようとしましたが、コード内のデータにアクセスする良い方法を見つけることができませんでした。Kaggle は、競技ごとに 50 ~ 200 MB の 1 つの大きなデータ ファイルを csv 形式で提供します。

コードでこれらのテーブルを読み込んで使用する最良の方法は何ですか? 私の最初の本能はデータベースを使用することだったので、csv を単一のデータベースの sqlite にロードしようとしましたが、これはコンピューターに多大な負荷をかけ、コミット中にコンピューターがクラッシュすることがよくありました。次に、共有ホストで mysql サーバーを使用してみましたが、クエリを実行するのに時間がかかり、分析コードが非常に遅くなりました。さらに、帯域幅を超えてしまうのではないかと心配しています。

これまでの私のクラスでは、通常、インストラクターがデータをクリーンアップし、RAM に完全にロードできる管理可能なデータセットを提供してくれました。明らかに、これは私の現在の興味では不可能です。どのように進めればよいか提案してください。現在、4 GB RAM とデュアルコア 2.1 Ghz CPU を搭載した 4 年前の MacBook を使用しています。

ところで、私はこの言語を最もよく知っているので、分析の大部分を Python で行うことを望んでいます。この言語ですべてまたはほぼすべてのコーディングを実行できるソリューションが必要です。

4

5 に答える 5

18

プロトタイプ-- ビッグデータを扱う上で最も重要なことです。メモリにロードしてインタプリタ (Python、R など) でアクセスできるように、賢明に切り分けます。これは、分析プロセス フローを大規模に作成および改良するための最良の方法です。

つまり、マルチ GB サイズのデータ​​ ファイルをトリミングして、コマンド ライン分析を実行するのに十分な大きさにします。

これが私がそれを行うために使用するワークフローです-確かにそれを行うための最良の方法ではありませんが、それは1つの方法であり、機能します:

I.大きなデータ ファイル、特に約 1 GB を超えるデータ ファイルを読み込むには、選択した言語で利用できる遅延読み込みメソッドを (できれば) 使用します次に、以下で説明する手法に従ってこのデータ ストリームを処理し、最終的にこの完全に前処理されたデータをデータ マートまたは中間ステージング コンテナーに格納することをお勧めします。

Python を使用して大きなデータ ファイルを遅延ロードする1 つの例:

# 'filename' is the full path name for a data file whose size 
# exceeds the memory on the box it resides. #

import tokenize

data_reader = open(some_filename, 'r')
tokens = tokenize.generate_tokens(reader)
tokens.next()           # returns a single line from the large data file.


Ⅱ. ホワイトニングとリキャスト:

  • カテゴリ変数 (男性/女性など) を整数 (-1、1 など) として格納する列を再キャストします。分析ワークフローの最後のステップとして、これらの整数を人間が判読できる文字列ラベルに変換するために、ルックアップ テーブル (キーと値が交換されていることを除いて、この変換に使用したのと同じハッシュ) を維持します。

  • データを白くします。つまり、連続データを保持する列を「正規化」します。これらの手順はどちらも、ノイズを発生させることなく、データ セットのサイズを大幅に削減します。ホワイトニングによる付随的な利点は、重み付けしすぎによる分析エラーの防止です。

III. サンプリング: データを長さ方向にトリミングします


次元削減: サンプリングに直交するアナログ。従属変数 (別名、「結果」または応答変数) に影響を与えない、またはわずかな影響しか与えない変数 (列/フィールド/機能) を特定し、作業データ キューブからそれらを削除します。

主成分分析(PCA) は、これを行うためのシンプルで信頼性の高い手法です。

import numpy as NP
from scipy import linalg as LA

D = NP.random.randn(8, 5)       # a simulated data set
# calculate the covariance matrix: #
R = NP.corrcoef(D, rowvar=1)
# calculate the eigenvalues of the covariance matrix: #
eigval, eigvec = NP.eig(R)
# sort them in descending order: #
egval = NP.sort(egval)[::-1]
# make a value-proportion table #
cs = NP.cumsum(egval)/NP.sum(egval)
print("{0}\t{1}".format('eigenvalue', 'var proportion'))
for i in range(len(egval)) :
    print("{0:.2f}\t\t{1:.2f}".format(egval[i], cs[i]))

  eigenvalue    var proportion
    2.22        0.44
    1.81        0.81
    0.67        0.94
    0.23        0.99
    0.06        1.00

ご覧のとおり、最初の 3 つの固有値は、元のデータで観測された分散の 94% を占めています。目的に応じて、多くの場合、最後の 2 列を削除することにより、元のデータ マトリックス D をトリムできます。

D = D[:,:-2]


V. データ マート ストレージ: 永続ストレージ (データ ウェアハウス) と分析プロセス フローの間にレイヤーを挿入します。. つまり、データ マート/データ キューブ (データ ウェアハウスと分析アプリ レイヤーの間にある「ステージング エリア」) に大きく依存します。このデータ マートは、分析アプリにとってはるかに優れた IO レイヤーです。R の「データ フレーム」または「データ テーブル」(同名の CRAN パッケージから) が良い候補です。また、非常に高速な読み取り、簡潔なセマンティクス、ゼロ構成の redis を強くお勧めします。これは、このユース ケースに最適な選択肢です。redis は、質問で言及したサイズのデータ​​セットを簡単に処理できます。たとえば、redis でハッシュ データ構造を使用すると、面倒な設定をしなくても、MySQL や SQLite と同じ構造と同じリレーショナルの柔軟性を持つことができます。もう 1 つの利点: SQLite とは異なり、redis は実際にはデータベースサーバーです。. 私は実際には SQLite の大ファンですが、ここで述べた理由により、ここでは redis の方がうまく機能すると思います。

from redis import Redis
r0 = Redis(db=0)
r0.hmset(user_id : "100143321, {sex : 'M', status : 'registered_user', 
       traffic_source : 'affiliate', page_views_per_session : 17, 
       total_purchases : 28.15})
于 2011-08-23T00:22:27.517 に答える
2

200メガバイトは、データベースにロードするための特に大きなファイルではありません。入力ファイルをより小さなファイルに分割してみてください。

split -l 50000 your-input-filename

ユーティリティは、split入力ファイルを任意のサイズの複数のファイルに分割します。上記のファイルごとに50000行を使用しました。これは一般的なUnixおよびLinuxコマンドラインユーティリティです。ただし、Macに同梱されているかどうかはわかりません。

PostgreSQLまたはMySQLのローカルインストールは、SQLiteよりも適切な選択である可能性があります。

データをデータベースにロードしたくない場合は、grep、awk、sedなどのコマンドラインユーティリティを使用して、データのサブセットを取得できます。(または、python、ruby、perlなどのスクリプト言語。)サブセットをプログラムにパイプします。

于 2011-08-18T22:33:39.573 に答える
1

それには「パンダ」が必要です。あなたは今までにそれを手に入れたに違いないと思います。しかし、他の誰かが問題に直面している場合でも、答えによって恩恵を受けることができます. したがって、データを RDBMS にロードする必要はありません。ファイルに保存し、単純な Pandas ロード、データフレームで使用します。パンダ lib のリンクは次のとおりです-> http://pandas.pydata.org/

データが大きすぎる場合は、そのためのクラスターが必要です。Amazon EC2 クラウドで実行できる Apache Spark または Mahout。そこにいくつかのスペースを購入すると、使いやすくなります。Spark には Python 用の API もあります。

于 2014-09-14T06:00:19.910 に答える
1

H2O を使用して、R に 2 GB の Kaggle データセットをロードしました。H2O は Java 上に構築されており、仮想環境を作成します。H2O は Java であるため、データはメモリ内で利用でき、アクセスがはるかに高速になります。H2O の構文に慣れる必要があります。多くの美しく構築された ml アルゴリズムがあり、分散コンピューティングを適切にサポートします。すべての CPU コアを簡単に使用することもできます。使用方法については h2o.ai をご覧ください。RAM が 4 GB しかないことを考えると、200 MB を簡単に処理できます。8 G または 16 G にアップグレードする必要があります

于 2017-03-04T04:48:13.557 に答える
0

一般的な技術は「分割して征服する」ことです。データをパーツに分割して個別に処理できれば、1台のマシンで処理できます。LogisticeRegression、CRF、多くの次元削減技術のように、その方法で解決できるタスク(PageRank、NaiveBayes、HMMなど)とそうでないタスク(グローバル最適化が必要なもの)があります。

于 2011-08-25T11:15:09.717 に答える