特征学习笔记Chapter1-Chapter4

特征学习阅读笔记

Chapter1
机器学习流程

机器学习从业者有一个共识,那就是建立机器学习流程的绝大部分时间都耗费在特征工程和数据清洗上。

正确的特征要视模型和数据的具体情况而定,而模型和数据千差万别,很难从各种项目中归纳出特征工程的实践原则。

每份数据都是管中窥豹,只能反映一小部分现实,把这些观测综合起来才能得到一个完整的描述。但这个描述非常散乱,因为它由成千上万个小片段组成,而且总是存在测量噪声和缺失值。

数据处理工作流往往是多阶段的迭代过程。举个例子,股票价格是在交易所中观测到的,然后由像汤森路透这样的中间机构进行汇集并保存在数据库中,之后被某个公司买去,转换为一个Hadoop 集群上的Hive 仓库,再被某个脚本从仓库中读出,进行二次抽样和各种处理,接着通过另一个脚本进行清洗,导出到一个文件,转换为某种格式,然后你使用R、Python 或Scala 中你最喜欢的建模程序进行试验。接着,预测结果被导出为一个CSV 文件,再用一个估值程序进行解析。模型会被迭代多次,由产品团队用C++ 或Java重写,并在全部数据上运行,然后最终的预测结果会输出到另一个数据库中保存起来。

特征工程就是在给定数据、模型和任务的情况下设计出最合适的特征的过程。

好的特征可以使随后的建模步骤更容易,最后得出的模型也更能完成所需的任务。坏的特征要想达到同等性能,则需要复杂得多的模型

Chapter2
数值
在研究文本或者图像这种复杂数据之前,我们先看看最简单的数据类型:数值

好的特征不仅能够表示出数据的主要特点,还应该符合模型的假设,因此通常必须进行数据转换。

