特征工程(一)数据预处理

来源:机器学习AI算法工程  公众号: datayx

 

1、二值化

当某个特征数据分布偏态明显时(如下图:99%的数据为24以内,最大值达到9667),将数据做二值化处理,如:将小于1的数据记为0,将大于1的数据记为1。

2、固定宽度装箱

对于固定宽度装箱, 每个 bin 都包含一个特定的数值范围。范围可以是定制设计或自动分割, 它们可以线性缩放或指数缩放。例如, 我们可以将一个人的年龄分组为十年: 0-9 岁归纳到bin 1, 10-19 年归纳到 bin 2 等。要从计数映射到 bin, 只需除以 bin 的宽度并取整部分。

也经常看到定制设计的年龄范围更适合于生活的阶段:

  • 0-12 岁

  • 12-17 岁

  • 18-24 岁

  • 25-34 岁

  • 35-44 岁

  • 45-54 岁

  • 55-64 岁

  • 65-74 岁

  • 75 岁以上

当数字跨越多个数量级时,最好用10个幂(或任何常数的幂)来分组:0-9、10-99、100-999、100-9999等。容器宽度呈指数增长,从O(10)、O(100)到O(1000)和以上。要从计数映射到bin,取计数的log值。指数宽度的划分与对数变换非常相关,我们在“对数变换”中讨论。

import numpy as np
small_counts = np.random.randint(0,100,20)
small_counts

array([89, 25, 56, 10, 18, 72, 68, 36, 88,  1, 28, 44,  8, 51, 11, 20, 85,
       38,  2, 10])

# 除以10再取整
np.floor_divide(small_counts,10)

array([8, 2, 5, 1, 1, 7, 6, 3, 8, 0, 2, 4, 0, 5, 1, 2, 8, 3, 0, 1],
      dtype=int32)

# 取对数取整
large_counts = [1223,3443,2342,4534,2213,4442,1000,3333]
np.floor(np.log10(large_counts))

采用pd.cut()等间距分箱

cut将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的

传入bins参数

>>> pd.cut(factors, 3) #返回每个数对应的分组

[(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]]

Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]]


>>> pd.cut(factors, bins=[-3,-2,-1,0,1,2,3])

[(2, 3], (0, 1], (1, 2], (-1, 0], (-3, -2], (2, 3], (-1, 0], (0, 1], (1, 2]]

Categories (6, interval[int64]): [(-3, -2] < (-2, -1] < (-1, 0] < (0, 1] (1, 2] < (2, 3]]


>>> pd.cut(factors, 3).value_counts() #计算每个分组中含有的数的数量

Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]]

(-2.117, -0.69] 1

(-0.69, 0.732] 4

(0.732, 2.154] 4
  1.  

传入lable参数

>>> pd.cut(factors, 3,labels=["a","b","c"]) #返回每个数对应的分组,但分组名称由label指示

[c, b, c, b, a, c, b, b, c]

Categories (3, object): [a < b < c]


>>> pd.cut(factors, 3,labels=False) #返回每个数对应的分组,但仅显示分组下标

[2 1 2 1 0 2 1 1 2]

 

传入retbins参数

>>> pd.cut(factors, 3,retbins=True)# 返回每个数对应的分组,且额外返回bins,即每个边界值

([(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]]

Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]], array([-2.11664951, -0.69018126, 0.7320204 , 2.15422205]))
参数说明
xarray,仅能使用一维数组
binsinteger或sequence of scalars,指示划分的组数或指定组距
labelsarray或bool,默认为None。当传入数组时,分组的名称由label指示;当传入Flase时,仅显示分组下标
retbinsbool,是否返回bins,默认为False。当传入True时,额外返回bins,即每个边界值。
precisionint,精度,默认为3

 

3、分位数分箱

固定宽度装箱很容易计算。但是如果计数有很大的差距, 那么将会有许多空的垃圾箱没有数据。该问题可以通过基于数据分布的垃圾箱自适应定位来解决。这可以使用分发的分位数来完成。

