我应该为特征列中的每个 Id 值创建一个单独的列,还是可以按原样使用特征列?

数据挖掘 机器学习 特征选择 线性回归
2022-02-12 10:38:25

我正在开发一个模型来预测电影的收入。训练集中的特征之一包含电影所属系列的 ID。假设星球大战系列的 ID 为 1,那么“绝地归来”电影该列中的对应值为 1。

如果电影属于该系列,我应该为每个系列创建一个单独的列并添加值 1,还是只保留包含 id 的现有列就可以了?

2个回答

您不应保留该列,因为相似的 id 值在语义上不相关。也许深度神经网络可以处理这个问题,但线性模型绝对不能。

有两个选项,具体取决于列的基数(唯一条目/类别的数量)。

  1. 如果基数很低,你应该对系列进行一次热编码,每个系列一列,就像你建议的那样。但是,在您的数据集中,可能有很多系列,您的数据最终会包含太多的特征。请参阅此图像(来源),如果您进行一次热编码,则每个类别都需要一列/特征。

  2. 如果基数很高,您应该找到 id 列的编码。一种方法是使用目标统计数据:计算一个系列电影为训练集的每个系列类别制作的平均目标(在您的情况下为收入)。然后将 id 列替换为相应系列的目标均值列。如果测试数据中有一个序列,而不是在训练数据中,则只需使用训练集的整体目标均值即可。对于这种方法,重要的是您永远不要使用从测试集计算的目标统计信息,否则,您的错误估计将非常乐观!这种方法背后的基本原理是,允许模型学习诸如“成功电影的延续通常是成功的”之类的东西。

是的,为每个 ID 创建一个“虚拟”(或指标)变量 (1,0)。这有时被称为“固定效应”,表示每个 ID(在本例中为电影系列)的“身份”。因此,可以预期《星球大战》将产生与其他电影截然不同的收入。在线性模型中,假人将简单地为每个 ID 引入一个自己的截距系数。所以你可以认为这让《星球大战》在结构上与其他电影系列有着不同的营业额。

有许多选项可以对 DF 中的单列进行虚拟编码,因此使用虚拟/指标没有问题。例如model.matrix用于R

mydf = data.frame(c(1,1,2,2))
colnames(mydf)<-c("X1")
mydf$X1 <- as.factor(mydf$X1)
mydf

mymat = model.matrix(~ X1 -1 , data=mydf)
mymat

这将重新编码mydf

  X1
1  1
2  1
3  2
4  2

看起来像:

  X11 X12
1   1   0
2   1   0
3   0   1
4   0   1

很容易说明“假人”如何在线性回归中工作。假设您的模型看起来像(省略下标i为了方便):

y=β0+β1x+u,

在哪里β0是截距,x是一个连续特征,并且u是误差项。如果您有两个“ID”(例如 Star Wars 是或否),则在 Star Wars 时引入一个附加变量 =1,否则为 =0。称这个向量I.

现在你的模型看起来像:

y=β0+β1x+β2I+u.

当你预测一部非星球大战电影时(I=0) 你会这样做:

y^=β0^+xβ1^+0β2^.

如果是星球大战电影,你会这样做:

y^=β0^+xβ1^+1β2^.

所以在这种情况下,截距项是β0^+β2^β2^在这个简单的插图中,这正是《星球大战》与其他电影的不同之处。