【特征工程】

特征工程

1.1 特征工程的含义

​ 俗话说,巧妇难为无米之炊。在机器学习中,数据和特征便是“米”,而模型和算法则是“巧妇”。对于一个机器学习的问题,数据和特征往往决定了结果的上限,而模型、算法的选择则是在逐步接近这个上限。

​ 特征工程,顾名思义,就是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。从本质上来讲,特征工程是一个表示和展现数据的过程。

1.2 特征归一化

​ 为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得不同的指标之间具有可比性。

  • 例如我们分析一个人的身高和体重对健康的影响,如果使用米(m)和千克(kg)作为单位
  • 那么身高特征大部分会在1.6~1.8的数值范围内
  • 而体重则会落在50~100的范围内
  • 那么分析结果则会偏向于数值差别较大的体重特征
  • 因此我们想要得到更为准确的结果,就需要使特征变为同一数量级,以便进行分析

常用的归一化方式主要有以下两种:

① 线性函数归一化

  • 它对原始数据进行线性变换,使结果映射到 [ 0 , 1 ] [0,1] [0,1]的范围内,实现对原始数据的等比缩放

    X n o r m = X − X m i n X − X m a x X_{norm}=\frac{X-X_{min}}{X-X_{max}} Xnorm=XXmaxXXmin

    • 其中 X X X为原始数据, X m i n 、 X m a x X_{min}、X_{max} XminXmax分别为原始数据的最小值和最大值

② 零值归一化

  • 它将原始数据映射到均值为0、标准差为1的正态分布

    z = x − μ σ z=\frac{x-\mu}{\sigma} z=σxμ

    • 其中 μ \mu μ为原始数据的均值, σ \sigma σ为原始数据的方差

那么我们为什么要进行归一化呢?

我们不妨借助随机梯度下降的实例来说明归一化的重要性。

  • 假设我们有两种数值型的特征, x 1 x_1 x1的取值范围为 [ 0 , 10 ] [0,10] [0,10] x 2 x_2 x2的取值范围为 [ 0 , 3 ] [0,3] [0,3]
  • 因此我们可以构造如左图中的等值图
  • 在学习率相同的情况下, x 1 x_1 x1的更新速度会大于 x 2 x_2 x2,需要较多次的迭代才能找到最优解

但如果我们进行归一化处理,其等值图将变为如右图所示的圆形

  • x 1 x_1 x1 x 2 x_2 x2的更新速度将变为一致,更容易找到最优解

在这里插入图片描述

​ 当然数据归一化并不是万能的。在实际应用中,==通过梯度下降算法求解的模型通常是需要归一化的;==但对于决策树并不适用。

1.3 类别型特征

​ 类别型特征主要是指性别、血型等只在有限选项内取值的特征。其原始输入通常是字符串形式,除了决策树等少数模型可以直接处理字符串形式的输入,对于逻辑回归等模型来说,类别型特征必须经过处理为数值型特征才能正确工作。

其处理方式通常有以下三种:

① 序号编码

  • 序号编码通常用来处理类别间具有大小关系的数据
  • 例如成绩可以分为高、中、低三档,并且高>中>低
  • 那么我们可以让高=3,中=2,低=1。保留了大小关系

② 独热编码

  • 独热编码通常用来处理类别间没有大小关系的数据
  • 例如血型有A、B、AB、O四种
  • 我们可以令 A = ( 1 , 0 , 0 , 0 ) 、 B = ( 0 , 1 , 0 , 0 ) 、 A B = ( 0 , 0 , 1 , 0 ) 、 O = ( 0 , 0 , 0 , 1 ) A=(1,0,0,0)、B=(0,1,0,0)、AB=(0,0,1,0)、O=(0,0,0,1) A=(1,0,0,0)B=(0,1,0,0)AB=(0,0,1,0)O=(0,0,0,1)
  • 但我们使用独热编码时要注意以下问题:
    • 使用稀疏向量来节省存储空间
    • 配合特征选择来降低维度。通常高维度特征会带来一些问题:
      • 在K近邻算法中,高维度下两点的距离难以衡量
      • 在逻辑回归模型中,参数的数量会随着维度的增加而增加,容易过拟合
      • 通常只有部分维度是对预测有帮助的

