statsmodels 在其提供的任何机器学习模型中使用时是否与 Dask 数据框不兼容?

问题描述 投票:0回答:2

我正在尝试使用 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 数据框一起使用吗?

python pandas dataframe dask statsmodels
2个回答
2
投票

不 - 您不能将 scikit-learn 或 statsmodels 与 dask 数组或数据帧一起使用。这些库基于 numpy 数据结构,不支持核外或延迟操作。

相反,请使用库 dask-ml,它是 dask 生态系统的一部分,直接使用这些数据结构,其设计类似于这些基于 numpy 的框架,但使用 dask 调度程序。

请注意,您可能正在使用的某些算法不能很好地(或根本不能)扩展到并行或分区数据集。 Dask-ml 实现了许多相似的算法,但使用近似或采样方法来实现相似(但不相同)的结果。因此,请准备好阅读可用的方法,并灵活地满足您对精确解决方案的需求。否则,您唯一的选择是使用具有更多内存的机器并计算集合,以便您可以使用基于 numpy 的库。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.