首页 > 解决方案 > 如何处理分类特征的未知数量的值?

问题描述

我有一个看起来像这样的熊猫数据框

Text                  | Label

Some text             |   0
hellow bye what       |   1
...

每行是一个数据点。标签是 0/1 二进制。唯一的特征是Text它包含一组单词。我想使用每个单词的存在或不存在作为特征。例如,特征可以是contains_some contains_what contains_hello contains_bye等。这是典型的一种热编码。

但是我不想手动创建这么多的特征,词汇表中的每个单词都有一个(词汇表并不大,所以我不担心特征集爆炸)。但我只想将单词列表作为单列提供给 tensorflow,我希望它为词汇表中的每个单词创建一个二进制特征。

tensorflow/keras 是否有 API 可以做到这一点?

标签: pandastensorflowkerastensorflow2.0

解决方案


您正在寻找的是一个(二进制)词袋,您可以使用他们的CountVectorizer here从 scikit-learn 获得。

您可以执行以下操作:

from sklearn.feature_extraction.text import CountVectorizer

bow = CountVectorizer(ngram_range=(1, 1), binary=True)

X_train = bow.fit_transform(df_train['text'].values)

这将创建一个二进制值数组,指示每个文本中是否存在一个单词。binary=True如果单词存在,则用于输出 1 或 0 。如果没有此字段,您将获得每个单词的出现次数,任何一种方法都可以正常工作。

为了检查计数,您可以使用以下内容:

# Create sample dataframe of BoW outputs
count_vect_df = pd.DataFrame(X_train[:1].todense(),columns=bow.get_feature_names())

# Re-order counts in descending order. Keep top 10 counts for demo purposes
count_vect_df= count_vect_df[count_vect_df.iloc[-1,:].sort_values(ascending=False).index[:10]]

# print combination of original train dataframe with BoW counts
pd.concat([df_train['text'][:1].reset_index(drop=True), count_vect_df], axis=1)

更新

如果您的功能包括分类数据,您可以尝试使用to_categoricaltf.keras。有关更多信息,请参阅文档


推荐阅读