首先看他的量级:这种合理性检查非常重要,尤其是对于那些自动产生的数值,比如计数(网站的每日访问量、餐馆的评价数量等

然后看尺度:如果模型是输入特征的平滑函数,那么它对输入的尺度是非常敏感的,此外,k-均值聚类、最近邻方法、径向基核函数,以及所有使用欧氏距离的方法都属于这种情况。对于这类模型和模型成分,通常需要对特征进行标准化,以便将输出控制在期望的范围之内,相反,逻辑函数对输入特征的尺度并不敏感。基于空间分割树的模型(决策树、梯度提升机、随机森林)对尺度是不敏感的。

数值型特征的分布也非常重要,这种分布可以表示出一个特定值出现的概率。

当数据被大量且快速地生成时,很有可能包含一些极端值。这时就应该检查数据的尺度,确定是应该保留数据原始的数值形式,还是应该将它们转换成二值数据,或者进行粗粒度的分箱操作。

既然数据中包含了实际的收听次数,那么可以用它作为预测的目标变量吗?如果高收听次数意味着用户真的喜欢这首歌,低收听次数意味着用户对这首歌不感兴趣,那么就可以把它当成目标变量。
但是,数据表明,尽管99% 的收听次数是24 或更低,还是有一些收听次数达到了几千,最大值是9667。这些值高得离谱,如果我们试图去预测实际的收听次数,模型会被这些异常值严重带偏。
更强壮的用户偏好表示方法是将收听次数二值化,把所有大于1 的次数值设为1,换言之,如果用户收听了某首歌曲至少一次,那么就认为该用户喜欢该歌曲。这样,模型就不用花费开销来预测原始收听次数之前的时间差别。二值目标变量是一个既简单又强壮的用户偏好衡量指标。

假设我们的任务是使用协同过滤方法预测某用户给某商家的打分。点评数量会是一个非常有用的输入特征,因为人气和高评分之间通常有很强的相关性。现在的问题就是,我们应该使用原始点评数量,还是应该对其做进一步的处理。
一种解决方法是对计数值进行区间量化,然后使用量化后的结果。换言之,我们将点评数量分到多个箱子里面,去掉实际的计数值。区间量化可以将连续型数值映射为离散型数值,我们可以将这种离散型数值看作一种有序的分箱序列,它表示的是对密度的测量。

1.固定宽度分箱

当数值横跨多个数量级时,最好按照10 的幂(或任何常数的幂)来进行分组

2.自适应分箱/p29

固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子。根据数据的分布特点,进行自适应的箱体定位,就可以解决这个问题。
分位数是可以将数据划分为相等的若干份数的值。

对数变换:
对数函数可以对大数值的范围进行压缩,对小数值的范围进行扩展。
对于具有重尾分布的正数值的处理,对数变换是一个非常强大的工具。(与高斯分布相比,重尾分布的概率质量更多地位于尾部。)它压缩了分布高端的长尾,使之成为较短的尾部,并将低端扩展为更长的头部。
我们在两个不同的数据集中比较了对数变换的效果,并展示了数据可视化的重要性。这里,我们特意使用了非常简单的输入特征和目标变量,以便非常容易地对它们之间的关系进行可视化。
在构建模型时,使用可视化方法查看一下输入和输出之间以及各个输入特征之间的关系是一种非常好的做法。
指数变换
指数变换是个变换族,对数变换只是它的一个特例。用统计学术语来说,它们都是方差稳定化变换。
要理解为什么方差稳定是个好性质,可以考虑一下泊松分布。泊松分布是一种重尾分布,它的方差等于它的均值。因此,它的质心越大,方差就越大,重尾程度也越大。
平方根变换和对数变换都可以简单推广为Box-Cox 变换:在这里插入图片描述
只有当数据为正时,Box-Cox 公式才有效。对于非正数据,我们可以加上一个固定的常数,对数据进行平移。当应用Box-Cox 变换或更广义的指数变换时,必须确定参数λ 的值,这可以通过极大似然方法(找到能使变换后信号的高斯似然最大化的λ 值)或贝叶斯方法来完成。
概率图(probplot)是一种非常简单的可视化方法,用以比较数据的实际分布与理论分布,它本质上是一种表示实测分位数和理论分位数的关系的散点图。P40?

特征缩放/归一化
有些模型是输入的平滑函数,比如线性回归模型、逻辑回归模型或包含矩阵的模
型,它们会受到输入尺度的影响。相反,那些基于树的模型则根本不在乎输入尺度有多
大。如果模型对输入特征的尺度很敏感,就需要进行特征缩放。
min-max缩放
特征标准化/方差缩放
缩放后的特征均值为0,方差为1
不要“中心化”稀疏数据!
如果平移量不是0,那么这两种变换会将一个多数元素为0 的稀疏特征向量变成密集特征向量。根据实现方式的不同,这种改变会给分类器带来巨大的计算负担。
L^{2}归一化
不论使用何种缩放方法,特征缩放总是将特征除以一个常数(称为归一化常数)。
所示,与对数变换不同,特征缩放不改变分布的形状,只有数据尺度发生了变化。
如果输入特征的尺度差别非常大,就会对模型训练算法带来数值稳定性方面的问题。在这种情况下,就应该对特征进行标准化。
粗略地说,特征选择技术可以分为以下三类。
过滤
过滤技术对特征进行预处理,以除去那些不太可能对模型有用处的特征。例如,我们可以计算出每个特征与响应变量之间的相关性或互信息,然后过滤掉那些在某个阈值之下的特征。
过滤技术的成本比下面描述的打包技术低廉得多,但它们没有考虑我们要使用的模型。
打包方法
这些技术的成本非常高昂,但它们可以试验特征的各个子集,这意味着我们不会意外地删除那些本身不提供什么信息但和其他特征组合起来却非常有用的特征。打包方法将模型视为一个能对推荐的特征子集给出合理评分的黑盒子。它们使用另外一种方法迭代地对特征子集进行优化。
嵌入式方法
这种方法将特征选择作为模型训练过程的一部分。嵌入式方法将特征选择整合为模型训练过程的一部分。它们不如打包方法强大,但成本也远不如打包方法那么高。与过滤技术相比,嵌入式方法可以选择出特别适合某种模型的特征。从这个意义上说,嵌入式方法在计算成本和结果质量之间实现了某种平衡。

chapter3
文本数据:扁平化、过滤和分块

不管是建立机器学习模型,还是构建特征,既简单又可以解释的结果自然是非常好的。简单的事情很容易尝试,相对于复杂的特征和模型,可解释的特征和模型更易于调试。虽然简单明了的特征不一定会得到最准确的模型,但从简单开始并且仅在绝对必要的时候才添加复杂性总是没错的。

如果某个单词(比如“aardvark”)在文档中出现了3 次,那么特征向量在对应于这个单词的位置就有一个计数值3。如果词汇表中的某个单词没有出现在文档中,那么它的计数值就是0。

词袋将一个文本文档转换为一个扁平向量。之所以说这个向量是“扁平”的,是因为它不包含原始文本中的任何结构。在词袋向量中,每个单词都是向量的一个维度。如果词汇表中有n 个单词,那么一篇文档就是n 维空间中的一个点.

有时候,在数据空间中查看特征向量也能获取很多信息。在数据空间中,特征向量中包含的是每个数据点中各个特征的值。坐标轴表示
各个数据点,其中的点表示特征向量。

我们应该知道,词袋是一种简单而有效的启发式方法,但离正确的文本语义理解还相去甚远。
这意味着n 元词袋是一个更大也更稀疏的特征空间,也意味着n 元词袋需要更强的计算、存储和建模能力。n 越大,能表示的信息越丰富,相应的成本也会越高。
停用词
Python 中通用的NLP 包NLTK 中包含了一个由语言学家定义的停用词列表,适用于多种语言。实际上,频率统计有助于将基于频率的过滤技术与停用词列表结合起来,但有一个问题,就是如何划分二者的界限。遗憾的是,这个问题没有统一的答案。多数情况下,需要人为地确定这个界限,而且要随着数据集的变化而不断调整。

罕见词
根据任务的不同,有时还需要过滤掉罕见词。罕见词可能是真正的生僻词,也可能是拼写错误的普通词。词汇表中60% 以上的词都是罕见词。这就是所谓的重尾分布,在实际数据中这种分布屡见不鲜。很多统计机器学习模型的训练时间是随着特征数量线性增长的,但有些模型则是平方增长或更糟糕。罕见词带来了很大的计算和存储成本,却收效甚微。

词干提取
词干提取是一种将每个单词转换为语言学中的基本词干形式的NLP 技术。词干提取有多种方法,有的基于语言学规则,有的基于统计观测。有一种算法子类综合了词性标注和语言规则,这种处理过程称为词形还原。

用于搭配提取的假设检验
一个文本文档的数字化表示就是一个字符串,也就是一个字符序列。我们还会遇到一些半结构化文档,比如JSON 字符串或HTML 页面。但即使添加了标记和结构,文本的基本单位还是字符串。我们如何将字符串转换为一个单词序列呢?这就需要文本的解析和分词技术
由于过去20 年中统计自然语言处理的出现和发展,人们已经越来越愿意使用统计方法来找出短语。与建立一个短语与惯用语的固定列表不同,统计性的搭配提取方法可以根据不断发展变化的数据来找出当前的流行用语。在这里插入图片描述
通过似然比检验这种分析方法来检测常见短语的算法如下。
(1) 计算出所有单词的出现概率:P(w)。
(2) 对所有的唯一二元词,计算出成对单词出现的条件概率:P(w2 | w1)。
(3) 对所有的唯一二元词,计算出似然比log λ。
(4) 按照似然比为二元词排序。
(5) 将似然比最小的二元词作为特征。

理解似然比检验
似然比检验的关键在于,它比较的不是概率参数本身,而是在这些参数(以及预设的数据生成模型)之下得到实际观测数据的概率。似然是统计学习中的一个核心概念,刚学习时会觉得它难以理解,但是一旦理解了其中的逻辑,就会觉得它很直观易懂。

文本分块和词性标注

举例来说,或许我们最感兴趣的是找出一个问题中的所有名词短语,即这个问题中的实体(在下面的例子中是文本标题)。为了找出这些短语,我们先切分出所有带词性的单词,然后检查这些标记的邻近词,找出按词性组合的词组,这些词组又称为“块”。将单词映射到词性的模型通常与特定的语言有关。一些开源的Python 程序库(比如NLTK、spaCy 和TextBlob)中带有适用于多种语言的模型。

要解决稀疏性和成本增加的问题,一种方法是对n 元词进行过滤,只保留那些最有意义的短语。这就是搭配提取的目标。理论上,搭配(或短语)可以形成文本中不连贯的标记序列,但实际上,找出不连贯的短语需要非常高的计算成本,而且收效甚微。所以,搭配提取通常从一个备选二元词列表开始,然后使用统计方法对其进行过滤。

Chapter4
特征缩放的效果:从词袋到tf-idf

能挑选出像“magnificently”“gleamed”“intimidated”“tentatively”和“reigned”这样的单词也是很好的,因为它们有助于确定该段文字的整体基调。它们能体现出情感,这对数据科学家来说是非常宝贵的信息。所以,理想情况下,我们需要那种能强调出有意义的单词的表示方法。

bow(w, d) = 单词w 在文档d 中出现的次数
tf-idf(w, d) = bow(w, d) * N / ( 单词w 出现在其中的文档数量)

如果一个单词出现在很多文档中,那么它的逆文档频率就接近于1。如果一个单词只出现在少数几个文档中,那么它的逆文档频率就会高得多。
在这里插入图片描述

我们也可以使用逆文档频率的对数变换,而不是它的原始形式。
tf-idf(w, d) = bow(w, d) * log(N / 单词w 出现在其中的文档数量)
那么就可以有效地将一个几乎出现在所有单个文档中的单词的计数归零,而一个只出现在少数几个文档中的单词的计数将会被放大。

在这个例子中,两类商家的点评数量相差很大,这称为类别不平衡数据集。不平衡数据集的建模有些问题,因为模型会将大部分努力用于拟合优势类别。因为在两个类别中我们都有很多数据,所以解决这个问题的一种好的做法是对优势类别(餐馆)进行下采样,使它的数量与劣势类别(夜店)基本相当。
特征缩放的微妙之处在于,它要求我们知道一些实际中我们很可能不知道的特征统计量,比如均值、方差、文档频率、ℓ2 范数,等等。为了计算出tf-idf表示,我们必须基于训练数据计算出逆文档频率,并用这些统计量既缩放训练数据也缩放测试数据。在scikit-learn 中,在训练数据上拟合特征转换器相当于收集相关统计量。然后可以将拟合好的特征转换器应用到测试数据上。
超参数
一种基本的超参数调优方法称为网格搜索:先确定一个超参数网格,然后使用调优程序自动搜索,找到网格中的最优超参数设置。找到最优超参数设置之后,你可以使用该设置在整个训练集上训练一个模型,然后使用它在测试集上的表现作为这类模型的最终评价。
当比较模型或特征时,必须对超参数进行调优。软件包的默认设置总是能返回一个模型,但除非软件包能在后台自动调优,否则它很可能基于非最优的超参数设置返回一个非最优模型。分类器性能对超参数设置的敏感度依赖于具体的模型和训练数据的分布。相对来说,逻辑回归对于超参数设置是不太敏感的,但即便这样,找到并使用正确的超参数范围还是必要的。否则,如果仅因为超参数调优的原因,一个模型才比另一个模型有优势,就反映不出模型或特征的实际行为了。
即使是最好的能自动调优的软件包,也需要确定搜索的上界和下界,而确定这些界限也需要手动尝试若干次。
在这里插入图片描述

现代统计方法假定基本数据来自于随机分布。对于从这种数据导出的模型,它的性能测量也会受到随机噪声的影响。在这种情况下,好的做法是不止做一次测量,而是基于具有大致相同的统计量的数据集进行多次测量。这样可以获得一个测量结果的置信区间。
因为多数文档只包含所有可能出现的单词中的一小部分,所有矩阵中的多数元素都是0,这是个稀疏矩阵。特征缩放实质上是数据矩阵上的列操作。特别地,tf-idf 和ℓ2 归一化都是对整个列(例如,一个n 元词特征)乘以一个常数。tf-idf 和ℓ2 归一化都是数据矩阵上的列操作。
在这里插入图片描述

通过词袋表示,与特征数量相比,列空间相对较小。可能有些单词在同一文档中出现了大致相同的次数,这会导致相应的列向量几乎是线性相关的,进而导致列空间不是满秩的(尽管它可以满秩)。(满秩的定义请参见附录A。)这种情况称为秩亏。(与动物缺少维生素和矿
物质的情况非常类似,矩阵也可以缺少秩,这样输出空间就不像它本应的那么饱满。)

#没看太懂
秩亏的行空间和列空间会使模型对问题用力过猛。线性模型会为数据集中的每个特征都配备一个权重参数。如果行空间和列空间是满秩的1,模型会生成输出空间中的任何目标向量。当它们秩亏时,模型会具有更多不必要的自由度,这会导致更加难以确定最终解。
二者之间有个小区别,那就是tf-idf 既可以“拉长”单词计数,也可以“压缩”它。换句话说,它可以使某些计数变大,同时使其他计数接近于0。因此,tf-idf 可以比较彻底地消除那些没有信息量的单词。
通过这种方法,我们还发现了特征缩放的另一个作用:它可以减少数据矩阵的条件数,大大加快训练线性模型的速度。ℓ2 归一化和tf-idf 都有这种效果。
总而言之,我们的收获是:正确的特征缩放有助于分类问题。正确缩放可以突出有信息量的单词,并削弱普通单词的影响。它还可以减少数据矩阵的条件数。正确的缩放不一定是标准的列缩放。
本章内容很好地说明了在一般情况下分析特征工程效果的难度。改变特征会影响训练过程以及随后的模型。尽管线性模型是最容易理解的模型,但还是需要极为细致的实验方法和大量高深的数学知识,才能梳理出理论上和实际的影响。
对于更加复杂的模型或特征变换,这种分析几乎是不可能实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值