机器学习需要从数据里面学习,可不是所有数据都可以进行学习。一般在做训练之前,首先需要把raw data转换成特征向量(Feature vector),如下图所示:

很多ML Model都需要特征向量是实数的vector,方便训练时候做数学运算。根据raw data的类型有不同的转换方法:
- 数值型:直接转换成real number,什么时候做cap/transform?
- 类型值:可以定义一个词典,里面包含所有可能的类型,把某个类型映射到一个具体的数,如果出现没有定义的类型,则把这种类型算作其他。譬如说上图中
street_name
这个feature,就可以建一个字典,包含可能的街道名字,如
{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}
这样,就可以把街道名映射到number,例如
- 映射 'Charleston Road' 到 0
- 映射 'North Shoreline Boulevard' 到1
- 映射'Shorebird Way' 到2
- 映射'Rengstorff Avenue' 到3
- 映射所有其他的到4.
通过直接使用index的方式,虽然可以用字符串的feature做数学运算了,但实际做的时候会有问题;
- 因为模型对
stream_name
这个feature学出来一个weight,如果模型希望能够根据stream_name
来预测房屋价格,那么使用这个feature得到的结果,就是房屋价格和街道名字是线性相关的,而且这个价格是和街道名线性相关的。 -
streat_name
不能采用多个值;
为了解决这两个限制,需要创建一个二进制vector来表示这个feature,这种表示方式叫做one-hot encoding
。下图展示了one-hot encoding的编码方式:

这种方式对于每个街道名字创建了一个Boolean变量,用来表示这个房屋在哪个街道上。如果一个房子在Shorebird Way, 那么模型就可以只用Shorebird Way对应的权重来去做计算。
当然如果你的数据里面有成千上万个街道名字,那么用这种方式就不太合适了。这种情况下通常会用sparse representation,也就是只把non-zero的值存储起来,然后依旧是一个独立的model weight会被应用到每个街道名字上。

网友评论