jfi*_*ive 9 python performance numpy bigdata pandas
我正在处理一个包含2,000,000行的大型记录文件.每行包含有关电子邮件的功能和[0,1]分别用于非垃圾邮件或垃圾邮件的二进制标签.
我想转换的所有功能,如email_type这需要对值从[1,10]二进制矩阵.
这可以使用pd.get_dummies(),从一列特征创建二进制矩阵来完成.
这完全适用于数据的一个小子样本,比如10,000行.但是,对于100,000+行,我看到错误Killed:9.
为解决这个问题,我尝试了以下方法:
脚步:
numpyp.array_split()码:
# break into chunks
chunks = (len(df) / 10000) + 1
df_list = np.array_split(df, chunks)
super_x = []
super_y = []
# loop through chunks
for i, df_chunk in enumerate(df_list):
# preprocess_data() returns x,y (both DataFrames)
[x, y] = preprocess_data(df_chunk)
super_x.append(x)
super_y.append(y)
# vertically concatenate DataFrames
super_x_mat = pd.concat(super_x, axis=0).fillna(0)
super_y_mat = pd.concat(super_y, axis=0)
# pickle (in case of further preprocessing)
super_x_mat.to_pickle('super_x_mat.p')
super_y_mat.to_pickle('super_y_mat.p')
# return values as np.ndarray
x = super_x_mat.values
y = super_y_mat.values
return[x, y]
Run Code Online (Sandbox Code Playgroud)
一些示例输出:
chunks 13
chunk 0 2016-04-08 12:46:55.473963
chunk 1 2016-04-08 12:47:05.942743
...
chunk 12 2016-04-08 12:49:16.318680
Killed: 9
Run Code Online (Sandbox Code Playgroud)
在处理32块(320,000行)之后,步骤2(转换为二进制矩阵)是内存不足,但是当块被附加到数据帧列表时,可能发生内存不足,如下所示df_chunks.append(df).
尝试连接20成功处理的块(200,000行)时,步骤3内存不足
理想的输出是numpy.ndarray我可以提供给sklearnLogistic回归分类器.
我可以尝试其他什么方法?我开始更频繁地在这个大小的数据集上进行机器学习.
我是在接受建议并接受以下建议:
如果您正在执行类似热门编码的操作,或者在任何情况下都会有大量的零,您是否考虑过使用稀疏矩阵?这应该在预处理之后完成,例如:
[x, y] = preprocess_data(df_chunk)
x = sparse.csr_matrix(x.values)
super_x.append(x)
Run Code Online (Sandbox Code Playgroud)
熊猫也有稀疏类型:
x=x.to_sparse()
[x, y] = preprocess_data(df_chunk)
super_x.append(x)
Run Code Online (Sandbox Code Playgroud)
一个注意事项:由于您正在按行切割和连接,因此csr优于csc.
| 归档时间: |
|
| 查看次数: |
1362 次 |
| 最近记录: |