如何创建特征表示?

数据挖掘 机器学习 熊猫 数据科学模型
2022-02-14 21:03:17

假设我有一个包含 800 行的数据集(20 个用户每人 40 个条目)。条目是用户会话日志(列是 - 特定会话的浏览器、操作系统、时间、日期等)。

现在每个用户都有唯一的 id (1-20)。假设 user_id=1 是特殊的,每当有新数据出现时我都需要检测它。

因此,对于新数据,我需要预测该会话是否为 user_id=1。

我的问题是如何做到这一点?

我认为的一种方法是为 20 个用户中的每一个用户制作一个特征表示,并且每当有新数据出现时,获取数据与每个特征的距离并查看最小距离。

但问题是当我为每个用户制作独特的特征表示时,如何处理浏览器、操作系统等列 - 因为用户可以在所有这 40 个会话中使用多个浏览器?

1个回答

如果我理解正确,您想创建功能吗?有几种方法可以做到这一点。我将首先谈谈标签编码和热标签编码(链接是我在谷歌上找到的第一个)。这取决于型号,我将在下面解释。

由于我们想在模型中使用分类数据,因此大多数模型在数值数据上表现得更好。所以让我们转换分类 -> 数字:

import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame({'user':['adam','adam','susie','jane'], 
                   'browser':['chrome','firefox','chrome','opera']})

   browser   user
0   chrome   adam
1  firefox   adam
2   chrome  susie
3    opera   jane

label_encoder = LabelEncoder()
# convert browser to numeric
df['browser_encoded'] = label_encoder.fit_transform(df['browser'])

   browser   user  browser_encoded
0   chrome   adam                0
1  firefox   adam                1
2   chrome  susie                0
3    opera   jane                2

在“现实世界”中,您将browser按照现在的编码删除列。我留下它是为了向你展示发生了什么。

现在请注意我们的数据现在是数字的。但现在有一个问题。如果您正在使用诸如多元线性回归之类的东西,那么您只是为 Opera 浏览器分配了更高的权重,因为它是一个更高的数字。(2>1 和 2>0)。但由于这是分类问题,而且 Opera 并不比我们模型中的其他浏览器“更重要”,我们需要解决这个问题。这就是 One Hot Encoding 发挥作用的地方。

pd.concat([df,pd.get_dummies(df['browser'])], axis=1)

   browser   user  browser_encoded  chrome  firefox  opera
0   chrome   adam                0       1        0      0
1  firefox   adam                1       0        1      0
2   chrome  susie                0       1        0      0
3    opera   jane                2       0        0      1

现在我们的数据列在列中。当有人将该浏览器用于该记录时,将出现 1 值。看到第一条记录了吗?其中chrome列是 1,因为亚当在列中使用了“铬” browser

关于标签编码,还有最后一件事!您不想陷入某些模型的虚拟变量陷阱基本逻辑是:如果你知道浏览器不是Chrome 或 Firefox,那一定是 Opera。如果您知道浏览器Chrome,那么您就知道它不是 Firefox 或 Opera。所以你只需要N-1。如果您使用所有列,您的模型可能表现不佳。您只需删除其中一列。你可以这样做drop_first=True

pd.concat([df,pd.get_dummies(df['browser'], drop_first=True)], axis=1)
   browser   user  browser_encoded  firefox  opera
0   chrome   adam                0        0      0
1  firefox   adam                1        1      0
2   chrome  susie                0        0      0
3    opera   jane                2        0      1

创建特征的另一种方法是自己制作。您提到用户可以使用多个浏览器。为了一个简单的例子,我正在编造一些东西 - 但也许他们使用的浏览器数量可以成为一个功能?您可以像这样创建一个:

df['num_of_browsers_used'] = df.groupby('user', as_index=False).transform('nunique')['browser']
    browser user    browser_encoded num_of_browsers_used
0   chrome  adam    0   2
1   firefox adam    1   2
2   chrome  susie   0   1
3   opera   jane    2   1