如果我理解正确,您想创建功能吗?有几种方法可以做到这一点。我将首先谈谈标签编码和热标签编码(链接是我在谷歌上找到的第一个)。这取决于型号,我将在下面解释。
由于我们想在模型中使用分类数据,因此大多数模型在数值数据上表现得更好。所以让我们转换分类 -> 数字:
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