8.4.2 字符串数据和 one-hot 编码
机器学习模型是针对数值型数据进行训练,但是模型不能从字符串数据中学习。如果我们面对的是一个字符串,比如地址中的街名(长安街),那么我们该怎么办呢?这时候就需要特征工程把字符串数据转化为数值型数据。如果见到的是字符串值,我们通常可以使用独热(one-hot)编码,将其转化为特征向量。独热编码针对我们可能见到的每个字符串都提供了一个唯一的数字。例如“长安街”,我们就指定为1,其他就为0。我们可以将这个独热编码用作表示字符串的特征向量。独热编码要求:只有一个字符串值为1,其他都为0。
8.4.3 枚举数据(分类数据)
分类(categorical)特征具有一些枚举数据,即一个离散数据的集合。比如,一个性别的特征可能只包含三个值:{“男”,“女”,“未知”}。我们可能想到把这些数据编码为0、1、2。但是,在机器学习模型中,一般情况下,把每个分类数据表示为一个单独的布尔值。在上面的性别例子中,模型可能使用3个不同的布尔特征。
$\mathbf { X } _ { 1 } \mathbf { : }$ 是男的?
$\mathbf { \boldsymbol { x } } _ { 2 } { : }$ 是女的?
• $\mathrm { X } _ { 3 } \dot { : }$ 未知?
8.4.4 好特征
那么,什么样的特征才是好特征呢?首先,一个特征应具有非零值,并且特征值在数据集中至少出现5次或更多次。这样模型才能了解这个特征值和标签之间的关系。如果一个特征在具有非零值的情况下出现的次数十分少,或仅出现过一次,恐怕就不是一个值得使用的好特征,应该在预处理步骤中过滤掉。比如,房屋类型特征变量,针对某个具体的房屋类型,样本数据有很多。那么,房屋类型特征可能是一个好的特征。再比如,房屋编号可能是一个差的特征,因为每个房屋编号可能只有一个样本数据,那么模型就无法从房屋编号上学到什么东西。
其次,特征应具有清晰明显(直接)的意义。这样一来,我们就可以方便地进行有效的检查。例如,以年为单位来计算一座房子的年龄要远远好于以秒为单位来计算。这方便以后排除错误和进行推理。例如,我们定义一个特征,作用是告诉我们一座房子上市了多少天才出售。有些工程师喜欢用特殊值-1来表示这座房子从未上市出售过。对于机器学习来说,这不是一个好的设计。好的主意是定义一个指示型特征,让这个特征采用布尔值,以便表示是否已定义“上市出售天数”特征。借助这种方式,原来的特征“上市出售天数”可以保持0\~n的自然单位。
人工智能与大数据技术导论
250