處理大型資料集¶
大數據是現代世界的一個熱門詞彙。雖然 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 物件中,以僅傳回一部分列,直到您建立良好的模型為止。然後,您可以在更多資料上重新擬合最終模型。
上次更新:2024 年 10 月 03 日