分位数是将数据划分为相等部分的值。例如, 中位数将数据分成一半;一半的数据是较小的, 一半大于中位数。分位数把数据分成几个部分, 十分位数把数据划分成十份。

为了计算分位数和映射数据到分位数箱,我们可以使用 Pandas 库。 pandas.DataFrame.quantile 和 pandas.Series.quantile 用于计算分位数。pandas.qcut将数据映射到所需数量的分位数。

>>> factors = np.random.randn(9)

[ 2.12046097 0.24486218 1.64494175 -0.27307614 -2.11238291 2.15422205 -0.46832859 0.16444572 1.52536248]

pd.qcut()

qcut是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的

传入q参数


>>> pd.qcut(factors, 3) #返回每个数对应的分组

[(1.525, 2.154], (-0.158, 1.525], (1.525, 2.154], (-2.113, -0.158], (-2.113, -0.158], (1.525, 2.154], (-2.113, -0.158], (-0.158, 1.525], (-0.158, 1.525]]

Categories (3, interval[float64]): [(-2.113, -0.158] < (-0.158, 1.525] < (1.525, 2.154]]


>>> pd.qcut(factors, 3).value_counts() #计算每个分组中含有的数的数量

(-2.113, -0.158] 3

(-0.158, 1.525] 3

(1.525, 2.154] 3

传入lable参数

>>> pd.qcut(factors, 3,labels=["a","b","c"]) #返回每个数对应的分组,但分组名称由label指示

[c, b, c, a, a, c, a, b, b]

Categories (3, object): [a < b < c]


>>> pd.qcut(factors, 3,labels=False) #返回每个数对应的分组,但仅显示分组下标

[2 1 2 0 0 2 0 1 1]

传入retbins参数

>>> pd.qcut(factors, 3,retbins=True)# 返回每个数对应的分组,且额外返回bins,即每个边界值

[(1.525, 2.154], (-0.158, 1.525], (1.525, 2.154], (-2.113, -0.158], (-2.113, -0.158], (1.525, 2.154], (-2.113, -0.158], (-0.158, 1.525], (-0.158, 1.525]]

Categories (3, interval[float64]): [(-2.113, -0.158] < (-0.158, 1.525] < (1.525, 2.154],array([-2.113, -0.158 , 1.525, 2.154]))

 

参数说明
xndarray或Series
qinteger,指示划分的组数
labelsarray或bool,默认为None。当传入数组时,分组的名称由label指示;当传入Flase时,仅显示分组下标
retbinsbool,是否返回bins,默认为False。当传入True时,额外返回bins,即每个边界值。
precisionint,精度,默认为3

4、对数转换 

例子2-8。使用对数转换 YELP 评论数预测平均商户评级

 

从实验的结果来看, 两个简单的模型 (有对数变换和没有对数变换) 在预测目标时同样不好, 而有对数变换的特征表现略差。真令人失望!这并不奇怪, 他们都不是很好, 因为他们都只使用一个功能。但是, 人们本来希望日志转换的功能执行得更好。

让我们看看对数转换在线新闻流行数据集上如何表现。

例子2-9。利用经过对数转换在线新闻数据中的词数量预测文章流行度

 

置信区间仍然重叠,但具有对数变换特征的模型比没有对数变换的表现更好。为什么对数转换在这个数据集上更成功?我们可以通过观察输入特征和目标值的散点图来得到线索。如图2-9的底部面板所示,对数变换重塑了X轴,将目标值(大于200000个份额)中的大离群值进一步拉向轴的右手侧。这给线性模型在输入特征空间的低端更多的“呼吸空间”。没有对数转换(上部面板),在输入值变化下非常小的情况下,模型有更大的压力下适应非常不同的目标值。

示例2-10。可视化新闻流程度预测问题中输入输出相关性。

 

 

Scatter plot of number of words (input) vs. number of shares (target) in the Online News dataset. The top plot visualizes the original feature, and the bottom plot shows the scatter plot after log transformation.

