均值编码-处理高基数类别属性的一个方法

转换类别属性量的一般方法

数据分析中经常会遇到类别属性,比如日期,性别,街区编号,IP地址等. 绝大部分数据分析算法是无法直接处理这类变量,需要先把他们处理成数值型量.

  1. 取消字符
    参考 sklearn.preprocessing.LabelEncoder. 加入一个属性有 N 个不同的值,通过这个函数将把它转换到 [ 0 , N 1 ] 上的整数. 转换后的属性具有了次序和可比较性,这个两个属性源属性值未必具备,是利是弊视具体应用而定.

  2. 编码
    离散型数值对某些算法是可以进行训练的,比如决策树, 但是对于SVM/神经网络而言依然不合适,我们需要对其进行编码.

    • one-hot-encoding
      参考 sklearn.preprocessing.OneHotEncoder
      离散型属性有 N 个不同的值,则可以用长度为 N 二进制序列 ( b 0 , b 1 , b 2 , . . . , b N 1 ) 表示, b i 有且只有一个为 1 ,其他为 0 . 假设离散属性只有三个不同的值
      { A , B , C }
    属性值 二进制序列
    A 001
    B 010
    C 100

    one-hot-encoding后会增加 N

    • 均值编码
      如上所述, one-hot-encoding后会增加 N 个属性列,如果 N 很大, one-hot-encoding是无法接受的. 这是可以考虑尝试均值编码,节省内存.

均值编码

均值编码是一种参考目标值的编码方式, 2001年在文献中提出,在数据分析中得到广泛应用.

分类问题

对于 C 分类问题,均值编码后只需要增加 C 1 个属性列,如果 C 远远小于 N ,则相对one-hot-encoding可以节省很多内存. 其出发点是用概率 P ( y = y i | x = x i ) 代替属性值 x , 其中 x 表示属性值, y 表示类别值. 但实际问题中,经常会遇到 x = x i 对应的样本数目比较少,导致对 P ( y = y i | x = x i ) 的计算不准确. 引入先验概率 P ( y = y i ) ,公式转换成

f ( y j , x i ) = λ ( n i ) P ( y = y j | x = x i ) + ( 1 λ ( n i ) ) P ( y = y j )

其中 j [ 0 , C ) , n i 是训练集中 x i 的样本个数, λ ( n i ) [ 0 , 1 ] 负责计算两个概率值的可靠性,针对应用有不同的定义方法,如下是一个例子
λ ( n ) = 1 1 + e n k

其中 k 是一个可调参数,当 x 在训练集中出现次数 n = k 时, λ ( n ) = 0.5 ,两个概率的可靠性相等,随者 n 的增大,先验概率 P ( y = y i ) 的可靠性逐渐降低.

回归问题

回归问题同样可以使用均值编码,只需要把概率换成均值

f ( y , x i ) = λ ( n i ) x = x i y n i + ( 1 λ ( n i ) ) y N

其中 x = x i y n i 表示 x = x i 对应的 y 均值, y N 是整个训练集上 y 的均值

猜你喜欢

转载自blog.csdn.net/z0n1l2/article/details/80791352