目录

一、    特征工程是什么?    2

特征使用方案    3

特征获取方案    4

特征处理    4

1.    特征清洗    4

2.    数据预处理    4

3.    特征监控    4

二、    数据预处理    5

1.    无量纲化    5

1.1标准化    5

1.2区间缩放法    7

1.3归一化方法有两种    7

2.    对定量特征二值化    8

1.    为什么要对定量特征二值化?    8

2.    对定量特征二值化的方法    8

3.    对定性特征哑编码    8

1    OneHotEncoder()热编码    8

2    LabelEncoder()标签编码    8

4.    缺失值计算,处理缺失值    8

1    删除包含缺失值的数据列(这种方法适用于数据列包含的缺失值太多的情况)    8

2    填补缺失值    9

3    拓展方法    9

5.    数据变换    9

6.    回顾    9

三、    特征选择    10

1.Filter过滤法    10

1.1方差选择法    10

1.2相关系数法    11

1.3卡方检验    12

1.4互信息法    12

2.Wrapper:包装法    12

2.1递归特征消除法    12

3.Embedder    13

3.1基于惩罚项的特征选择法    13

3.2基于树模型的特征选择法    13

4回顾    13

四、    降维    13

1.    主成分分析法(PCA    14

2.    线性判别分析法(LDA    14

3.    回顾    14

五、    总结    14

 

 

使用sklearn做单机特征工程

  1. 特征工程是什么?

    有这么一句话在业界流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用,通过总结和归纳,人们认为特征工程包括以下方面:

特征使用方案

  1. 要实现我们的目标需要哪些数据? ----基于业务理解,尽可能找出对因变量有影响的所有自变量。
  2. 可用性评估
    1. 获取难度
    2. 覆盖率
    3. 准确率

       

特征获取方案

  1. 如何获取这些特征?
  2. 如何存储?

     

特征处理

  1. 特征清洗
    1. 清洗异常样本
    2. 采样:数据不均衡、样本权重
  2. 数据预处理
    1. 单个特征:归一化、离散化、Dummy Coding、缺失值和数据变换(log,指数,Box-Cox
    2. 多个特征:

      降维(PCALDA

      特征选择

      1. Filter(思路:自变量和目标变量之间的关联;相关系数;卡方检验;信息增益;互信息)
      2. Wrapper(思路:通过目标函数(AUC/MSE)来决定是否加入一个变量;迭代:产生特征子集,评价(完全搜索、启发式搜索、随即搜索))
      3. Embedded(思路:学习器自身自动选择特征;正则好(L1,L2;决策树(熵,信息增益);深度学习)
    3. 衍生变量 ----对原始数据加工,生成有商业意义的变量
  3. 特征监控
    1. 特征有效性分析 ----特征重要性,权重
    2. 特征监控----监控重要特征----防止特征质量下降,影响模型效果

特征处理时特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等等。首次接触到sklearn,通常会被其丰富且方便的算法模型库吸引,但是这里介绍的特征处理库也十分强大。

本文中使用sklearn中的IRIS(鸢尾花)数据集来对特征处理功能进行说明。IRIS数据集由Fisher1936年整理,包含4个特征(Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度)),特征值都为正浮点数,单位为厘米。目标值为鸢尾花的分类(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),Iris Virginica(维吉尼亚鸢尾))。导入IRIS数据集的代码如下:

from sklearn.datasets import load_iris

#导入IRIS数据集

iris = load_iris()

#特征矩阵

dataset=iris.data

#目标向量

labels=iris.target

 

  1. 数据预处理

通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:

  1. 不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
  2. 信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心"及格"或不"及格",那么需要将定量的考分,转换成"1""0"表示及格和未及格。二值化可以解决这一问题。
  3. 定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。
  4. 存在缺失值:缺失值需要补充
  5. 信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。

我们使用sklearn中的preproccessing库来进行数据预处理,可以覆盖以上问题的解决方案。

  1. 无量纲化

    无量纲化可以加快梯度下降法收敛速度,有可能提高精度。

    无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。

    1.1标准化

    标准化方法是将变量的每个值与其平均值之差除以该变量的标准差,无量纲化后变量的平均值为0,标准差为1。使用该方法无量纲化后不同变量间的均值和标准差都相同,即同时消除了变量间变异程度上的差异。

    标准化公式为:

    sklearn实现标准化有两种不同的方式:

    1. preprocessing.scale()方法实现,可以直接将给定数据进行标准化,得到(0—1正态分布)Standardize a dataset along any axis

      其中:参数x(类数组,稀疏矩阵)

      axisint类型(默认为0),如果为0,按特征(即列)标准化;如果为1,按样本(即行)标准化

      with_mean:均值,默认为真

      with_std:方差,默认为真

    2. 使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数

      据。

class sklearn.preprocessing.StandardScaler(copy=Truewith_mean=Truewith_std=True)

通过删除平均值和缩放到单位方差来标准化特征

参数:copy:默认为True

这个类的属性:

scale_:数据的相对缩放

mean_:训练集中每个特征的均值

var_:训练集中每个特征的方差、

n_samples_seen_:int类型,样本数

            这个类的方法:

fit(X[,y]):计算均值和方差为了之后的缩放

                fit_transform():训练,然后标准化数据

                get_params(deep=True):得到估计量的参数

                inverse_transform(X, copy=None):反标准化

                transform(X, y='deprecated', copy=None):标准化

 

1.2区间缩放法

区间缩放法的思路有多种,常见的一种是利用两个最值进行缩放,公式表达为:

1.3归一化方法有两种

1)使用Normalizer类的方法归一化

class sklearn.preprocessing.Normalizer(norm='l2'copy=True)

    将样品归一化为单位范数

2)使用normalize()方法进行归一化

sklearn.preprocessing.normalize(Xnorm='l2'axis=1copy=Truereturn_norm=False)

 

  1. 对定量特征二值化
    1. 为什么要对定量特征二值化?

      对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心"及格"或不"及格",那么需要将定量的考分,转换成"1"和"0"表示及格和未及格。二值化可以解决这一问题。

    2. 对定量特征二值化的方法

  2. 对定性特征哑编码

    1. OneHotEncoder()热编码

      给定一个数据集,我们让编码器找到每个特征的最大值,并将数据转换为二进制的形式表现出来。

      比如输入特征1的三个样本值为129,会编为一个二进制

    2. LabelEncoder()标签编码

      将标签编码为不同的数字来表示不同的类别

  3. 缺失值计算,处理缺失值

python语言中,缺失值一般被称为nan,是"not a number"的缩写。

下面的代码可以计算出数据总共有多少个缺失值,这里数据是存储在pandas中的DateFrame中:

  1. 删除包含缺失值的数据列(这种方法适用于数据列包含的缺失值太多的情况)

    在大多数情况下,我们必须在训练集(training dataset)和测试集(test dataset)中删除同样的数据列。

  2. 填补缺失值

    这种方法比直接删除数据列好点,能训练出更好的模型。

    默认的填补策略是使用均值填充

  3. 拓展方法

    如果缺失数据包含重要特征信息的话,我们需要保存原始数据的缺失信息,存储在boolearn列中

  1. 数据变换

  2. 回顾

    1. 特征选择

      当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,

      ****从两个方面选择特征:

      特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么作用。

      特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优先选择。除方差法外,本文介绍的其他方法均从相关性考虑。

      ****根据特征选择的形式又可以将特征方法分为3种:

      ①Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。

      ②Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。

      Embedder:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据稀疏从大到小选择特征,类似于Filter方法,但是是通过训练来确定大哥特征的优劣。

      我们使用sklearn中的feature_selection库来进行特征选择。

      1.Filter过滤法

1.1方差选择法

使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:

1.2相关系数法

使用相关系数法,先要计算各个特征对目标值得相关系数以及相关系数得P值,用feature_selection库得SelectKBest类结合相关系数来选择特征得代码如下:

相关系数表征两组数得相关程度。

1.3卡方检验

经典得卡方检验是检验定性自变量对定性因变量得相关性。假设自变量有N中取值,因变量有M中取值,考虑自变量等于i且因变量等于j得样本频数得观察值与期望得差距,构建统计量:

这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:

1.4互信息法

经典得互信息也是评价定性自变量对定性因变量得相关性的,互信息计算公式如下:

2.Wrapper:包装法

2.1递归特征消除法

递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:

3.Embedder

3.1基于惩罚项的特征选择法

3.2基于树模型的特征选择法

4回顾

  1. 降维

    当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCALDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCALDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。

    1. 主成分分析法(PCA

    2. 线性判别分析法(LDA

    3. 回顾

  2. 总结

    再让我们回归一下本文开始的特征工程的思维导图,我们可以使用sklearn完成几乎所有特征处理的工作,而且不管是数据预处理,还是特征选择,抑或降维,它们都是通过某个类的方法fit_transform完成的,fit_transform要不只带一个参数:特征矩阵,要不带两个参数:特征矩阵加目标向量。这些难道都是巧合吗?还是故意设计成这样?方法fit_transform中有fit这一单词,它和训练模型的fit方法有关联吗?接下来,我将在《使用sklearn优雅地进行数据挖掘》中阐述其中的奥妙!

posted on 2018-07-19 22:58  夜尽天明00  阅读(644)  评论(0编辑  收藏  举报