将此与应用于YELP评论数据集的相同散点图进行比较。图2-10看起来与图2-9非常不同。在1到5,步长0.5的区间,平均星级是离散的。高评论计数(大致>2500评论)与较高的平均星级评级相关。但这种关系远不是线性的。没有一种清晰的方法可以根据输入来预测平均星级。从本质上讲,该图表明,评论数及其对数都是平均星级的不良线性预测因子。

例2-11。可视化 Yelp 商户评论预测中输入与输出的相关性。

5、Box-cox变换

功率变换:对数变换的推广

 

A rough illustration of the Poisson distribution. λ represents the mean of the distribution. As λ increases, not only does the mode of of the distribution shift to the right, but the mass spreads out and the variance becomes larger. The Poisson distribution is an example distribution where the variance increases along with the mean.

 

 

Box-Cox transforms for different values of λ.

只有当数据为正值时, Box-Cox 公式才能工作。对于非正数据, 可以通过加上固定常量来移动数值。当应用 Box-Cox 变换或更一般的功率变换时, 我们必须确定参数 λ 的值。这可能是通过最大似然(找到的λ,使产生的变换信号的高斯似然最大) 或贝叶斯方法。完全介绍 Box-Cox 和一般功率变换的使用超出了本书的范围。感兴趣的读者可以通过 Jack Johnston 和John DiNardo (McGraw Hill) 编写的Econometric Methods 找到更多关于幂转换的信息。幸运的是, Scipy 的数据包包含了一个 Box-Cox 转换的实现, 其中包括查找最佳变换参数。

例子2-12。Yelp商户评论数的 Box-Cox 变换。

提供了原始和转换评论数分布的可视化比较。

 

例2-13。可视化评论数的原始、对数转换和 Box-Cox 转换的直方图。

 

 

 

Box-Cox transformation of Yelp business review counts.

概率图是一种直观地比较数据分布与理论分布的简单方法。这本质上是观察到散点图的与理论分位数。图2-14显示YELP评论数的原始数据和转换后数据相对正态分布的概率图。由于观测数据是严格正的,高斯可以是负的,所以分位数在负端上永远不会匹配。所以我们关注的是正数这的一边。在这方面,原始评论数明显比正常分布更重尾。(有序值上升到4000,而理论位数仅延伸到4)。简单的对数变换和最优的 Box-Cox 变换都使正尾部接近正态分布。最优的 Box-Cox 变换比对数变换更缩小尾部,由于尾部在红色对角线等值线下平展可以明显看出。

例子 2-14。原始和变换后的数据相对正态分布的概率图。

 

Comparing the distribution of raw and transformed review counts against the Normal distribution.

 

 

6、特征缩放与归一化

某些特征的值有界的,如纬度或经度。其他数值特征 (如数量) 可能会在无界的情况下增加。那些关于输入是平滑函数的模型, 如线性回归、逻辑回归或任何涉及矩阵的东西, 都受输入的数值范围影响。另一方面, 基于树的模型不太在意这个。如果你的模型对输入特征的数值范围敏感, 则特征缩放可能会有所帮助。顾名思义, 特征缩放会更改特征值的数值范围。有时人们也称它为特征规范化。功能缩放通常分别针对单个特征进行。有几种常见的缩放操作, 每个类型都产生不同的特征值分布。

Min-max缩放

设X是一个单独的特征值(即,在某些数据点中的一个特征值),以及 min(x) 和 max(x) ,分别是整个数据集上该特征的最小值和最大值。Min-max缩放压缩(或拉伸)所有特征值到[0, 1 ]的范围内。图2-15演示了这个概念。最小最大尺度的公式是

 

减去特征 (所有数据点) 的平均值并除以方差。因此, 它也可以称为方差缩放。缩放后的特征的平均值为0, 方差为1。如果原始特征具有高斯分布, 则缩放特征为标准高斯。图2-16 包含了标准化的说明。

 

 

Illustration of feature standardization

不要中心化稀疏数据

