如何使用Patsy的API准备大型数据集?

3 投票
1 回答
704 浏览
提问于 2025-04-28 23:42

我在做逻辑回归的时候,遇到了使用Patsy的API来准备数据的问题,尤其是当数据量大于小样本时。

我直接在一个数据框上使用了dmatrices这个函数,结果遇到了一个很突兀的错误(请注意,我在笔记本电脑上遇到这个问题后,启动了一个300GB内存的EC2,结果还是遇到了同样的错误):

Traceback (most recent call last):
File "My_File.py", line 22, in <module>
   df, return_type="dataframe")
File "/root/anaconda/lib/python2.7/site-packages/patsy/highlevel.py", line 297, in dmatrices
 NA_action, return_type)
File "/root/anaconda/lib/python2.7/site-packages/patsy/highlevel.py", line 156, in do_highlevel_design
return_type=return_type)
File "/root/anaconda/lib/python2.7/site-packages/patsy/build.py", line 989, in build_design_matrices
results.append(builder._build(evaluator_to_values, dtype))
File "/root/anaconda/lib/python2.7/site-packages/patsy/build.py", line 821, in _build
m = DesignMatrix(np.empty((num_rows, self.total_columns), dtype=dtype),
MemoryError

所以,我仔细查阅了Patsy的文档,发现了一个很有用的信息:

patsy.incr_dbuilder(formula_like, data_iter_maker, eval_env=0)
    Construct a design matrix builder incrementally from a large data set.

不过,这个方法的文档很少,而且源代码大部分没有注释。

我写出了以下代码:

def iter_maker():
    with open("test.tsv", "r") as f:
        reader = csv.DictReader(f, delimiter="\t")
        for row in reader:
            yield(row)


y, dta = incr_dbuilders("s ~ C(x) + C(y):C(rgh) + \
C(z):C(f) + C(r):C(p) + C(q):C(w) + \
C(zr):C(rt) + C(ff):C(djjj) + C(hh):C(tt) + \
C(bb):lat + C(jj):lng + C(ee):C(bb) + C(qq):C(uu)",
        iter_maker)

df = dmatrix(dta, {}, 0, "drop", return_type="dataframe")

但是我收到了PatsyError: Error evaluating factor: NameError: name 'ff' is not defined的错误。

这个错误是因为_try_incr_builders(从dmatrix调用)在highlevel.py的第151行返回了None,导致的。

请问,正确使用这些Patsy函数来准备我的数据的方法是什么?如果你有任何示例或指导,那将会很有帮助。

暂无标签

1 个回答

1

ydtaDesignInfo对象——它们包含了将数据框中的一行转换为设计矩阵一行所需的所有信息。不过,它们里面并不包含你的实际数据——要获取设计矩阵的一部分,你需要提供一部分数据给它们。使用它们时,你需要做一些类似这样的事情:

for data_chunk in iter_maker():
  y_chunk, design_chunk = dmatrices((y, dta), data_chunk,
                                    NA_action="drop", return_type="dataframe")
  # do something with y_chunk and design_chunk
  # ...

撰写回答