在sklearn中,在构建具有分类特征的决策树时,单热编码如何帮助?

时间:2018-03-16 15:03:29

标签: python scikit-learn decision-tree

根据here,sklearn无法处理分类变量。并建议使用单热编码来处理这些功能。但是,我不明白单热编码怎么能帮忙?例如,country = USA或China或England转换为country = USA为true或false,新功能'country == USA'毕竟仍然是绝对的(只能取0或1)。这不会改变任何事情。 Sklearn仍然将0或1视为数值。

对于一个真实的例子here,我转换了数据:

human,warm-blooded,hair,yes,no,no,yes,no,mammal
python,cold-blooded,scales,no,no,no,no,yes,reptile
salmon,cold-blooded,scales,no,yes,no,no,no,fish
whale,warm-blooded,hair,yes,yes,no,no,no,mammal
frog,cold-blooded,none,no,semi,no,yes,yes,amphibian
komodo dragon,cold-blooded,scales,no,no,no,yes,no,reptile
bat,warm-blooded,hair,yes,no,yes,yes,yes,mammal
pigeon,warm-blooded,feathers,no,no,yes,yes,no,bird
cat,warm-blooded,fur,yes,no,no,yes,no,mammal
leopard shark,cold-blooded,scales,yes,yes,no,no,no,fish
turtle,cold-blooded,scales,no,semi,no,yes,no,reptile
penguin,warm-blooded,feathers,no,semi,no,yes,no,bird
porcupine,warm-blooded,quills,yes,no,no,yes,yes,mammal
eel,cold-blooded,scales,no,yes,no,no,no,fish
salamander,cold-blooded,none,no,semi,no,yes,yes,amphibian
gila monster,cold-blooded,scales,no,no,no,yes,yes,

进入

[[1. 0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 1. 0. 0. 0. 1. 0. 0. 0.]
 [1. 0. 1. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 1. 1. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 1. 0. 1. 0. 1. 1. 0. 1. 0. 0. 0. 1. 0. 0. 0.]
 [1. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 0. 1. 0. 0.]
 [1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 1.]
 [0. 1. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0.]
 [0. 1. 1. 0. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 0. 0. 0. 0. 0.]
 [1. 0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 1. 0. 0. 1. 0. 0. 0. 0.]
 [1. 0. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 0. 0. 0. 0. 0.]
 [1. 0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 1. 0.]
 [1. 0. 0. 0. 1. 1. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 0. 1. 0. 0.]
 [1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 1.]]

并构建一个像

这样的决策树

decision tree(click to open) 分裂点仍然是荒谬的(比如Give Birth = no< = 0.5)。所以我不认为单热编码可以帮助处理分类数据。

1 个答案:

答案 0 :(得分:0)

首先,我们还必须记住,SKlearn可以only build binary tree。例如,有一种颜色特征,对于不同的颜色需要0,1,2,3,4,5。我们使用颜色< = 2.5分割颜色特征,然后0,1,2是左叶,3,4,5是右叶,这不是我们想要的,因为特征中没有顺序。如果确实有订单,我认为我们可以不用单热编码。

单热编码可以表现为Sklearn可以处理分类数据。例如,如果数据中有一个真实的特征“country == USA”,它取0或1并且它被用作分裂特征,那么叶子是country == USA是0而country == USA是1。虽然Sklearn仍然使用数字分裂点,例如0.5(分裂点必须介于0和1之间,否则它将不是一个好的分裂),如果country == USA< = 0.5进入左叶,否则进入右叶,'country == USA is 0'将转到左侧叶子,'country == USA is 1'将转到右侧,这与根据0分割“country == USA”功能的效果相同1.