大規模データセットの扱い¶
ビッグデータは現代社会において一種の流行語となっています。 statsmodelsは、メモリにロードできる小規模から中規模のデータセット(おそらく数万件の観測値)でうまく動作しますが、数百万件以上の観測値が存在するユースケースもあります。ユースケースによっては、statsmodelsが十分なツールである場合もあれば、そうでない場合もあります。
statsmodelsと、それが書かれているソフトウェアスタックのほとんどは、メモリ内で動作します。その結果、より大きなデータセットでモデルを構築することは、困難または非現実的になる可能性があります。とはいえ、statsmodelsを使ってより大きなデータセットでモデルを構築するための一般的な戦略は2つあります。
分割統治 - ジョブの分散¶
システムがすべてのデータをロードできるが、実行しようとしている分析が遅い場合、データの水平スライスでモデルを構築し、適合後に個々のモデルを集約できる可能性があります。
このアプローチの現在の制限は、一般的にpatsyをサポートしていないため、statsmodelsでデザイン行列(exogとして知られています)を構築することが少し難しいことです。
詳細な例はこちらで入手できます。
|
分散モデルクラス |
|
モデル結果を格納するクラス |
データのサブセット化¶
データセット全体が大きすぎてメモリに格納できない場合は、Apache Parquetやbcolzのようなカラムコンテナに格納してみるのもよいでしょう。 patsyの数式インターフェースを使用すると、statsmodelsは__getitem__関数(つまり、data[‘Item’])を使用して、指定された列のみをプルします。
import pyarrow as pa
import pyarrow.parquet as pq
import statsmodels.formula.api as smf
class DataSet(dict):
def __init__(self, path):
self.parquet = pq.ParquetFile(path)
def __getitem__(self, key):
try:
return self.parquet.read([key]).to_pandas()[key]
except:
raise KeyError
LargeData = DataSet('LargeData.parquet')
res = smf.ols('Profit ~ Sugar + Power + Women', data=LargeData).fit()
さらに、この例のDataSetオブジェクトにコードを追加して、適切なモデルを構築するまで、行のサブセットのみを返すことができます。その後、より多くのデータで最終モデルを再適合できます。