③ 二进制编码

  • 二进制编码通常有两步,首先用序号编码给每个类别赋予一个ID,而后将类别ID对应的二进制编码作为结果
  • 我们还是以血型为例:
血型类别ID二进制表示独热编码
A10011000
B20100100
AB30110010
O41000001
  • 可以看到相比于独热编码,二进制编码维度相对较低,节省了存储空间

1.4 高维组合特征的处理

​ 为了提高复杂关系的拟合能力,在特征工程中经常会把一些离散特征两两组合,构建成高阶组合特征。

  • 但是如果对特征将会带来一些问题

  • 比如某个特征的类别数为 m m m,另一个特征数的类别为 n n n

  • 如果我们直接进行两两特征交叉,那么我们将会得到 m × n m\times n m×n个结果,以逻辑回归为例,我们也将得到 m × n m\times n m×n个参数,在 m m m n n n都非常大的情况下,参数几乎是无法学习的

    Y = s i g m o i d ( ∑ i m ∑ j n w i j < x i , x j > ) Y=sigmoid(\sum\limits_i^m\sum\limits_j^nw_{ij}<x_i,x_j>) Y=sigmoid(imjnwij<xi,xj>)

  • 一种行之有效的方法就是分别将这两个特征用 k k k维的低维向量表示 ( k < < m k < < n k << m\quad k << n k<<mk<<n),此时参数数量就变为了 m × k + n × k m\times k+n\times k m×k+n×k

Y = s i g m o i d ( ∑ i m ∑ j n w i j < x i , x j > ) Y=sigmoid(\sum\limits_i^m\sum\limits_j^nw_{ij}<x_i,x_j>) Y=sigmoid(imjnwij<xi,xj>)

​ 其中 w i j = x i ′ ⋅ x j ′ w_{ij}=x_i^{'}\cdot x_j^{'} wij=xixj x i ′ x_i^{'} xi x j ′ x_j^{'} xj表示 x i x_i xi x j x_j xj对应的低维向量

1.5 文本表示模型

​ 文本表示模型,顾名思义,就是用来表示文本数据的模型

① 词袋模型

  • 所谓词袋模型就是将每篇文章看成一袋子词,并且忽略每个词的出现顺序

  • 具体来说,就是将整篇文本以词为单位切开,而后每篇文章可以表示成一个长向量

    • 向量中的每一维表示一个单词

    • 维度对应的权重值则反映这个词在文章中的重要程度。常用tf-idf来计算

      t f − i d f = t f × i d f tf-idf=tf\times idf tfidf=tf×idf

      • 其中tf为单词 t t t在文档 d d d中出现的频率

      • idf是逆文档频率,用于衡量单词 t t t对表达语义所起的重要性:

        i d f = 文章总数 包含单词 t 的文章总数 + 1 idf=\frac{文章总数}{包含单词t的文章总数+1} idf=包含单词t的文章总数+1文章总数

        直观的解释是如果一个单词在非常多的文章中出现过,那么他可能是一个通用词汇,比如“今天”,其贡献相对就较低

② N-gram模型

  • 将文章进行单词级别的划分有时候并不好,比如 **natural language processing(自然语言处理)**一词进行拆分,那么这三个词表达的意思与之前大相径庭
  • 因此可以将连续出现的 n ( n ≤ N ) n(n\le N) n(nN)个词组成的词组作为一个单独的特征放到向量表示中去,这就是N-gram模型
  • 同时对于英文而言,同一个词可能有多种词性变化,却具有相似的含义。因此在实际处理中通常会对单词进行词干抽取,将不同词性的单词统一成为统一词干的形式

③ 主题模型

这边作者说后面会讲,自己也懒得先看了

