【问题标题】:How to turn rows of a dataframe into feature vectors?如何将数据帧的行转换为特征向量?
【发布时间】:2020-09-08 04:44:02
【问题描述】:

所以,我有一个数据框,其中的每一行代表计算机上与高级业务流程活动相关联的一些低级用户活动。高级业务流程活动由每行表示的此类低级活动的序列组成。数据框如下所示:

因此,这是一个序列分类问题,其中每个序列由案例 ID 标识,每一行代表序列的数据点。我需要训练一个模型来预测每个序列所代表的业务流程活动。

为此,我需要将数据框的每一行转换为特征向量,但问题是数据框的列每行包含不同的信息,有些数据是数字的,有些是文本的(例如:里面的内容word文档)。我需要使用所有数据进行训练。如何将这些行转换为特征向量进行训练?

【问题讨论】:

  • 对于文本数据,检查词袋,这是最简单的文本表示形式。
  • 感谢您的回复。但是,我需要将每一行创建为一个特征向量。行的每一列代表不同的事物。例如,有一列存储 Microsoft Word 文档内的文本正文。我可以为此使用“词袋”,但还有另一列表示文档的编辑时间等,它具有完全不同的上下文含义。那么,如何将这样一行数据转化为特征向量呢?
  • 您好 user8525740,我想知道您是否找到了解决方案?你介意分享以帮助那些在这个问题上苦苦挣扎的人吗?谢谢!

标签: python pandas machine-learning deep-learning nlp


【解决方案1】:

对于文本数据,您在所谓的嵌入中寻找什么。如果文本字段只有几个唯一值,则使用一种热编码(例如sklearn.preprocessing.OneHotEncoder)。对于更复杂的序列(具有超过 100k 个不同的值),您可能需要查看序列编码。例如,其中一种方法是对每个单词使用 google 提供的嵌入(例如参见 https://code.google.com/archive/p/word2vec/),这会为文本序列中的每个单词生成向量。然后,对于每个文本序列,向量被平均,这给出了整个序列的表示。

【讨论】:

  • 感谢您的回复。但是,我需要将每一行创建为一个特征向量。每一行代表不同的低级活动,每一列代表描述活动的不同事物。例如,有一列存储 Microsoft Word 文档内的文本正文,另一列表示文档的编辑时间。对于不同的活动,这些列可能不同。这些列具有完全不同的上下文含义。那么,如何将这样一行数据转化为特征向量呢?
  • 我的荣幸。本质上,您可以按列处理这种混合类型的数据。如果您有一列包含文本值并且唯一值很少,则可以将它们中的每一个表示为不同类型的向量。从 OneHotEncoder (towardsdatascience.com/…) 开始。一旦您了解了这一点,请查看 LabelBinarizer。如果您的列有很多唯一值,请检查stackoverflow.com/questions/38302280/…
  • 如果您需要带有浮点数的紧凑向量(我最初建议的),请考虑 geeksforgeeks.org/python-word-embedding-using-word2vec 。我建议您先阅读有关 OneHotEncoder 的内容,以了解该主题。
【解决方案2】:

这里有两个例子,一个使用labelencoder,一个使用onehotencoder

乐:

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder# creating initial dataframe
bridge_types = ('Arch','Beam','Truss','Cantilever','Tied Arch','Suspension','Cable')
bridge_df = pd.DataFrame(bridge_types, columns=['Bridge_Types'])# creating instance of labelencoder
labelencoder = LabelEncoder()# Assigning numerical values and storing in another column
bridge_df['Bridge_Types_Cat'] = labelencoder.fit_transform(bridge_df['Bridge_Types'])
bridge_df

结果:

  Bridge_Types  Bridge_Types_Cat
0         Arch                 0
1         Beam                 1
2        Truss                 6
3   Cantilever                 3
4    Tied Arch                 5
5   Suspension                 4
6        Cable                 2

哦:

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder# creating instance of one-hot-encoder
enc = OneHotEncoder(handle_unknown='ignore')# passing bridge-types-cat column (label encoded values of bridge_types)
enc_df = pd.DataFrame(enc.fit_transform(bridge_df[['Bridge_Types_Cat']]).toarray())# merge with main df bridge_df on key values
bridge_df = bridge_df.join(enc_df)
bridge_df

结果:

  Bridge_Types  Bridge_Types_Cat    0    1    2    3    4    5    6
0         Arch                 0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
1         Beam                 1  0.0  1.0  0.0  0.0  0.0  0.0  0.0
2        Truss                 6  0.0  0.0  0.0  0.0  0.0  0.0  1.0
3   Cantilever                 3  0.0  0.0  0.0  1.0  0.0  0.0  0.0
4    Tied Arch                 5  0.0  0.0  0.0  0.0  0.0  1.0  0.0
5   Suspension                 4  0.0  0.0  0.0  0.0  1.0  0.0  0.0
6        Cable                 2  0.0  0.0  1.0  0.0  0.0  0.0  0.0

注意:请确保您只对作为实际标签的列执行此操作,而不是对那些...比如说 ID 或日期,或类似这些行的任何内容。

【讨论】:

  • 感谢您的回复。但是,我需要将每一行创建为一个特征向量。每一行代表不同的低级活动,每一列代表描述活动的不同事物。例如,有一列存储 Microsoft Word 文档内的文本正文,另一列表示文档的编辑时间。对于不同的活动,这些列可能不同。这些列具有完全不同的上下文含义。那么,如何将这样一行数据转化为特征向量呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2018-01-13
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多