如何处理监督机器学习问题中类别变化的一个热编码列?

数据挖掘 预测建模 分类数据 监督学习 一热编码
2022-03-04 05:47:38

设想:

我有以下关于参与者、游戏和获胜者的游戏数据,格式如下:

id  game        player  winner
-----------------------------------
1   Monopoly    Paul    Paul
1   Monopoly    Frank   Paul
1   Monopoly    Sandra  Paul
2   Monopoly    Peter   Katie
2   Monopoly    Paul    Katie
2   Monopoly    Erwin   Katie
2   Monopoly    Katie   Katie

所以上表显示了两场独占比赛的信息,第一场是弗兰克、保罗(获胜者)和桑德拉;第二个是彼得、保罗、欧文和凯蒂(获胜者)。

我的问题是:如果我想预测一场比赛的获胜者,我将如何转换数据以使每一行对应一个会话?

理念一

我最初的想法当然是对“播放器”功能进行热编码:

id  game        Paul    Frank   Sandra  Peter   Erwin   Katie   winner
-------------------------------------------------------------------------------
1   Monopoly    1       1       1       0       0       0       Paul
2   Monopoly    1       0       0       1       1       1       Katie

这样,使用简单的模型就可以很容易地预测目标。

但是,如果我想预测与玩家 Sandra、Erwin、Katie 和 Tim(新玩家)的新垄断会话的获胜者,则转换后的(即一个热编码的)数据将多一列。该列对模型是未知的,因此无法处理。

想法 2

以想法 1 为例,添加一个“新玩家”二进制虚拟列(新玩家名称无论如何都不包含任何有用的信息),存储获胜者,使用新的(附加)信息重新训练模型。但是,如果我与多个新玩家一起玩,这将不起作用(除非我添加多个虚拟列,这将非常不灵活)。

想法 3

大富翁可以玩 2 到 8 名玩家,所以我可以将表结构更改为以下内容:

id  game        Pl_0    Pl_1    Pl_2    Pl_3    Pl_4    Pl_5    Pl_6    Pl_7    winner
---------------------------------------------------------------------------------------
1   Monopoly    Paul    Frank   Sandra  None    None    None    None    None    Paul
2   Monopoly    Peter   Paul    Erwin   Katie   None    None    None    None    Katie

然而,这种方法的问题当然是结构假设 the 是玩家占据哪个“座位”背后的语义含义:在第 1 场比赛中,保罗是第 0 场球员(即 is 的值Pl_0"Paul",但在第 2 场比赛中,保罗是玩家 1(即 的值为Pl_1"Paul"在这种结构中,模型无法知道它没有(语义)差异,无论 Paul 是玩家 1 还是玩家 2。此外,不能像那样映射可以由 10 名玩家玩的游戏。所以很快就拒绝了这个想法。或者有什么办法可以克服这个问题?

最后的问题

我如何能够预测游戏的获胜者,这样

  • 该模型可以处理新的(看不见的)玩家
  • 该模型可以处理具有不同数量玩家的多个游戏
1个回答

机器学习的主要思想是您的训练数据类似于测试数据。如果该假设不成立,则保证失败的可能性很大。

鉴于此,即使解决方案不好,您仍然可以处理看不见的类别,并且使用 One Hot Encoding

类别编码器库中,您具有以下超参数和以下选项

handle_unknown:str 选项为“error”、“return_nan”、“value”和“indicator”。默认值为“值”。警告:如果使用指示符,如果变换矩阵有未知类别,将添加一个额外的列。在某些情况下,这可能会导致尺寸发生意外变化。

但是,考虑到您的问题和数据,我不确定您是否会比做一些描述性统计更成功。