首页 > 解决方案 > one-hot-encode验证数据

问题描述

我有一个单热编码的特征矩阵,其中特征是训练数据的子字符串。

我只有这个最终的数据框,其中包含rows = samples, columns = substrings (one-hot-encoded). 现在我想对一组新数据进行一次热编码。数据包括,rows = samples, columns = String我需要检查每个样本的字符串是否包含任何子字符串(特征)并对它们进行单热编码。

循环遍历所有字符串和子字符串不够快,因为我有大量数据。什么是解决这个问题的快速方法?

编辑:示例:我在列表中有一些字符串,并且有一个热编码矩阵,其中包含以下子字符串:

strings = ['foobarista', 'foobar']

substrings = {'foo' : [1,1] ,
       'bar' : [1,1],
       'ist' : [0,1],
       'sta' : [0,1]}

df_one_hot = pd.DataFrame(substrings)

假设这是我的训练数据,所以我有 features foo, bar, ist, sta

现在我有了新数据:

new_strings = ['barista', 'barfoo', 'house']

并且想要检查这些新字符串,如果它们包含上面数据框中的任何子字符串。

new_substrings = {'foo' : [0,1,0] ,
       'bar' : [1,1,0],
       'ist' : [1,0,0],
       'sta' : [1,0,0]}


new_df = pd.DataFrame(new_substrings)

标签: pythonpandasone-hot-encoding

解决方案


new_substrings可以通过双重列表理解来完成。内部理解遍历所有条目new_string,外部为所有条目创建字典sub_strings

import re

new_strings = ['barista', 'barfoo', 'house']
sub_strings = ['foo', 'bar', 'ist', 'sta']
new_substrings= {sub_s: [ (re.search(sub_s, s) is not None)*1 for s in new_strings] for sub_s in sub_strings}
print(new_substrings)

这将返回:

{'foo': [0, 1, 0], 'bar': [1, 1, 0], 'ist': [1, 0, 0], 'sta': [1, 0, 0]}

然后,您可以使用df = pd.DataFrame(new_substrings).


推荐阅读