如何使用Patsy的API准备大型数据集?
我在做逻辑回归的时候,遇到了使用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
y
和dta
是DesignInfo
对象——它们包含了将数据框中的一行转换为设计矩阵一行所需的所有信息。不过,它们里面并不包含你的实际数据——要获取设计矩阵的一部分,你需要提供一部分数据给它们。使用它们时,你需要做一些类似这样的事情:
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
# ...