【笔记】数据特征工程
一、特征归一化
为什么要进行特征归一化?为了消除数据特征之间不同量纲对结果的影响。
定义:将个不同特征指标变换到同一数量级下;
- 线性函数归一化(Normalization)
对原始数据进行***线性变换***,将结果映射到[0, 1]范围,实际上是对数据进行等比缩放;
公式:
Xnorm=X−XminXmax−Xmin
X_{norm} = \frac{X-X_{min}}{X_{max}-X_{min}}
Xnorm=Xmax−XminX−Xmin
- 零均值归一化(标准化, Standardization)
也标准化; 将数据映射到均值为0, 标准差为1的分布上。
单纯减去均值也叫中心化, 其实就是一个平移的过程,平移后所有数据的中心是(0,0);
对数据进行中心化预处理,这样做的目的是要增加基向量的正交性。
公式:
z=x−uσ
z = \frac{x-u}{\sigma}
z=σx−u
其中 uuu 表示均值 ; σ\sigmaσ 表示标准差;
二、类别型特征
掌握
-
序号编码;
1,2,3
-
独热编码;
one-hot表示
-
二进制编码;
将序号变成固定位二进制; 如7; 变成 0000111;效果上类似于多标签;二进制编码也可用来编码数据;比如使用神经网络拟合 FizzBuzz游戏,用二进制编码来讲输入数字转变成输入特征。
def fizz_buzz_encode(i): if i % 15 == 0: return 3 elif i % 5 == 0: return 2 elif i % 3 == 0: return 1 else: return 0 def fizz_buzz_decode(i, prediction): return [str(i), "fizz", "buzz", "fizzbuzz"][prediction] def binary_encode(i, num_digits): """使用二进制方式来表示数据""" return np.array([i >> d & 1 for d in range(num_digits)])
三、高纬组合特征处理
特征较少时,可以通过特征组合,扩充特征维度;
维度过高时候,需要通过降维;
四、组合特征(特征交叉)
我们可以创建很多不同种类的特征组合。例如:
- [A X B]:将两个特征的值相乘形成的特征组合。
- [A x B x C x D x E]:将五个特征的值相乘形成的特征组合。
- [A x A]:对单个特征的值求平方形成的特征组合。
五、文本表示模型
-
词袋模型
词袋模型:就是将每一篇文章看做一袋子词,并忽略每个词出现的顺序。具体地说,就是讲整段文本以词为单位切开,每一篇文章可以表示成一个长向量,向量中的每一维代表一个单词,而该维对应的权重则反映了这个词在原文章的重要程度;常用 TF-IDF来***计算权重***;
TF-IDF公式为:
TF−IDF(t,d)=TF(t,d)×IDF(t) TF-IDF(t, d) = TF(t, d) \times IDF(t) TF−IDF(t,d)=TF(t,d)×IDF(t)
其中 TF(t,d)TF(t, d)TF(t,d) 为单词ttt在文档ddd中出现的频率, IDF(t)IDF(t)IDF(t)是逆文档频率;是对数据集的整体分布而言的;用来衡量单词ttt对表达语义所起的重要性;表示为:
IDF(t)=log文章总数包含单词t的文章总数+1 IDF(t) = log \frac{文章总数}{包含单词t的文章总数+1} IDF(t)=log包含单词t的文章总数+1文章总数
如果一个单词在非常多的文章里都有出现,那么他可能是一个比较通用的词汇, 比如’的, 你, 我’;对于区分谋篇文章的特殊语义贡献很小,因此对权重做一定的惩罚;总结,词袋模型用来表示向量,但是这个向量不不准确,需要权重来约束,TF-IDF是用来计算权重的;
-
WordEmbedding
谷歌2013年提出的Word2Vec是主流的词嵌入模型;
Word2Vec实际是一种浅层的神经网络,主要是CBOW 和skip_gram;
通过训练的方式,取得词和词之间的联系,将词表示成一个高纬向量;
六、数据不足时候的处理方法
在实际应用过程中,经常会出现数据不足的问题;解决方法有以下几种;
-
迁移学习;使用迁移学习可以在少样本上学习得到不错的结果;
-
Data Augmentation (数据增强)
-
上采样技术(例如:SMOTE)
SMOTE算法的思想是合成新的少数类样本,合成的策略是对每个少数类样本a, 从他的最近邻中随机选一个样本b, 然后再a, b之间的连线上随机选一点作为新合成的少数类样本;