大規模データセットの扱い

ビッグデータは現代社会において一種の流行語となっています。 statsmodelsは、メモリにロードできる小規模から中規模のデータセット(おそらく数万件の観測値)でうまく動作しますが、数百万件以上の観測値が存在するユースケースもあります。ユースケースによっては、statsmodelsが十分なツールである場合もあれば、そうでない場合もあります。

statsmodelsと、それが書かれているソフトウェアスタックのほとんどは、メモリ内で動作します。その結果、より大きなデータセットでモデルを構築することは、困難または非現実的になる可能性があります。とはいえ、statsmodelsを使ってより大きなデータセットでモデルを構築するための一般的な戦略は2つあります。

分割統治 - ジョブの分散

システムがすべてのデータをロードできるが、実行しようとしている分析が遅い場合、データの水平スライスでモデルを構築し、適合後に個々のモデルを集約できる可能性があります。

このアプローチの現在の制限は、一般的にpatsyをサポートしていないため、statsmodelsでデザイン行列(exogとして知られています)を構築することが少し難しいことです。

詳細な例はこちらで入手できます。

DistributedModel(partitions[, model_class, ...])

分散モデルクラス

DistributedResults(model, params)

モデル結果を格納するクラス

データのサブセット化

データセット全体が大きすぎてメモリに格納できない場合は、Apache Parquetbcolzのようなカラムコンテナに格納してみるのもよいでしょう。 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オブジェクトにコードを追加して、適切なモデルを構築するまで、行のサブセットのみを返すことができます。その後、より多くのデータで最終モデルを再適合できます。


最終更新日:2024年10月3日