特征工程:连续数值v.s.离散类别的处理方法(二)

本文是学习数据科学家 Dipanjan Sarkar介绍特征工程的博客翻译文。
数值型数据是指连续型数据,离散型数据表示不同类目。整数和浮点数是连续型数值数据中最常见也是最常使用的数值型数据类型。即使数值型数据可以直接输入到机器学习模型中,仍需要在建模前设计与场景、问题和领域相关的特征。

###(一)连续型数值数据的特征工程处理方法

原始特征是直接从数据集中得到,没有额外的操作或处理。导出特征通常来自于特征工程,即我们从现有数据属性中提取的特征。

原始度量:用数值型变量来直接表示为特征,而不需要任何形式的变换或特征工程。通常这些特征可以表示一些值或总数。

数值:原始数值型特征——>describe()获得基本统计量。

记数:原始度量的另一种形式包括代表频率、总数或特征属性发生次数的特征。

二值化:基于要解决的问题构建模型时,通常原始频数或总数可能与此不相关。比如如果我要建立一个推荐系统用来推荐歌曲,我只希望知道一个人是否感兴趣或是否听过某歌曲。我不需要知道一首歌被听过的次数,因为我更关心的是一个人所听过的各种各样的歌曲。在这个例子中,二值化的特征比基于计数的特征更合适。

from sklearn.preprocessing import Binarizer
bn = Binarizer(threshold=0.9)
pd_watched =bn.transform([popsong_df['listen_count']])[0]

数据舍入:处理连续型数值属性如比例或百分比时,我们通常不需要高精度的原始数值。因此通常有必要将这些高精度的百分比舍入为整数型数值。这些整数可以直接作为原始数值甚至分类型特征(基于离散类的)使用。

相关性:对关于“输入特征变量“函数的输出建模(离散类别或连续数值)。在一些真实场景中,有必要试着捕获输入特征集中一部分特征变量之间的相关性,即组合特征、二度特征(平方特征)等

pf = PolynomialFeatures(degree=2,
interaction_only=False,include_bias=False)
res = pf.fit_transform(atk_def)

分区间处理数据:处理原始、连续的数值型特征问题通常会导致这些特征值的分布被破坏。这表明有些值经常出现而另一些值出现非常少。除此之外,另一个问题是这些特征的值的变化范围。直接使用这些特征会产生很多问题,反而会影响模型表现,因此出现了处理这些问题的技巧,包括分区间法和变换。分区间(Bining),也叫做量化,用于将连续型数值特征转换为离散型特征(类别)。可以认为这些离散值或数字是类别或原始的连续型数值被分区间或分组之后的数目。每个不同的区间大小代表某种密度,因此一个特定范围的连续型数值会落在里面。对数据做分区间的具体技巧包括等宽分区间(手动话分区间/基于数据舍入操作的每个年龄对应的区间)以及自适应分区间(使用数据分布来决定区间的范围,基于分位数的分区间方法是自适应分箱方法中一个很好的技巧)

####数据分布倾斜的负面影响
Log变化/Box-Cox变化:帮助稳定方差,始终保持分布接近于正态分布并使得数据与分布的平均值无关
Log变换倾向于拉伸那些落在较低的幅度范围内自变量值的范围,倾向于压缩或减少更高幅度范围内的自变量值的范围
Box-Cox变换的使用有一个前提条件,即数值型值必须先变换为正数(与 log 变换所要求的一样)。万一出现数值是负的,使用一个常数对数值进行偏移是有帮助的。

###(二)离散型数据的特征工程处理方法

离散型俗称分类数据(categorical data),机器学习算法不能直接处理分类数据,因此在开始为数据建模之前我们需要对数据进行一些工程处理和转换。

可分类的任意数据属性都是离散值,这意味着它们属于某一特定的有限类别。在模型预测的属性或者响应变量( response variables)中,经常被称为类别/标签。这些离散值在自然界中可以是文本或者数字(甚至是诸如图像这样的非结构化数据)。

分类数据有两大类——定序(Ordinal)和定类(Nominal)。定序分类的属性值则存在着一定的顺序意义或概念,比如衣服的按大小号分类。在任意定类分类数据属性中,这些属性值之间没有顺序的概念。

定序分类熟悉之间存在着先后顺序。一般来说,没有通用的模块或者函数可以根据这些顺序自动将这些特征转换和映射到数值表示,可以使用自定义的编码\映射方案。

对于文本标签这样复杂的分类数据问题,通常将这些分类值转换为数值标签的某种形式,然后对这些值应用一些编码方案。

