既然Features对机器学习的效果有着重要的影响,这一节,我们就来讨论下如何挑选好的Features,它们都有哪些共性呢?
在一开始识别兔子和老鼠的例子中,我们选择了尾巴和耳朵的长度。现在,我们换一组Features,例如:身体的长度和眼睛的颜色:直觉告诉我们,体型上,老鼠一般都比兔子小,并且,老鼠的眼睛是黑色的,而兔子的眼睛是红色的。

从一个物种相关的Feature开始
然而,对于区分物种这个目标,如何理解这两个Features的价值呢?我们先来从理性的角度评估下身长这个Feature,为了可视化结果,我们新建一个叫做good-features.py
的文件,然后添加下面的代码:
import numpy as np
rabbits = 500
rats = 500
rabbit_length = 15 + 4 * np.random.randn(rabbits)
rat_length = 10 + 4 * np.random.randn(rats)
这里,rabbit_length
和rat_length
是两个标准正态分布数列,它们的期望值分别是15和10,也就是我们经验中兔子和老鼠的体长,方差是4,用于对范围进行动态调整。
然后,我们用下面的代码把这两个数列打印在一个直方图上并显示出来:
import matplotlib.pyplot as plot
plot.hist([rabbit_length, rat_length], stacked = True, color=['r', 'b'])
plot.show()
就会看到类似这样的结果:

其中,我们设置了红色的部分表示兔子,蓝色的部分表示老鼠。当它们的体型值位于图两侧的时候,区分是非常容易的。例如,当体长是5的时候,蓝色的区域占据了绝大部分,我们可以比较自信的认为,是老鼠的可能性很高;而当体长大于20之后,我们几乎可以断定这是一只兔子。并且,分布在直方图左侧的红色,和右侧的蓝色也很好的诠释了物种的多样性。
但是,当体长在13到16这个区间的时候,你就会发现,老鼠和兔子几乎各占一半,我们完全无法通过体长来进行判断。这就说明,我们选取的体长这个Feature,在某些时候,可以较好的进行识别,但这还不充分,我们仍旧需要更多的Feature来辅助。
当然,并不是说体长这个Feature不好,而是说,作为一个和物种相关的属性,我们不足以单独依靠它让机器来认识兔子和老鼠。这也很正常,否则机器学习就可以退化成一个无比巨大的if...else if...
语句了。
物种无关的属性不是好的Feature
接下来,就轮到眼睛的颜色了,用红色和黑色来区分兔子和老鼠是一个好的Feature么?也许下面这张图就可以直接告诉你答案:

没错,兔子和老鼠的眼睛都有可能是红色和黑色,这是一个和物种无关的属性。举一个极端的例子,可能我们选择学习的样本里,黑色眼睛的兔子和红色眼睛的老鼠的比例也接近1:1。

那么,在体长也相同的情况下,这就对我们学习动物的类型完全没帮助了,当我们把这种Feature引入到学习模型的时候,不仅不利于改进学习效果,甚至会误导机器学习的过程。
彼此相关的Features不是好的选择
除了让Feature和物种相关的选择直接相关之外,我们还要让多个Features之间相互独立,互不干扰。例如,假设之前我们衡量体长的Feature用厘米作为单位,现在再添加一个Feature用毫米计算体长有帮助么?
当然,在一些非常特别的情况,毫米提供的精度可以让我们区分这两类动物。但绝大多数时候,不仅机器学习算法无法有效的区分用厘米和毫米表现的体长数据,在多个Features的组合中,存在着同一个属性的两种不同维度,机器学习算法甚至会错误计算这个属性的重要性,进而给我错误的结果。因此,不要让多个Features的组合中,存在冗余的内容。
尽可能选择简单易懂的Feature
最后一个要注意的,是尽可能让Feature的选择直观易懂。例如,我们要进一步在兔子中,区分英国安哥拉、法国安哥拉和大型安哥拉,地域是一个显而易见的Feature,但我们可以有两种不同的表达方式:
[图片上传失败...(image-2689bd-1583977302451)]
从图中可以看到,第一个Feature,采用了国家的名称;第二个Feature,采用了国家的经纬度;尽管它们同样可以表达安哥拉兔的产地,但明显直接使用名称对人来说更容易理解和收集,对于计算机来说,训练它需要的数据集也要少的多。并且,当计算机经过学习给出我们一个兔子的学习结果的时候,也更方便我们确认。
网友评论