常见特征种类
二值数据:只有两种取值的变量(不一定是0/1,但是可以映射到{ 0 , 1 } \{0,1\}{0,1}上)
类别数据:多类的数据,如星期一/星期二/…,不一定是非数值的
有序数据:如对电影的打分,分数之间是有大小关系的
标称(Nominal)数据:和类别数据很像,往往是非数值的,但是不具备类别概念,如人名
时序数据:带有瞬时值性质的数据,如日期、时间戳等。从这类数据可以分析随时间的趋势
特别注意区分类别数据特征和标称数据特征,有时标称特征可以删除,有时需要将同标称数据聚合到一起做处理。
以下df_train是全部训练数据,除各个特征外还含有从0开始索引的id列,以及只能取0/1的标签target列。df_train被拆分成了不含target的X,以及仅含target的目标y。
注意,特征编码的过程如果没有用到输出值target,往往需要将所有数据(全部的训练集和测试集)放在一起做,并且要在将训练集划分为实际训练集和验证集这一步骤之前。在后面的例子中只演示了编码的手段,没有考虑这些问题。
1 标号编码(Label encoding)
标号编码是最简单的编码方式,通过为特征中的每个类别设置一个标号(0,1,2…),来将非数值特征映射到自然数的数值空间上。
标号编码后,特征数量不变。
2 one-hot编码
one-hot编码已经用的很多了,不再赘述。一个特征有多少种取值,就会派生出多少个小特征,对每个样本而言其中只有一个是1对应于原特征取值,其它都取0,此即"one-hot"。
一种实现是用pandas的get_dummies(),但是很慢:
可以用sklearn预处理包下的OneHotEncoder;
one-hot编码后的特征会变得非常多,得到的是一个稀疏矩阵,其类型scipy.sparse.csr.csr_matrix(矩阵的稀疏表示)。
ne-hot编码可以视为二进制编码(n-hot)在n=1时的情况。
基于决策树的模型不要使用one-hot编码,会导致结点划分不均衡。
3 特征哈希(Feature hashing)
特征哈希先指定一个维度数,哈希后的值将映射到这个空间内。一个较一般的实现是对样本的每个特征取哈希,然后在对应的维度上将其加1,所得结果也是一个稀疏矩阵。
特征哈希除了用于特征编码,也可以用于特征降维。在sklearn.feature_extraction.FeatureHasher中显式指定参数n_features(默认是1048576)即可调整维度。
4 基于统计的类别编码
即将类别特征变成关于它的一种统计量,如将该类别变成该类别在样本中出现的次数,这在有些问题中是有效的
基于统计的类别编码不会改变特征数目。
5 对循环特征的编码
有写特征(如星期、月份)具备循环性质,一月到十二月,紧接着又回到一月。均匀的循环特征可以视为对圆的均匀分割:
可以用极坐标系上的角度来描述循环特征的每个位置,而角度可以用sin值和cos值唯一确定。
6 目标编码(Target encoding)
这是基于特征和目标target值之间的对应关系的一种编码,这类编码没法把测试集和训练集放一起编码(因为测试集没有target)。
下面对每个特征c的每个取值,将其变成使target为1的频率
7 K折目标编码(K-Fold Target encoding)
这是对6 目标编码的改进,可以起到抑制目标编码导致的过拟合的问题(测试数据中的特征到target的情况可能无法用训练数据根据类别的聚合和简单统计频率来描述)。K折目标编码将要编码的样本分成K份,每其中一份中的样本的目标编码,使用的是另外K-1份数据中相同类别的那些样本的频率值。
target encoding不会改变特征数目,但编码的计算开销会明显比其它编码方式大。








暂无数据