特征工程-数据处理

特征工程

  • 连续型变量
    • 连续变量无量纲化
    • 连续变量数据变换
    • 连续变量离散化
  • 类别变量
  • 时间型、日期型变量
  • 缺失值处理
  • 特征组合

连续型变量处理

什么是连续型变量?

在一定区间内可以任意取值的变量叫连续变量,其数值是连续不断的,相邻两个数值可作无限分割,即可取无限个数值.例如,生产零件的规格尺寸,人体测量的身高,体重,胸围等为连续变量,其数值只能用测量或计量的方法取得.

连续变量无量纲化

统一数据单位,消除数据间由于量纲带来的差异,使数据量级尽量保持在相同范围内。这样,表征不同属性(单位不同)的各特征之间才有可比性.

无量纲化方法:标准化、归一化、正则化,区间缩放法

标准化

数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。

  1. z-score标准化(零-均值标准化),经过处理后的数据均值为0,标准差为1。处理方法是:

x′=(x−μ)/σ
x是原始数据,u是样本均值,σ是样本标准差。

均值为0会使数据以0为中心左右分,标准差为1有什么好处呢?http://www.cnblogs.com/zhaokui/p/5112287.html

  1. 小数定标标准化

y=x/10^j (j确保max(|y|<1),通过移动x的小数位置进行标准化

  1. 对数Logistic模式

y=1/(1+e^(-x))

归一化

min-max归一化,该方法是对原始数据进行线性变换,将其映射到[0,1]之间。变换函数为
x′=(x−min)/(max−min)
min是样本的最小值,max是样本的最大值。由于最大值与最小值可能是动态变化的,同时也非常容易受噪声(异常点、离群点)影响,因此一般适合小数据的场景。此外,该方法还有两点好处:

  1. 如果某属性/特征的方差很小,如身高:np.array([[1.70],[1.71],[1.72],[1.70],[1.73]]),实际5条数据在身高这个特征上是有差异的,但是却很微弱,这样不利于模型的学习,进行min-max归一化后为:array([[ 0. ], [ 0.33333333], [ 0.66666667], [ 0. ], [ 1. ]]),相当于放大了差异;
  2. 维持稀疏矩阵中为0的条目。
  • 归一化的其他方法:
    • 对数转化
      y=log10(x)
    • 反余切函数转换
      y=atan(x)*2/PI

正则化

正则化的过程是将每个样本缩放到单位范数(每个样本单位范数为1),如果后面要使用如二次型(点积)或者其他核方法(核方法是一类模式识别的算法,其目的是找出并学习一组数据中的相互关系)计算两个样本之间的相似。
normalization主要思想是对每个样本计算p-范数,然后对样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数等于1。
p-范数的计算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p
该方法主要应用于文本分类和聚类中。
在sklearn中有三种正则化方法,l1范数、l2范数、max范数

区间缩放法

区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:
x′=(x−min)/(max−min)

连续变量数据变换

连续变量数据转换主要是通过函数变换改变原始数据的分布。

连续变量数据转换的目的:

  1. 便于置信区间分析或者可视化 (缩放数据, 对称分布)
  2. 为了获取更容易解释的特征 (获取线性特征)。
  3. 降低特征数据的维度或者复杂度
  4. 方便使用简单的回归模型

连续变量数据变换方法:

  • 单变量变换
    • 线性变换
    • 非线性变换
  • 多变量变换

单变量变换-线性变换

执行单变量分析的方法取决于变量类型是分类类型还是连续类型。在连续变量的情况下,我们需要了解变量的中心趋势和分散,使用各种统计度量可视化方法进行测量。

单变量变换-非线性变换

多变量变换

双变量分析的主要目的是发现两个变量之间的关系。可以对分类和连续变量的任何组合执行双变量分析。在两个连续变量之间进行双变量分析时,散点图( scatter plot)是找出两个变量之间的关系的一个很好的方式。 散点图表示变量之间的关系可以是线性或非线性。

连续变量离散化

对连续特征进行离散化处理,一般经过以下步骤:
(1) 对此特征进行排序。特别是对于大数据集,排序算法的选择要有助于节省时间,提高效率,减少离散化的整个过程的时间开支及复杂度。
(2)选择某个点作为候选断点,用所选取的具体的离散化方法的尺度进行衡量此候选断点是否满足要求。
(3)若候选断点满足离散化的衡量尺度,则对数据集进行分裂或合并,再选择下一个候选断点,重复步骤(2)(3)
(4)当离散算法存在停止准则时,如果满足停止准则,则不再进行离散化过程,从而得到最终的离散结果。

连续变量离散化的目的:

  1. 离散特征的增加和减少都很容易,易于模型的快速迭代;
  2. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  3. 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  4. 逻辑回归属于广义线性模型,表达能力受限,单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
  5. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  6. 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反;
  7. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

连续变量离散化方法:

  • 无监督方法
    • 分箱法
    • 直观划分
  • 有监督方法
    • 1R方法
    • 基于卡方的离散方法

无监督方法-分箱法

分箱法包括等宽分箱法和等频分箱法,它们是基本的离散化算法
分箱的方法是基于箱的指定个数自顶向下的分裂技术,在离散化的过程中不使用类信息,属于无监督的离散化方法。在等宽或等频划分后,可用箱中的中位数或者平均值替换箱中的每个值,实现特征的离散化。

自顶向下的分裂策略:即先把整个数据集当作一个区间,再逐步选出端点,对大的区间进行分裂得到小的区间

自底向上的合并策略:将数据取值范围内的所有数据值列为一个单独的区间,再递归的找出最佳近邻可合并的区间,然后合并他们,形成较大的区间。在判定最佳邻近可合并的区间时,会用到卡方统计量来检测两个对象间的相关度。

1、等距划分
从最小值到最大值之间,均分为 N 等份, 这样, 如果 A,B 为最小最大值, 则每个区间的长度为 W=(B−A)/N , 则区间边界值为A+W,A+2W,….A+(N−1)W 。这里只考虑边界,每个等份里面的实例数量可能不等。

2、等频划分
区间的边界值要经过选择,使得每个区间包含大致相等的实例数量。比如说 N=10 ,每个区间应该包含大约10%的实例。

这两种方法的弊端;
比如,等宽区间划分,划分为5区间,最高工资为50000,则所有工资低于10000的人都被划分到同一区间。等频区间可能正好相反,所有工资高于50000的人都会被划分到50000这一区间中。这两种算法都忽略了实例所属的类型,落在正确区间里的偶然性很大。

无监督方法-直观划分

根据直观划分离散化。为了使所划分的区间更加自然,规整(例如不出现大量的小数,整数位除最高位外全部为0)。

规则:3-4-5规则。根据最高有效位的取值范围,将区间划分为相对等宽的几个3,4,或5个区间。

如果最高有效位包含3,7(2,3,2),6,9个不同的值,则划分为三个区间;如果包含2,4,8个不同的值,则划分为4个区间;如果包含1,5,10个不同的值,则划分为5个等宽的区间。

步骤:

  1. 根据信息的最大max最小值min确定所需考虑的最低low(第5个百分位数)和最高high值(第95个百分位数)。

  2. 根据low,high确定最高有效位的位(个位,十位,百分位。。。。),则令msd=1,10,100。。。。。然后将low,higi向下和向上取值(使区间能够包含low,high范围),得到新的low和high。

  3. 计算最高有效位取值的不同个数=(high-low)/msd.并根据上面的规则确定划分区间。

  4. 向上向下兼容。如果min>low,则使low=min,否则创建新区间(min,low],在high处同样使用此方法。

  5. 可以递归的使用此方法对每一个结果区间进行划分操作。

无监督方法-聚类划分

基于聚类分析的离散化方法也是一种无监督的离散化方法。此种方法包含两个步骤:

首先是将某特征的值用聚类算法(如K-means算法)通过考虑特征值的分布以及数据的临近性,划分成簇或组;然后是将聚类得到的簇进行处理,可分为自顶向下的分裂策略和自底向上的合并策略。分裂策略是将每一个初始簇进一步分裂为若干子簇,合并策略是通过反复地对邻近簇进行合并,聚类分析的离散化方法也需要用户指定簇的个数,从而决定离散产生的区间数。

有监督方法-1R方法

1R是一种使用分箱的有监督的方法,他把连续的区间分成小的区间,然后再使用类标签对小区间的边界进行调整,每个区间至少包含6个实例,除了最后一个区间外,最后一个区间包含所有未被列入其他区间的实例。如果下一个实例的类标签与此区间中大多数实例的类标签相同,则把此实例加入区间中,否则,形成下一个新的区间,反复操作,直至结束。把区间中大多数实例的共同标签作为此区间的类标签,如果最后有相同的类标签出现,则合并。

有监督方法-基于卡方的离散方法

卡方的离散化方法采用的是自底向上的合并策略,最常用的基于卡方的离散化方法是ChiMerge方法,是一种自动化的离散化算法。过程如下:

首先将数值特征的每个不同值看做一个区间,对每个相邻区间计算卡方统计量,将其与需要人为设定置信水平参数(由统计学知识算出一个与计算量相比较的阈值)进行比较,高于阈值则把相邻区间进行合并(高的卡方统计量表示这两个相邻的区间有相似的类分布,相似类分布的区间应该进行合并形成一个区间),合并的过程递归的进行,直到计算得到的卡方统计量不再大于阈值,离散化过程终止,得到最终的离散化结果。

置信水平参数设置过高会导致过分离散化,过低离散化不足。

###有监督方法-基于信息熵的方法

基于熵的离散化。是一种监督的,自顶向下的分裂技术。

该方法原理:选择属性A中具有最小熵的值作为分裂点,并递归的划分结果区间,直到所有候选分类点上的最小信息需求(基于熵的某个公式)小于某个阈值或者结果区间的个数大于某个阈值。其中属性A为D的类标号属性。即:基于熵的离散化使用元祖的类标号信息,类标号属性提供每个元祖的类信息。

注:这里的熵指信息熵。是对不确定性的一种度量。信息量越大,不确定性就越小,熵也就越小;信息量越小,不确定性越大,熵也越大。根据熵的特性,我们可以通过计算熵值来判断一个事件的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响越大。

类别变量

什么是类别型变量?

分类变量(categorical variable)是说明事物类别的一个名称,其取值是分类数据。如“性别”就是一个分类变量,其变量值为“男”或“女”;“行业”也是一个分类变量,其变量值可以为“零售业”、“旅游业”、“汽车制造 业”等。简单来说这类变量通常都是文本类的,但是在进行建模时,python不能像R那样去直接处理非数值型的变量,因此我们往往需要对这些类别变量进行一系列转换,如哑变量或是独热编码。例如性别这个特征:男性人数为x1,男性中流失人数x11,女性人数x2,女性中流失人数x22。那么我们以x11/x1作为男性编码;x22/x2作为女性编码。

其变量值是定性的,表现为互不相容的类别或属性。

1. 无序分类变量

无序分类变量(unordered categorical variable)是指所分类别或属性之间无程度和顺序的差别。,它又可分为①二项分类,如性别(男、女),药物反应(阴性和阳性)等;②多项分类,如血型(O、A、B、AB),职业(工、农、商、学、兵)等。对于无序分类变量的分析,应先按类别分组,清点各组的观察单位数,编制分类变量的频数表,所得资料为无序分类资料,亦称计数资料。

2. 有序分类变量

有序分类变量(ordinal categorical variable)各类别之间有程度的差别。如尿糖化验结果按-、±、+、++、+++分类;疗效按治愈、显效、好转、无效分类。对于有序分类变量,应先按等级顺序分组,清点各组的观察单位个数,编制有序变量(各等级)的频数表,所得资料称为等级资料。

变量类型不是一成不变的,根据研究目的的需要,各类变量之间可以进行转化。例如血红蛋白量(g/L)原属数值变量,若按血红蛋白正常与偏低分为两类时,可按二项分类资料分析;若按重度贫血、中度贫血、轻度贫血、正常、血红蛋白增高分为五个等级时,可按等级资料分析。有时亦可将分类资料数量化,如可将病人的恶心反应以0、1、2、3表示,则可按数值变量资料(定量资料)分析。

对类别型变量一般是进行编码处理,使其变成数值型变量。

类别型数据编码处理

类别型数据编码目的:

  1. 机器学习或者深度学习算法一般无法处理类别型数据
  2. 构造新的特征,扩充新特征

类别型数据编码方法:

  • one-hot encoding 独热编码 ;
  • dummy encoding 哑变量编码;
  • label-encoding 标签编码;
  • count-Encoding 频数编码 (可以去量纲化,秩序,归一化);
  • Target encoding 目标编码 用目标变量中的某一类的比例来编码;

one-hot encoding 独热编码

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效,Pandas中提供get_dummies方法可以方便的将数值转化为One-hot向量
例如:
自然状态码为:000,001,010,011,100,101
独热编码为:000001,000010,000100,001000,010000,100000
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的

dummy encoding 哑变量编码

label-encoding 标签编码

标签编码直接将类别转换为数字。pandas.factorize提供了这一功能,或者,pandas中category类型的列提供了cat.codes。使用标签编码能够保持原本的维度

count-Encoding 频数编码

频数编码使用频次替换类别,频次根据训练集计算。这个方法对离群值很敏感,所以结果可以归一化或者转换一下(例如使用对数变换)。未知类别可以替换为1。

尽管可能性不是非常大,有些变量的频次可能是一样的,这将导致碰撞——两个类别编码为相同的值。没法说这是否会导致模型退化或者改善,不过原则上我们不希望出现这种情况。

Target encoding 目标编码

它使用目标变量的均值编码类别变量。我们为训练集中的每个分组计算目标变量的统计量(这里是均值),之后会合并验证集、测试集以捕捉分组和目标之间的关系。

使用目标变量时,非常重要的一点是不要泄露任何验证集的信息。所有基于目标编码的特征都应该在训练集上计算,接着仅仅合并或连接验证集和测试集。即使验证集中有目标变量,它不能用于任何编码计算,否则会给出过于乐观的验证误差估计。

如果使用K折交叉验证,基于目标的特征应该在折内计算。如果仅仅进行单次分割,那么目标编码应该在分开训练集和验证集之后进行。

此外,我们可以通过平滑避免将特定类别编码为0. 另一种方法是通过增加随机噪声避免可能的过拟合。处置妥当的情况下,无论是线性模型,还是非线性模型,目标编码都是最佳的编码方式

时间型、日期型变量

时间型、日期型变量处理目的:

  1. 将无法直接参与训练的日期类型转化为可以参与训练的数据
  2. 提取时间日期中的关键数据特征,比如上午、下午、周几、上旬、下旬等等

时间型、日期型变量处理方法:

  • 直接使用python的datetime库进行日期转换
  • 使用pandas自带的时间处理功能提取日期型和时间型的特征变量
  • 其他

缺失值处理

常见的数据缺失处理方法:

  • 删除缺失值记录
  • 缺失值替换:
    • 用0替换
    • 平均数替换
    • 众数替换
    • 用插值法填充
    • 预测缺失值替换
    • 构造NaN encoding编码(构造一个新的字段来标识是否有缺失(1/0),该方法在任何时候都可使用)
  • 忽略缺失值(有一些模型,如随机森林,自身能够处理数据缺失的情况,在这种情况下不需要对缺失数据做任何的处理,这种做法的缺点是在模型的选择上有局限。)

特征组合

使用多个特征生成一个之前不存在的新特征。

特征组合目的:

  1. 生成新的特征,扩充特征维度
  2. 通过将单独的特征进行组合(相乘或求笛卡尔积)而形成的合成特征。特征组合有助于表示非线性关系。

更多内容请看:https://www.sunjackson.com

你可能感兴趣的:(机器学习,人工智能)