我正在尝试使用 statsmodels 将我的数据拟合到 Logistic 回归模型 (Logit),但我拥有的数据框不是 pandas 数据框,而是 Dask 数据框。
这是我的示例数据集:smarket_1:
响应变量:
Direction
const Year Lag1 Lag2 Lag3 Lag4 Lag5 Volume Today Direction
0 1.0 2001.0 0.381 -0.192 -2.624 -1.055 5.010 1.1913 0.959 1.0
1 1.0 2001.0 0.959 0.381 -0.192 -2.624 -1.055 1.2965 1.032 1.0
2 1.0 2001.0 1.032 0.959 0.381 -0.192 -2.624 1.4112 -0.623 0.0
3 1.0 2001.0 -0.623 1.032 0.959 0.381 -0.192 1.2760 0.614 1.0
4 1.0 2001.0 0.614 -0.623 1.032 0.959 0.381 1.2057 0.213 1.0
5 1.0 2001.0 0.213 0.614 -0.623 1.032 0.959 1.3491 1.392 1.0
6 1.0 2001.0 1.392 0.213 0.614 -0.623 1.032 1.4450 -0.403 0.0
7 1.0 2001.0 -0.403 1.392 0.213 0.614 -0.623 1.4078 0.027 1.0
8 1.0 2001.0 0.027 -0.403 1.392 0.213 0.614 1.1640 1.303 1.0
9 1.0 2001.0 1.303 0.027 -0.403 1.392 0.213 1.2326 0.287 1.0
10 1.0 2001.0 0.287 1.303 0.027 -0.403 1.392 1.3090 -0.498 0.0
11 1.0 2001.0 -0.498 0.287 1.303 0.027 -0.403 1.2580 -0.189 0.0
12 1.0 2001.0 -0.189 -0.498 0.287 1.303 0.027 1.0980 0.680 1.0
13 1.0 2001.0 0.680 -0.189 -0.498 0.287 1.303 1.0531 0.701 1.0
14 1.0 2001.0 0.701 0.680 -0.189 -0.498 0.287 1.1498 -0.562 0.0
15 1.0 2001.0 -0.562 0.701 0.680 -0.189 -0.498 1.2953 0.546 1.0
16 1.0 2001.0 0.546 -0.562 0.701 0.680 -0.189 1.1188 -1.747 0.0
17 1.0 2001.0 -1.747 0.546 -0.562 0.701 0.680 1.0484 0.359 1.0
18 1.0 2001.0 0.359 -1.747 0.546 -0.562 0.701 1.0130 -0.151 0.0
19 1.0 2001.0 -0.151 0.359 -1.747 0.546 -0.562 1.0596 -0.841 0.0
所以,当我使用
Logit
中的 statsmodels
类并拟合我的数据时:
from statsmodels.api import Logit
logistict_reg = Logit(endog = smarket_1['Direction'], exog = smarket_1.drop(labels= 'Direction', axis = 1)).fit()
logistic_reg.summary()
我收到以下错误消息:
ValueError: unrecognized data structures: <class 'dask.dataframe.core.DataFrame'> / <class 'dask.dataframe.core.DataFrame'>
接下来,当我尝试使用
.compute()
将 dask 数据帧转换为 pandas 数据帧时,如下所示:
from statsmodels.api import Logit
logistict_reg = Logit(endog = smarket_1['Direction'], exog = smarket_1.drop(labels= 'Direction', axis = 1).compute()).fit()
我收到错误消息:
AttributeError: 'Index' object has no attribute 'equals'
但是,当我将相同的 dask 数据帧传递给 sklearn 的逻辑回归模型时,它的工作没有任何错误。
那么 Statsmodels 不支持/与 Dask 数据框一起使用吗?
不 - 您不能将 scikit-learn 或 statsmodels 与 dask 数组或数据帧一起使用。这些库基于 numpy 数据结构,不支持核外或延迟操作。
相反,请使用库 dask-ml,它是 dask 生态系统的一部分,直接使用这些数据结构,其设计类似于这些基于 numpy 的框架,但使用 dask 调度程序。
请注意,您可能正在使用的某些算法不能很好地(或根本不能)扩展到并行或分区数据集。 Dask-ml 实现了许多相似的算法,但使用近似或采样方法来实现相似(但不相同)的结果。因此,请准备好阅读可用的方法,并灵活地满足您对精确解决方案的需求。否则,您唯一的选择是使用具有更多内存的机器并计算集合,以便您可以使用基于 numpy 的库。
scikit-learn 和 statsmodels 都在开发支持分布式处理的方法。许多算法可以以“分而治之”的方式工作。 scikit-learn 采用了 .partial_fit 方法的约定。 statmodels 有一个名为 DistributedModel 的对象。
dask-ml 是一种快速完成工作的方法。但是,如果您需要 scikit-learn 或 statsmodels 之外的其他特定方法,以下文章可能会有用。这些库中的一些算法可以以并行方式扩展。
https://scikit-learn.org/0.15/modules/scaling_strategies.html https://www.statsmodels.org/stable/large_data.html