我需要将大型csv转换为Keras模型的一种热编码np.ndarray。
For ex: csv data =
F1 F2 F3
1.'M' 'N' 'I'
2.'-' 'M' 'K'
Each Column's Possible Values
F1: ['-', 'M', 'N']
F2: ['-', 'A', 'B', 'M', 'N']
F3: ['-', 'I', 'J', 'K']
Expected Value(One hot encode in np.array)
F1 F2 F3
1. 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0
2. 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
我能够读取csv,然后逐行解析。 但这很慢,而且文件很大。 有没有一种方法可以使用“ pd.dataframe.apply”转换为一种热编码?
答案 0 :(得分:1)
傻瓜....大声笑,熊猫对像我这样的假人有get_dummies函数。这是视频 https://www.youtube.com/watch?v=0s_1IsROgDc
实现get_dummies之后,我的模块抛出大小错误。 我发现,因为我使用.fit_generator(),然后加载了一个数据框,然后加载了get_dummies。如果批次没有所有可能的值,它将返回不一致的大小。
解决方案:从sklearn.preprocessing导入OneHotEncoder
在这里,如果您有大量数据集,那么可以为您做更多的工作。
答案 1 :(得分:0)
要生成数据以测试我的方法,我使用您指定的60000000行的格式(或以上每种组合的1000000的60倍)生成了一个文件。因为每行的数据只能是60个选项之一,所以不存储数据(因为顺序无关紧要),所以存储每行的每个外观的计数要快得多,因为与转换60000000行相比,您可以将60转换为您的一种热门编码。注意:数据文件最终为480mb。以下代码将数据读入字典:
def foo():
data = {}
with open('data.csv') as f:
for line in f:
try:
data[line] += 1
except KeyError as e:
data[line] = 1
有了print(timeit(__main__, number=10))
,我的时间达到了125.45043465401977
。
从那时起,您可以将每个字符串行转换为一种热编码,并添加n个副本进行训练。由于Keras可以使用python generator object进行训练,因此这也应该使训练模型更加容易。这意味着所有数据都不会存储在内存中,从而可以在大于RAM大小的数据集上进行训练。