《特征工程入门与实践》--- 特征学习
以AI促AI
吐血整理
《特征工程入门与实践》这本书之前已经看了一遍,这次打算从总结的角度从后往前再读此书,重点在梳理框架,区分不同,标注必须要掌握的基本代码。
一、首先是特征理解,从以下几点切入特征理解:
- 结构化数据与非结构化数据
- 数据的四个等级
- 识别数据的缺失值
- 探索性数据分析
- 描述性统计
- 数据可视化
二、接着是特征增强:清洗数据
- 对非结构化数据进行结构化
- 数据填充–填充缺失数据
- 数据归一化
- 标准化(z分数标准化)
- min-max标准化
- L1和L2正则化(将数据投影到不同对空间)
三、特征选择(选择好的特征)
- 相关系数
- 识别并移除多重共线性
- 卡方检验
- 方差分析
- 理解p值
- 迭代特征选择
- 用机器学习测量熵和信息增益
四、特征构建,增加特征(根据原有特征生成新的特征)
五、特征转换,降维PCA,LDA,运用数学公式处理数据
六、特征学习,AI促AI,基于神经网络
- 数据的参数假设
- 受限玻尔兹曼机(RBM)
- BernoulliRBM
- Word2vec,GloVe
本节部分代码并没有操作实现,内容来自《特征工程入门与实践》。。
数据形状的无参数假设:特征学习方法
特征变换与特征学习同处特征提取范畴,因为他们都尝试从原始数据的潜在结构中创建新的特征。
特征变换与特征学习的基本不同:
本章专注的两个特征学习算法:
-
受限玻尔兹曼机(Restricted Boltzmann Machines (RBM)):一种简单的深度学习架构,根据数据的概率模型学习一定数量的新特征。这些机器其实是一系列算法,但scikit-learn中只实现了一种。
-
词嵌入(Word embeddings):词嵌入可以将字符串(单词或短语)投影到n维特征集中,以便理解上下文和措辞的细节。我们用Python的gensim包准备词嵌入,然后借助预训练过的词嵌入来研究它能如何增强我们与文本的交互能力。
这些例子有一些共同点:都涉及从原始数据中学习新特征,然后利用这些新特征加强与数据交互的方式。对于后两个例子,我们需要放弃scikit-learn,因为这些高级技术在scikit-learn中尚未提供。
1、 受限玻尔兹曼机(RBM)
受限玻尔兹曼机(RBM)学习笔记
RBM的无监督性质很重要,所以它和PCA的相似性高于和LDA的相似性。RBM和PCA算法在提取新特征时都不需要真实值,可以用于更多的机器学习问题。
RBM是一个浅层神经网络,属于深度信念网络(DBN,deep belief network)算法的一种。用标准的术语讲,这个网络有一个可见层(第一层),后面是一个隐藏层(第二层)。下图为受限玻尔兹曼机图:
和其他的神经网络一样,这两层中都有节点。网络可见层的节点数和输入数据的特征维数相同。在下面的例子中,我们的图像是28 × 28的,也就是说输入层有784个节点。隐藏层的节点数是人为选取的,代表我们想学习的特征数。
注意:RBM不一定降维。对于PCA,我们受限于原始特征的数量(只能使用等于或小于原始特征数的输出),而LDA的要求更加严格,只能输出类别的数量减1。RBM可以学习的特征数量只受限于计算机的计算能力,以及人为的解释。RBM可以学习到比初始输入更少或更多的特征。具体要学习的特征数量取决于要解决的问题,可以进行网格搜索。
RBM的网络特点:允许层与层之间的连接(层间连接),不允许同一层内节点的连接(层内连接)。RBM的这种不允许层内通信,使得节点可以独立地创造权者偏差,最终成为独立的特征。
RBM的训练过程:
在网络的前向传导中,我们看见数据可以向前通过网络(从可见层到隐藏层),但是这并不能解释为什么RBM可以不依赖真实值而学习新特征。RBM的学习来自于可见层和隐藏层间的多重前后向传导。
在重建阶段,我们调转网络,把隐藏层变成输入层,用相同的权重将激活变量(a)反向传递到可见层,但是偏差不同。然后,用前向传导的激活变量重建原始输入向量。下图显示了如何使用相同的权重和不同的偏差,通过网络进行反向激活。
RBM用这种方式进行自我评估。通过将激活信息进行后向传导并获取原始输入的近似值,该网络可以调整权重,让近似值更接近原始输入。
在训练开始时,由于权重是随机初始化的(标准做法),近似值有可能相差很大。然后,通过反向传播(和前向传导的方向相同,的确很绕)调整权重,最小化原始输入和近似值的距离。我们重复这个过程,直到近似值尽可能接近原始的输入。这个过程发生的次数叫作迭代次数。
这个过程的最终结果是一个网络,其中有每个数据点的第二自我。要转换数据,我们只需要将数据传入该网络,并计算激活变量,输出结果就是新的特征。这个过程是一种生成性学习,试图学习一种可以生成数据的概率分布,并且利用知识来提取原始数据的新特征集。
例如,给定一个数字(0~9)的图片,并要求按数字进行分类。这个网络的前向传导会问:给定这些像素,应该是什么数字?后向传导时,网络会问:给定一个数字,应该出现哪些像素?这称为联合概率,即“给定 x x x时有 y y y”和“给定 y y y时有 x x x”共同发生的概率,也是网络两个层的共享权重。
MNIST dataset
MNIST数据集包括6000个0~9的手写数字图像,以及可以从中学习的真实值。每个数据点包括784个特征(灰度图像的像素值)。
- 导入包
# 导入 numpy and matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn import linear_model, datasets, metrics
# scikit-learn 的RBM 实现
from sklearn.neural_network import BernoulliRBM
from sklearn.pipeline import Pipeline
2.把数据集导入一个NumPy数组
#从csv中创建Numpy数组
images = np.genfromtxt('../data/mnist_train.csv',delimiter=',')
3.数据的行列数
# 28像素 * 28像素 + 1个响应变量
images.shape
(6000, 785)
4.提取 X X