處理大型資料集

大數據是現代世界的一個熱門詞彙。雖然 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 月 03 日