最小最大缩放和标准化都从原始特征值中减去一个数量。对于最小最大缩放, 移动量是当前特征的所有值中最小的。对于标准化, 移动的量是平均值。如果移动量不是零, 则这两种转换可以将稀疏特征(大部分值为零)的向量转换为一个稠密的向量。这反过来会给分类器带来巨大的计算负担, 取决于它是如何实现的。词袋是一种稀疏表示, 大多数分类库都对稀疏输入进行优化。如果现在的表示形式包含了文档中没有出现的每个单词, 那就太可怕了。请谨慎对稀疏特征执行最小最大缩放和标准化操作。

L2 normalization

这项技术通过所谓的 L2 范数 (也称为欧几里德范数) 正常化 (划分) 原始特征值。

Illustration of L2 feature normalization

 

数据空间与特征空间

请注意,图2-17中的说明是在数据空间中,而不是特征空间。还可以对数据点进行L2归一化,而不是特征,这将导致具有单位范数(范数为1)的数据向量。不管缩放方法如何,特征缩放总是将特征除以常数(也称为归一化常数)。因此,它不会改变单特征分布的形状。我们将用在线新闻文章标记计数来说明这一点。

例子 2-15。特征缩放示例。

 

我们也可以可视化用不同的特征缩放方法后的数据的分布。如图2-18所示,与对数变换不同,特征缩放不会改变分布的形状;只有数据的规模发生变化。

例2-16。绘制原始数据和缩放数据的直方图。

 

 

Original and scaled news article word counts. Note that only the scale of the x-axis changes; the shape of the distribution stays the same with feature scaling.

在一组输入特征在比例上差异很大的情况下,特征缩放非常有用。例如,一个流行的电子商务网站的每日访问者数量可能是十万,而实际销售额可能是几千。如果这两种功能都投入到模型中,那么该模型需要在确定要做什么的同时平衡它们的规模。输入特征的极大变化会导致模型训练算法的数值稳定性问题。在这些情况下,标准化功能是个好主意。第4章将详细介绍处理自然文本时的特征缩放,包括使用示例。

交互特征

简单的成对交互特征是两个特征的积。类似逻辑与。它以成对条件表示结果:“购买来自邮政编码98121”和“用户的年龄在18到35之间”。这一点对基于决策树的模型没有影响,但发交互特征对广义线性模型通常很有帮助。

这使我们能够捕获特征之间的相互影响,因此它们被称为交互特征。如果x1和x2是二元的,那么它们的积 x1x2 是逻辑函数 x1 AND x2 假设问题是根据他或她的个人资料信息预测客户的偏好。在这种情况下,交互特征不是仅基于用户的年龄或位置进行预测,而交互特征允许模型基于具有特定年龄和特定位置的用户进行预测。

在例2-17中,我们使用 UCI 在线新闻数据集中的成对交互特征来预测每篇新闻文章的分享数量。交互特征导致精度超过单身特征。两者都比例2-9表现得更好,它使用文章正文中单词数的单个预测器(有或没有经过对数变换)。

例子 2--17。用于预测的交互特征示例。

 

构造交互特征非常简单,但它们使用起来很昂贵。使用成对交互特征的线性模型的训练和得分时间将从O(n)到O(n2),其中n是单身特征的数量。

围绕高阶交互特征的计算成本有几种方法。可以在所有交互特征之上执行特征选择,选择前几个。或者,可以更仔细地制作更少数量的复杂特征。两种策略都有其优点和缺点。特征选择采用计算手段来选择问题的最佳特征。(这种技术不限于交互特征。)一些特征选择技术仍然需要训练多个具有大量特征的模型。

手工制作的复杂特征可以具有足够的表现力,所以只需要少量这些特征,这可以缩短模型的训练时间。但是特征本身的计算可能很昂贵,这增加了模型评分阶段的计算成本。手工制作(或机器学习)的复杂特征的好例子可以在第8章有关图像特征中找到。现在让我们看看一些特征选择技巧。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值