特征学习阅读笔记

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 都有这种效果。
总而言之,我们的收获是:正确的特征缩放有助于分类问题。正确缩放可以突出有信息量的单词,并削弱普通单词的影响。它还可以减少数据矩阵的条件数。正确的缩放不一定是标准的列缩放。
本章内容很好地说明了在一般情况下分析特征工程效果的难度。改变特征会影响训练过程以及随后的模型。尽管线性模型是最容易理解的模型,但还是需要极为细致的实验方法和大量高深的数学知识,才能梳理出理论上和实际的影响。
对于更加复杂的模型或特征变换,这种分析几乎是不可能实现的。

特征学习笔记Chapter1-Chapter4相关推荐

  1. 一些语音特征--学习笔记

    常用的语音特征: 语谱图(spectrogram):输入语音,预加重,分帧,加窗,FFT,幅值平方,对数功率 Fbank:输入语音,预加重,分帧,加窗,FFT,幅值平方,mel滤波器,对数功率 MFC ...

  2. Java 面向对象的特征---学习笔记

    1.继承: 在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容, 并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承. ...

  3. BRISK特征 学习笔记

    BRISK: Binary Robust In variant ScalableKeypoints BRISK特征描述子 1.     简介 BRISK描述子由Stefan Leutenegger等人 ...

  4. 《微信小程序开发实战》学习笔记chapter1微信小程序人门

    Chapter01 微信小程序入门 1. 微信小程序介绍 1.1 什么是微信小程序 微信小程序是腾讯于2017年1月19日推出的一种不需要安装即可在微信平台上使用的应用.微信小程序和微信的原生功能应用 ...

  5. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记chapter1第一章(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. $1.4强制类型转化运算符的新形式:     类型名(待转化的表达式),如double(a),int(3.5) $1.5函数参数的默认值     在 ...

  6. Spring In Action 5 学习笔记 chapter1

    环境 win7x64 idea 2018.3 maven 3.3.9 spring 4.0.4 很久没摸spring boot了,idea还是2018的,生疏了,抓起来再看看.[我亦无他,惟手熟尔] ...

  7. 影像组学视频学习笔记(41)-如何使用软件提取组学特征、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/72186eb3e395 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(41)主要 ...

  8. 影像组学视频学习笔记(23)-主成分析PCA、降维和特征筛选的区别、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(23)主要讲解: 主成分析PCA,影像组学降维和特征筛选的区别 0. PCA(Principal component analysis) ...

  9. 影像组学视频学习笔记(34)-使用3D Slicer软件提取影像组学特征、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/afcd06221ea4 来源:简书,已获授权转载 RadiomicsWorld.com "影像组学世界" ...

最新文章

  1. 采摘工人月薪十万却无人应聘,英澳农场求助 AI
  2. 数据集获取加速神器来了!
  3. VS中添加lib文件,编译出错:LINK : fatal error LNK1104: 无法打开文件:×××.lib解决办法
  4. 招不招新人?IT经理很纠结.
  5. Adaboost from Baidu
  6. Python 序列类型支持拆包操作
  7. element-ui 使用table控件绑定的list数据的坑
  8. 500w 的引用类型和值类型到底有多大差异?
  9. 第五章应用系统安全基础备考要点及真题分布
  10. linux 文件 16进制显示,linux 16进制 产看文件
  11. 不止 Java,Oracle 向 JavaScript 开炮!
  12. 【论文写作】毕业论文中容易栽的九个坑
  13. 男人要走过几条路才称得上男子汉?
  14. y = mapminmax(‘apply‘,x,ps)与mapminmax(‘reverse‘,y,ps)
  15. LCD屏幕 ~ 字模提取工具和图片转码工具
  16. Egret引擎基础教程II(EUI基础使用教程)
  17. nas智能家居服务器,智能家居 | 群晖NAS,你的智能生活中心 Vol.1
  18. 银尔达-----合宙Air724全网通4g DTU无线透传模块串口UART(TTL)+RS485核心板
  19. iris学习踩坑之旅
  20. 光速学会前端三件套之html

热门文章

  1. 线性dp:DP9 环形数组的连续子数组最大和
  2. python/educoder第4关:综合运用
  3. 微信小程序(日历/日期)选择插件
  4. AI_综述:3D目标检测于RGB-D(Object detection in RGB-D images)
  5. 程序员的简历应该这么写!!
  6. HNOI 2012 永无乡
  7. java调用.sh文件_java 调用cmd/sh文件
  8. 敏捷个人2012.1月份线下活动报道:谈谈职业
  9. controll层跳转页面_以SpringMVC注解的形式 从Controller跳到另一个Controller 实现登入页面的跳转...
  10. 基于陷波滤波器的永磁同步电机振动抑制学习笔记