④ 词嵌入与深度学习模型

  • 词嵌入是一类将词向量化的模型的统称,核心思想是将每个词都映射至低维空间(通常 K = 50 ∼ 300 K=50\sim300 K=50300)的一个稠密向量(Dense Vector)
  • K维空间的每一维也可以看做是一个隐含的主题,只不过没有那么直观
  • 由于词嵌入可以将会每个词映射成一个 K K K维的向量,因此如果一篇文章有 N N N个词,那么这篇文章就可以由一个 N × K N\times K N×K的矩阵表示

1.6 Word2Vec

​ Word2Vec由谷歌在2003年提出,是较为常用的词嵌入模型之一。它是一种浅层的神经网络模型,有两种网络结构,分别是CBOW和Skip-gram

​ CBOW模型是根据上下文出现的词来预测当前词的生成概率,而Skip-gram是根据当前词来预测上下文各词的生成概率,他们的大致结构如下图所示:

在这里插入图片描述

  • 其中 W t W_t Wt为当前所关注的词, W t − 2 . . . W t + 2 W_{t-2}...W_{t+2} Wt2...Wt+2为上下文中出现的词,这里设置的滑动窗口大小为2

  • CBOW和Skip-gram都可以表示成由输入层、映射层和输出层表示的神经网络

  • 输入层中的每个词由独热编码的方式表示,即所有词均表示成一个 N N N维向量,其中 N N N为词汇表中的单词总数

  • 在映射层中, K K K个隐藏单元的取值可以由 N N N维输入向量以及连接输入和隐藏层之间的 N × K N\times K N×K维的权重矩阵计算得到在CBOW中,还需要将各个输入词所计算出的隐含单元求和

  • 同理,输出层的向量的值可以由1隐含层向量 K K K维以及连接隐藏层和输出层之间的 K × N K\times N K×N维权重矩阵计算得到,输出层也是一个 N N N维向量,每维与词汇表中的一个单词对应

  • 最后,对输出层向量可以使用Softmax激活函数,计算出每个词的生成概率,Softmax函数的定义为:

    P ( y = w n ∣ X ) = e x n ∑ k = 1 n e x k P(y=w_n|X)=\frac{e^{x_n}}{\sum\limits_{k=1}^ne^{x_k}} P(y=wnX)=k=1nexkexn

    • 其中 x x x代表 N N N维的原始输出向量, x n x_n xn表示在原始输出向量中,与 w n w_n wn单词所对应维度的取值
  • 接下来的任务就是训练神经网络的权重,使得语料库中所有单词的整体生成概率最大化

  • 训练得到 N × K N\times K N×K K × N K\times N K×N的两个权重矩阵后,可以任选一个作为 N N N个词的 K K K维向量表示

1.7 数据图像不足时的处理方法

​ 在机器学习中,绝大部分的模型都需要大量的数据进行训练和学习,然而在实际应用中往往会出现数据不足的情况。比如图像分类,作为计算机视觉最基本的任务之一,当其训练2样本较少时我们该如何进行处理呢?

  • 一个模型所能提供的信息往往来源于两方面,一是训练数据中蕴含的信息;二是在模型的形成过程中,人们提供的先验信息
  • 当训练数据不足时,说明模型从原始数据中获取的信息较少,这种情况下想要保证模型的效果,就要获取更多先验信息
  • 我们可以根据特定的假设去调整、变换或扩展训练数据,让其展现出更多的、更有用的信息,以利于模型的训练和学习

​ 具体到图像分类任务上,训练数据不足可能造成模型的过拟合,对应的处理方法也可以分成两类:

  • 一类是作用在模型上,可以简化模型、添加约束项以缩小假设空间(正则项)、集成学习、Dropout超参数等
  • 二是基于数据的方法,主要通过数据扩充。即在保持特定信息的前提下,对原始数据进行适当变换以达到扩充数据集的效果
    • 可以对图像进行随机旋转、平移、缩放、裁剪、填充、左右翻转等
    • 同时可以对像素添加噪声扰动,比如椒盐噪声、高斯白噪声等
    • 颜色变换
    • 改变图像的亮度、清晰度、对比度、锐度等
    • 同时可以对图像进行特征提取,然后在特征空间内进行变换
    • 同时可以使用生成对抗网络直接生成图像
    • 使用预训练模型进行微调等等
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟炼丹师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值