将定类属性转换成更具代表性的数值格式,这样可以很容易被下游的代码和流水线所理解。利用 scikit-learn 将每个类别映射到一个数值(强制编码)。如果该列变量作为标签,可以直接使用;如果该列变量作为输入变量,需要**额外的one-hot编码(去掉强制编码过程的标签表示数值大小区别的无意义差异)**才能作为建模的特征。

from sklearn.preprocessing import LabelEncoder
gle = LabelEncoder()
genre_labels = gle.fit_transform(vg_df['Genre'])
#将每个风格属性映射到一个数值(0,1,2,3…)。

One-hot Encoding是另一套编码方案层,它要能为每个属性的所有不同类别中的每个唯一值或类别创建虚拟特征。也可以通过利用来自 pandas 的 to_dummies() 函数轻松应用独热编码方案。
考虑到任意具有 m 个标签的分类属性(变换之后)的数字表示,独热编码方案将该属性编码或变换成 m 个二进制特征向量(向量中的每一维的值只能为 0 或 1)。那么在这个分类特征中每个属性值都被转换成一个 m 维的向量,其中只有某一维的值为 1。
这里写图片描述 这里写图片描述
[外链图片转存失败(img-98a5Fwi7-1567342334377)(https://img-blog.csdn.net/20180124182128079?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3lteTAwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

####具有非常多种类别的特征
需要针对那些可能具有非常多种类别的特征(如 IP 地址),研究其它分类数据特征工程方案。区间计数方案是处理具有多个类别的分类变量的有效方案。使用基于概率的统计信息和在建模过程中所要预测的实际目标或者响应值,而不是使用实际的标签值进行编码。这个方案需要历史数据作为先决条件,并且要求数据非常详尽。(一个简单的例子是,基于过去的 IP 地址历史数据和 DDOS 攻击中所使用的历史数据,我们可以为任一 IP 地址会被 DDOS 攻击的可能性建立概率模型。使用这些信息,我们可以对输入特征进行编码,该输入特征描述了如果将来出现相同的 IP 地址,则引起 DDOS 攻击的概率值是多少。)

特征哈希方案(Feature Hashing Scheme)是处理大规模分类特征的另一个有用的特征工程方案。在该方案中,哈希函数通常与预设的编码特征的数量(作为预定义长度向量)一起使用,使得特征的哈希值被用作这个预定义向量中的索引**(值也要做相应的更新)。使用带符号的哈希函数,使得从哈希获得的值的符号被用作那些在适当的索引处存储在最终特征向量中的值的符号,这样能够确保实现较少的冲突和由于冲突导致的误差累积。哈希方案适用于字符串、数字和其它结构(如向量)。可以将哈希输出看作一个有限的 b bins 集合,以便于当将哈希函数应用于相同的值\类别时,哈希函数能根据哈希值将其分配到 b bins 中的同一个 bin(或者 bins 的子集)。可以预先定义 b 的值,该值是使用特征哈希方案编码的每个分类属性的编码特征向量的最终尺寸。(如果有一个特征拥有超过 1000 个不同的类别,设置 b = 10 作为最终的特征向量长度,那么最终输出的特征将只有 10 个特征。)

####哈希函数
哈希函数是一种映射,是从关键字到存储地址的映射。
对于不同的关键字ki、kj,若ki != kj,但H(ki) = H(kj)的现象叫冲突(collision) ,即不同的输入却有相同的输出。应该尽量避免冲突,因为冲突不仅会使查找的效率变低,还甚至会被攻击者利用从而大量消耗系统资源。

哈希算法广泛应用于很多场景,例如安全加密和数据结构中哈希表的查找,布隆过滤器和负载均衡(一致性哈希)等等。加密哈希算法的一个特点是,即使你知道哈希值,也很难伪造有同样哈希值的文本;而非加密哈希算法通常要比加密哈希算法快得多。如果数据量小,或者不太在意哈希碰撞的频率,甚至可以选择生成哈希值小的哈希算法,占用更小的空间。

murmurhash是 Austin Appleby于2008年创立的一种非加密哈希算法,适用于基于哈希进行查找的场景。murmurhash最新版本是MurMurHash3,支持32位、64位及128位值的产生。MurMur经常用在分布式环境中,比如Hadoop,其特点是高效快速,但是缺点是分布不是很均匀。
不同的应用场景对哈希的算法设计要求也不一样,但一个好的哈希函数应该具备以下三点:

  1. 抗碰撞性,尽量避免冲突。
  2. 抗篡改性,只要改动一个字节,其哈希值也会很大不同。
  3. 查找效率。

以上内容参考:
1)https://www.leiphone.com/news/201801/T9JlyTOAMxFZvWly.html
2)https://www.leiphone.com/news/201801/KTVu68zA6szteVmS.html
3)http://www.alloyteam.com/2017/05/hash-functions-introduction/

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值