我正在处理一个包含2000000行记录的大型文件。每行都包含有关电子邮件的特征和二进制标签[0,1],分别表示非垃圾邮件或垃圾邮件。
我想将所有特征(例如取值为[1,10]的email_type)转换为二进制矩阵。
这可以使用pd.get_dummies()来完成,该函数可以从特征列创建一个二进制矩阵。
在小数据子样本上,比如10000行,它可以完美地工作。但是,在超过100000行的情况下,我会看到错误Killed:9。
为了解决这个问题,我尝试了以下方法:
步骤:
1.使用numpyp.array_split()将DataFrame拆分成10,000行的块。 2.为每个10,000行的DataFrame创建一个二进制矩阵。 3.将它们附加到一个DataFrame列表中。 4.连接这些DataFrame在一起(我这样做是为了保留每个块中不同列之间的差异)。
代码:
一些示例输出:
第二步(转换为二进制矩阵)在处理32个块(320,000行)后出现内存不足的问题,造成内存不足的原因是该块被附加到数据帧列表中,代码如下:df_chunks.append(df)。
第三步在尝试连接20个已成功处理的块(200,000行)时出现内存不足的问题。
理想的输出是numpy.ndarray,可以将其提供给sklearn逻辑回归分类器。
我还能尝试哪些方法?我经常开始使用这么大的数据集进行机器学习。
我需要建议并可以接受以下建议:
1.处理每个块,使用整个数据帧中的所有可能列,并在重新组合之前保存为文件
2.文件数据存储的建议
3.完全使用不同矩阵的其他方法
我想将所有特征(例如取值为[1,10]的email_type)转换为二进制矩阵。
这可以使用pd.get_dummies()来完成,该函数可以从特征列创建一个二进制矩阵。
在小数据子样本上,比如10000行,它可以完美地工作。但是,在超过100000行的情况下,我会看到错误Killed:9。
为了解决这个问题,我尝试了以下方法:
步骤:
1.使用numpyp.array_split()将DataFrame拆分成10,000行的块。 2.为每个10,000行的DataFrame创建一个二进制矩阵。 3.将它们附加到一个DataFrame列表中。 4.连接这些DataFrame在一起(我这样做是为了保留每个块中不同列之间的差异)。
代码:
# 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]
一些示例输出:
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
第二步(转换为二进制矩阵)在处理32个块(320,000行)后出现内存不足的问题,造成内存不足的原因是该块被附加到数据帧列表中,代码如下:df_chunks.append(df)。
第三步在尝试连接20个已成功处理的块(200,000行)时出现内存不足的问题。
理想的输出是numpy.ndarray,可以将其提供给sklearn逻辑回归分类器。
我还能尝试哪些方法?我经常开始使用这么大的数据集进行机器学习。
我需要建议并可以接受以下建议:
1.处理每个块,使用整个数据帧中的所有可能列,并在重新组合之前保存为文件
2.文件数据存储的建议
3.完全使用不同矩阵的其他方法
email_type
是一个误导性的例子。location
列有更多的值。你有什么建议吗? - jfive