我正在开发一个模型来预测电影的收入。训练集中的特征之一包含电影所属系列的 ID。假设星球大战系列的 ID 为 1,那么“绝地归来”电影该列中的对应值为 1。
如果电影属于该系列,我应该为每个系列创建一个单独的列并添加值 1,还是只保留包含 id 的现有列就可以了?
我正在开发一个模型来预测电影的收入。训练集中的特征之一包含电影所属系列的 ID。假设星球大战系列的 ID 为 1,那么“绝地归来”电影该列中的对应值为 1。
如果电影属于该系列,我应该为每个系列创建一个单独的列并添加值 1,还是只保留包含 id 的现有列就可以了?
您不应保留该列,因为相似的 id 值在语义上不相关。也许深度神经网络可以处理这个问题,但线性模型绝对不能。
有两个选项,具体取决于列的基数(唯一条目/类别的数量)。
如果基数很低,你应该对系列进行一次热编码,每个系列一列,就像你建议的那样。但是,在您的数据集中,可能有很多系列,您的数据最终会包含太多的特征。请参阅此图像(来源),如果您进行一次热编码,则每个类别都需要一列/特征。

如果基数很高,您应该找到 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
很容易说明“假人”如何在线性回归中工作。假设您的模型看起来像(省略下标为了方便):
在哪里是截距,是一个连续特征,并且是误差项。如果您有两个“ID”(例如 Star Wars 是或否),则在 Star Wars 时引入一个附加变量 =1,否则为 =0。称这个向量.
现在你的模型看起来像:
当你预测一部非星球大战电影时() 你会这样做:
如果是星球大战电影,你会这样做:
所以在这种情况下,截距项是和在这个简单的插图中,这正是《星球大战》与其他电影的不同之处。