我主要处理具有数字特征尺寸,高度,重量,距离,时间,字袋/ tf-idf等的分类问题。但是,我开始考虑使用具有分类功能的更多数据集。这些特征的例子是种族,流派(书籍或电影),颜色,形状,城市名称,学校等。如果我有一个名为长度的分类变量,其级别为小,中,大,则将其重新编码为1,2,3,因为已经存在一些层次结构或顺序。但是,我对编码变量没有自然转换到数字刻度或已经具有内在的有序感而感到困惑。
有了类似颜色的东西,想象一下选项是红色,绿色和蓝色。将红色变为1,将绿色变为2,将蓝色变为3是没有意义的,因为这意味着红色在技术上更接近"绿色比蓝色,在这种情况下,颜色要排名还是有距离是什么意思?同样地,想象一下我们有一个简化的流派列表(浪漫,喜剧,戏剧,科幻,行动)。如果我把它编码为浪漫 - 1,喜剧 - 2,戏剧 - 3,科幻 - 4,动作 - 5,这意味着在这种表现中浪漫是"更接近"或者更像是喜剧而不是戏剧,这真的没有意义。我觉得通过这样做,我们人为地创造了尚未存在的结构和意义。
如果您认为以这种方式编码是完全可以接受的,我希望被证明是错误的(使用它会更方便和简单) - 请解释原因。如果我的解释是正确的,你能解释我如何解决这个问题吗?你做过的事情(或普遍接受的做法)有哪些例子?我意识到二进制变量与上面的例子相当简单,但如果我有更多选项,则不一定如此。注意:我主要使用Python,Pandas和Sklearn for ML。如果您建议其他可以帮助解决此问题的工具,请与我们联系。
谢谢!
答案 0 :(得分:1)
1 - 您可以使用OneHotEncoder将分类要素转换为二进制矩阵,如:
0 -> 0 0 1
1 -> 0 1 0
2 -> 1 0 0
如果您有这么多类别,此解决方案可能不可行,因为要素矩阵将变得非常大。在这种情况下,我通常做的如下:如果类别分布不均匀,(例如,90%的样本属于5个类别,其他属于剩余的5000个类别)我将所有这5000个类别转换为一个名为的新类别,其他。现在我只有6个类别,可以像往常一样执行一个热编码。
如果你有很多类别,并且样本在各个类别之间平均分配,那么你就不能删除类别或将它们合并为一个。
2 - 按原样使用它们。如果您的分类可以处理分类功能,那么您可以直接使用它们。我假设DecisionTrees可以处理数字和分类数据。
3 - 转换为数字特征。大多数时候这是不可能的。我们假设你的特征值是NORTH,SOUTHEAST,NORTHWEST等等。在这种情况下,将它们转换为坐标,如(0,1)表示NORTH,(1,-1)表示SOUTHEAST,(-1,1表示)表示NORTHWEST可以。当然,这种转换在问题上应该是合乎逻辑的。
答案 1 :(得分:0)
我建议通过pd.get_dummies
随时提供一个热门编码。明显的缺点是# added features = # possible classes of initial feature
,但没有必要定义任何类型的排序。
但是,请查看this惊人的教程。如果你想得到更多的幻想,请看Category Encoders。