プロトタイプ-- ビッグデータを扱う上で最も重要なことです。メモリにロードしてインタプリタ (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})