特征工程
|
模型评估
|
经典算法
|
降维
|
非监督学习
|
优化算法
|
采样
|
集成学习
|
神经网络
(0)问题:自我检验: 面试经验 | AI 算法工程师(面试官角度)
(1)综合知识点整理:
(2)零散知识
数据预测处理:
合鲸:干货 | 教你一文掌握数据预处理
(3)随文详解 :自己记录详细的知识
学了那么多机器学习的理论和算法模型,回过头来再看看这最基础的几个概念:数据、特征和模型。
数据是对现实世界现象的观测。
例如,股票市场数据包括对每日股价、各个公司的盈余公告,甚至专家学者发表的股评文章的观测;个人的生物特征数据包括对每分钟的心率、血糖水平、血压等指标的测量。不同领域的数据示例无穷无尽,不一而足。
每份数据都是管中窥豹,只能反映一小部分现实,把这些观测综合起来才能得到一个完整的描述。
但这个描述非常散乱,因为它由成千上万个小片段组成,而且总是存在测量噪声和缺失值。
总而言之,我们用数据来描述客观事物。这些数据总是会不同程度地存在着噪声和缺失值。
想要(理想地)完整描述需要无穷尽的数据,所以这个描述显得非常散乱。
从数据到答案的路上,充满了错误的开始和死胡同,经常是有意栽花花不发,无心插柳柳成荫。
数据处理工作流往往是多阶段的迭代过程。
举个例子,股票价格是在交易所中观测到的,然后由像汤森路透这样的中间机构进行汇集并保存在数据库中,之后被某个公司买去,转换为一个 Hadoop 集群上的 Hive 仓库,再被某个脚本从仓库中读出,进行二次抽样和各种处理,接着通过另一个脚本进行清洗,导出到一个文件,转换为某种格式,然后你使用 R、Python 或 Scala 中你最喜欢的建模程序进行试验。接着,预测结果被导出为一个CSV 文件,再用一个估值程序进行解析。模型会被迭代多次,由产品团队用 C++ 或 Java 重写,并在全部数据上运行,然后最终的预测结果会输出到另一个数据库中保存起来。
然而,如果我们不被这些杂乱的工具与系统所迷惑,就能够发现这个过程包括两个构成机器学习基础的数学实体:特征和模型。
特征就是,于己而言,特征是某些突出性质的表现,于它而言,特征是区分事物的关键。(参考知乎某答)
我们将描述事物的特征分为数值型特征(定量特征)和非数值型特征(定性特征)。根据数据是否无限可分,可以将数值型特征再继续细分为连续特征和离散特征。
(关于统计学中连续变量和离散变量的定义可参考:
在统计学中,变量按变量值是否连续可分为连续变量与离散变量两种。在一定区间内可以任意取值的变量叫连续变量,其数值是连续不断的,相邻两个数值可作无限分割,即可取无限个数值。例如,生产零件的规格尺寸,人体测量的身高、体重、胸围等为连续变量,其数值只能用测量或计量的方法取得。
反之,其数值只能用自然数或整数单位计算的则为离散变量。例如,企业个数,职工人数,设备台数等,只能按计量单位数计数,这种变量的数值一般用计数方法取得。)
即:
离散特征 = 定性特征 ?——(X)
连续特征 = 定量特征 ?——(X)
定量特征:离散特征 + 连续特征(√)
关于变量:点击
从上一节的例子中可以得知,我们平时验证自己的模型时用到的数据集大多数都是已经是被整理过和处理好的数据(由特征和特征值组成)
很多机器学习算法要求输入的样本特征是数学上可计算的, 因此在机器学习之前我们需要将这些不同类型的数据转换为向量表示.即将数据特征向量化
,完成数据的特征表示。(原始数据空间——特征空间)
(也有一些机器学习算法,比如决策树,不需要向量形式的特征,当然也就不需要特征工程中的归一化等处理)
数据的数学模型 描述了数据不同部分之间的关系。
例如,预测股票价格的模型可以是一个公式,它将公司的收入历史、过去的股票价格和行业映射为预测的股票价格。音乐推荐模型可以基于收听习惯测量用户之间的相似度,然后向收听大量同种歌曲的用户推荐同一个音乐家。
线性模型和非线性模型的区别:
a.线性模型可以用曲线拟合样本,线性模型可以是用曲线拟合样本,但是分类的决策边界一定是直线的,例如logistics模型(广义线性模型,将线性函数进行了一次映射)。
b. 区分是否为线性模型,主要是看一个乘法式子中自变量x前的系数w,如果w只影响一个x,那么此模型为线性模型。或者判断决策边界是否是线性的
c. 其实最简单判别一个模型是否为线性的,只需要判别决策边界是否是直线,也就是是否能用一条直线来划分
更多线性/非线性模型概念:点击
更多点击:
由生成模型与判别模型引发出的思考、是什么机器学习中生成模型/判别模型?
启发
数据
|
特征 <-特征工程:空间转换(欧式空间-向量表示)、归一化、特征选择、降维
|
模型 <- 数据关系的近似描述:“距离”比较(距离、相似度计算)…
|
答案 <-描述结果:分类、回归、排序…
简单地说,我们的最终目的非常清晰明了:发现数据 + 理解数据。
如果以数据为视角,在本质上来看,整个机器学习的流程不过是一个进行数据分析的过程,只不过因为在将数据变为有用的特征和数据关系描述建模,即特征和模型这两块用到了数学的方法,因此显得比较专业化。前者即是特征工程的任务,主要包括我们目前所熟知的向量化、归一化和缺失值处理等预处理工作,以及特征选择和降维等主要步骤而后者,模型的构建主要是利用常见的数学模型,例如机器学习中常用到的线性回归和逻辑回归等线性模型,决策树、随机森林和梯度提升(gradient boosting)等树模型以及以CNN为代表的的神经网络模型等。
问题:
离散、连续特征一般怎么处理(onehot、归一化、why、方法 等);
特征变换、构造/衍生新特征(woe、iv、统计量 等);
特征筛选(离散、连续、多重共线性 等);
采样(除了随机呢?);
缺失值处理(离散、连续)
…
特征工程的概念:
有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。从本质上来讲,特征工程是一个表示和展现数据的过程。在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系。
通过总结和归纳,人们认为特征工程包括以下方面:(感觉是真的站在了工程的角度上来总结)
特征工程的核心:特征处理
特征处理是特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。
框架如下:
这里主要将 数据分为数值变量和分类变量来进行,而不是现在经常见到的连续型变量和离型变量(这种分法很直观,但是好像不太正确,在下面会阐述)
作用:① 无量纲化:将不同规格的数据转换到同一规格——以使得不同的特征具有相同的尺度(Scale),以解决不同指标无法比较的问题。②在训练神经网络的过程中,通过将数据标准化,能够加速权重参数的收敛(加快了梯度下降求最优解的速度)。
写在前面:标准化和归一化这两个词经常混用,所以不用具体纠结于区分标准化和归一化,自己喜欢的话,可以统一叫做”标准化/归一化“。
对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。最常用的方法主要有以下两种:
零均值归一化(Z-Score Normalization) / z-score 标准化 / 方差缩放
零均值归一化是最常见的特征预处理方式,它的作用是将原始数据中心化(分子部分),并标准化成均值为0、标准差为1的一个服从正态分布的数据。
如何本质上理解0均值归一化?其实就是取其离散程度的比值:(依据数据分布)将数据原来x到中心点μ的距离和标准差的比值当做新的x‘(”像标准分布靠拢“)
线性函数归一化(Min-Max Scaling)/ min-max 归一化/min-max缩放/极差变换
对原始数据进行线性变换,将其映射到 [0,1]的范围
如何本质上理解线性函数归一化?其实就是取其极差的比值:(将数据看为在一维直有限直线上的分布)将x在原来线段长度上所占的比值作为新的x’(”像标准线段靠拢“)
注意:不要“中心化”稀疏数据!
在稀疏矩阵上执行 0 均值归一化和 min-max 归一化会将其变成密集特征向量,因为他们都会从原始特征值中减去一个量(min 或者μ)。
归一化相关更详细解释:点击1 、点击 2
将|x1|到 |xn| 先取p次幂再取 1/p 次幂不仅计算麻烦而且没啥用啊,所以取每一个 |xn|的p次幂,求和之后再取 1/p 次幂!——纯属YY
可见,L2范数即为欧式距离,则规则为L2的Normalization公式如下所示,易知,其将每行(条)数据转为相应的“单位向量”。
范数归一化的过程是将每个样本缩放到单位范数(结合单位向量进行理解,p=2时为单位向量,其他为单位范数),如果后面要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。
更多参考之前的文章:“距离”、“范数”和范数正则化
补充:
数据一般的处理方法:
对数值变量进行归一化,比如零均值归一化;
对分类变量进行 one-hot 编码和序号编码。
序号编码:序号编码通常用于处理类别间具有大小关系的数据。例如高表示为3、中表示为2、低表示为1,转换后依然保留了大小关系。
其它需要进一步转换的情况:
(1)缺失值
特征有缺失值是非常常见的,对于连续特征,一般采取两种方式来处理:
对于离散型特征,一般取“众数”来进行填充,即选择所有有该特征值的样本中最频繁出现的类别值
在sklearn中,可以使用preprocessing.Imputer来选择这三种不同的处理逻辑做预处理。
(2)特殊值
有些特征的默认取值比较特殊,一般需要做了处理后才能用于算法,比如日期时间。
对于时间原始特征,处理方法有很多:
(1)特征变换——解决非正态性的问题
数据变换一般分为单变量变换和多变量变换。
一般来说多变量变换就成为了特征抽取(Feature Extraction),维度压缩(Dimension Reduction),数据分解(Decomposition)等, 譬如主成分分析(PCA)。这里主要还是单变量的变换。
单变量的变换又分为线性变换和非线性变换, 这里主要是利用一些非线性变换, 来获取合适数据分布的常见方法。
常见的变换方法有如下几种:
一般使用经验:
(破折号后面代表使用的条件/情况)
直接标准化——变换前,数据接近正态分布
个人理解:为什么这些个情况,通过这些函数的变换就可以将数据分布向正态分布靠拢?其实结合这些常见数学函数的图像就可以理解了:
更多参考:点击
(2)构造/衍生新特征
参考下面的小结:[寻找高级特征]
首先,看当业务已经整理好各种特征数据时,第一步是找到该领域懂业务的专家,让他们给一些建议。
其次,通常来说,我们需要从特征是否发散(看方差)和特征与目标的相关性这两个方面来考虑选择特征。
特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。
这样看来,特征选择与降维似乎是一个意思?
不不不,特征选择和降维有着些许的相似点,这两者达到的效果是一样的,就是试图去减少特征数据集中的属性(或者称为特征)的数目;
但是两者所采用的方式方法却不同:降维的方法主要是通过特征间的关系,如组合不同的特征得新的属性,这样就改变了原来的特征空间;而特征选择的方法是从原始特征数据集中选择出子集,是一种包含的关系,没有更改原始的特征空间。参考点击
具体来说,常规特征选择的方法有以下三类:
其主要思想是:对每一维的特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该维特征的重要性,然后依据权重排序。
方差
最简单的方法就是方差筛选。方差越大的特征,那么我们可以认为它是比较有用的。在实际应用中,我们会指定一个方差的阈值,当方差小于这个阈值的特征会被我们筛掉。
如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。
相关系数
分别计算所有训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。
假设检验
比如卡方检验,卡方检验可以检验某个特征分布和输出值分布之间的相关性。
还可以使用 F 检验和 t 检验
互信息
即从信息熵的角度分析各个特征和输出值之间的关系评分。互信息值越大,说明该特征和输出值之间的相关性越大,越需要保留。
包装法的解决思路没有过滤法这么直接,它会选择一个目标函数来一步步的筛选特征。
其主要思想是:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA,PSO,DE,ABC等。
最常用的方法是递归消除特征法(recursive feature elimination,RFE)。递归消除特征法使用一个机器学习模型来进行多轮训练,每轮训练后,消除若干权值系数的对应的特征,再基于新的特征集进行下一轮训练。
我们下面以经典的SVM-RFE算法来讨论这个特征选择的思路。这个算法以支持向量机来做RFE的机器学习模型选择特征。它在第一轮训练的时候,会选择所有的特征来训练,得到了分类的超平面˙+=0后,如果有n个特征,那么RFE-SVM会选择出中分量的平方值2最小的那个序号i对应的特征,将其排除,在第二类的时候,特征数就剩下n-1个了,我们继续用这n-1个特征和输出值来训练SVM,同样的,去掉2最小的那个序号i对应的特征。以此类推,直到剩下的特征数满足我们的需求为止。
嵌入法也是用机器学习的方法来选择特征,但是它和RFE的区别是它不是通过不停的筛掉特征来进行训练,而是使用的都是特征全集。
其主要思想是:在模型既定的情况下,学习出对提高模型准确性最好的属性,其主要方法是正则化。
最常用的是使用L1正则化和L2正则化来选择特征。正则化惩罚项越大,那么模型的系数就会越小,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0. 但是我们会发现一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。也就是说,我们选择特征系数较大的特征。常用的L1正则化和L2正则化来选择特征的基学习器是逻辑回归。
此外也可以使用决策树或者GBDT。
寻找更高级特征的方法,可以最常采取的方法有:
当然,寻找高级特征的方法远不止于此,它需要你根据你的业务和模型需要而得,而不是随便的两两组合形成高级特征,这样容易导致特征爆炸,反而没有办法得到较好的模型。个人经验是,聚类的时候高级特征尽量少一点,分类回归的时候高级特征适度的多一点。
更多参考:
特征工程之特征选择
机器学习中的特征——特征选择的方法以及注意点
An Introduction to Feature Selection
不均衡数据:因变量y(不是特征)在不同类别中的分布不均衡
这个问题其实不算特征预处理的部分,不过其实它的实质还是训练集中各个类别的样本的特征分布不一致的问题,所以这里我们一起讲。
我们做分类算法训练时,如果训练集里的各个类别的样本数量不是大约相同的比例,就需要处理样本不平衡问题。也许你会说,不处理会怎么样呢?如果不处理,那么拟合出来的模型对于训练集中少样本的类别泛化能力会很差。举个例子,我们是一个二分类问题,如果训练集里A类别样本占90%,B类别样本占10%。 而测试集里A类别样本占50%, B类别样本占50%, 如果不考虑类别不平衡问题,训练出来的模型对于类别B的预测准确率会很低,甚至低于50%。
如何解决这个问题呢?一般有几种方法:权重法、采样法和使用AUC指标等。
权重法是比较简单的方法,我们可以对训练集里的每个类别加一个权重class weight。如果该类别的样本数多,那么它的权重就低,反之则权重就高。如果更细致点,我们还可以对每个样本加权重sample weight,思路和类别权重也是一样,即样本数多的类别ƒ样本权重低,反之样本权重高。
针对类别不均衡的问题,采样有两种思路:
上述两种常用的采样法很简单,但是都有个问题,就是采样后改变了训练集的分布,可能导致泛化能力差。
所以有的算法就通过其他方法来避免这个问题,比如SMOTE算法通过人工合成的方法来生成少类别的样本。
生成方法是:选取数据少的类别的一点,找出它的最近点,算出差值,随机生成一个0和1之间的随机数,差值乘以随机数。
补:关于采样
其实我们在训练模型的过程,都会经常进行数据采样,为了就是让我们的模型可以更好的去学习数据的特征,从而让效果更佳。但这是比较浅层的理解,更本质上,数据采样就是对随机现象的模拟,根据给定的概率分布从而模拟一个随机事件。另一说法就是用少量的样本点去近似一个总体分布,并刻画总体分布中的不确定性。因为我们在现实生活中,大多数数据都是庞大的,所以总体分布可能就包含了无数多的样本点,模型是无法对这些海量的数据进行直接建模的(至少目前而言),而且从效率上也不推荐。
因此,我们一般会从总体样本中抽取出一个子集来近似总体分布,这个子集被称为“训练集”,然后模型训练的目的就是最小化训练集上的损失函数,训练完成后,需要另一个数据集来评估模型,也被称为“测试集”。
采样的一些高级用法,比如对样本进行多次重采样,来估计统计量的偏差与方法,也可以对目标信息保留不变的情况下,不断改变样本的分布来适应模型训练与学习(经典的应用如解决样本不均衡的问题)。
更多参考:特征工程之特征预处理、机器学习之类别不平衡问题 (3) —— 采样方法
当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1、L2惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。
PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
文本表示模型
(1)词袋模型和 N-gram 模型
词袋模型(bag of words)
忽略词的顺序,使用 TF-IDF(词频-逆文档频率)计算权重:
tf-idf = TF * IDF = 单词 t 在文档 d 中出现的次数 / 文档 d总的单词数 * log { 文档总数 / (包含单词 t 的文档总数+1) }
tf-idf
直观的解释是,如果一个单词在非常多的文章里面都出现,那么它可能是一个比较通用的词汇,对于区分某篇文章特殊语义的贡献较小,因此对权重做一定惩罚。
N-gram 模型
词袋模型的升级版,将连续出现的n个词(n≤N)组成的词组(N-gram)也作为一个单独的特征放到向量表示中去(若 n=3,则 gram 为 1、2 和 3 )。本质是做了一个大小为n的滑窗的操作。
(2)主题模型
(3)词嵌入与深度学习模型
能够更好地对文本进行建模,抽取出一些高层的语义特征。
word2vec
CBOW 模型:拿(一个词语的)上下文作为输入,来预测当前词的生成概率;
Skip-gram 模型:用一个词语作为输入(使用当前词),来预测它上下文中各词的生成概率;
LDA 与 Word2Vec 的区别与联系?
首先,LDA是利用文档中单词的共现关系来对单词按主题聚类,也可以理解为对“文档-单词”矩阵进行分解,得到“文档-主题”和“主题-单词”两个概率分布。而Word2Vec其实是对“上下文-单词”矩阵进行学习,其中上下文由周围的几个单词组成,由此得到的词向量表示更多地融入了上下文共现的特征。
主题模型和词嵌入两类方法最大的不同其实在于模型本身,主题模型是一种基于概率图模型的生成式模型,其似然函数可以写成若干条件概率连乘的形式,其中包括需要推测的隐含变量(即主题);而词嵌入模型一般表达为神经网络的形式,似然函数定义在网络的输出之上,需要通过学习网络的权重以得到单词的稠密向量表示。
一个模型所能提供的信息一般来源于两个方面,一是训练数据中蕴含的信息;二是在模型的形成过程中(包括构造、学习、推理等),人们提供的先验信息。
造成的问题:过拟合
解决办法:
(1)基于数据:数据增强
在计算机科学特别是机器学习领域中,对模型的评估同样至关重要。只有选择与问题相匹配的评估方法,才能快速地发现模型选择或训练过程中出现的问题,迭代地对模型进行优化。
模型评估主要分为离线评估和在线评估两个阶段。针对分类、排序、回归、序列预测等不同类型的机器学习问题,评估指标的选择也有所不同。
在离线评估中,我们经常使用的有准确率(accuracy)、精确率-召回率(precision-recall);
而在在线评估中,一般使用一些商业评价指标,如用户生命周期值(customer lifetime value)、广告点击率(click
through rate)、用户流失率(customer churn rate)等,这些指标才是模型使用者最终关心的一些指标。甚至在对模型进行训练和验证过程中使用的评价指标都不一样。
准确率的局限性
当不同类别的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。
可选择用平均准确率作为评判指标
精确率与召回率的权衡
精确率是指分类正确的正样本个数占分类器判定为正样本的样本个数的比例。
召回率是指分类正确的正样本个数占真正的正样本个数的比例。在排序问题中,
通常没有一个确定的阈值把得到的结果直接判定为正样本或负样本,而是采用Top N返回结果的Precision值和Recall值来衡量排序模型的性能,即认为模型返回的Top N的结果就是模型判定的正样本,然后计算前N个位置上的准确率Precision@N和前N个位置上的召回率Recall@N。
解决:
P-R曲线的横轴是召回率,纵轴是精确率。对于一个排序模型来说,其P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。
整条P-R曲线是通过将阈值从高到低移动而生成的。
调和平均数:数值倒数的平均数的倒数,它是加权算术平均数的变形,附属于算术平均数
调和平均的哲学意义是在一个过程中有多少条平行的路径,经过这些平行的路径后,等效的结果就是调和平均。
一般情况下,RMSE能够很好地反映回归模型预测值与真实值的偏离程度。但在实际问题中,如果存在个别偏离程度非常大的离群点(Outlier)时,即使离群点数量非常少,也会让RMSE指标变得很差。
相对于使用MAE计算损失,使用MSE的模型会赋予异常点更大的权重。
解决:
ROC曲线的横坐标为假阳性率(False Positive Rate,FPR);
纵坐标为真阳性率(True Positive Rate,TPR)
非常绕,但是结合实际来思考,为什么分别以负样本数(N)和正样本数来作为分母(P)其实是有一定道理的,因为不论判断的对错,我们正真需要负责的人是哪些实际上是”正“或者”负“的人。
AUC指的是ROC曲线下的面积大小,计算AUC值只需要沿着ROC横轴做积分就可以了
AUC 与 P-R 曲线
ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。
(相对 P-R 曲线,AUC 曲线能够更好的应对数据正负样本不均衡的问题)
在机器学习问题中,通常将特征表示为向量的形式,所以在分析两个特征向量之间的相似性时,常使用余弦相似度来表示。
总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。
在机器学习领域中,A/B 测试是验证模型最终效果的主要手段。
在机器学习中,我们通常把样本分为训练集和测试集,训练集用于训练模型,测试集用于评估模型。在样本划分和模型验证的过程中,存在着不同的抽样方法和验证方法。
可知,当样本数很大时,大约有 1/e = 36.8% 的样本从未被选择过,可作为验证集。
超参数搜索算法一般包括的几个要素:
- 目标函数,即算法需要最大化/最小化的目标
- 搜索范围,一般通过上限和下限来确定
- 算法的其他参数,如搜索步长
问题:
常用loss、正则、sgd、l-bfgs、auc公式及优缺点、数据不平衡时的调参…
booting:gbdt的loss、分裂节点依据、防过拟合;
xgb的loss选择、泰勒展开、正则(gbdt能加么)、并行、vs lightGBM;
lambdaMart的loss–如何直接优化metric(如NDCG)–学习/train过程;
svm的优化目标、软间隔、调参;
lr;rf;
(1)先简单总结一下 SVM:
基本的 SVM 是一种线性模型,可以用于解决二分类问题;SVM 的一个特点:寻求间隔最大的的分类超平面;这种 SVM 叫做线性可分支持向量机,也被称为硬间隔支持向量机。
当数据近似线性可分时,可以通过软间隔最大化,训练一个线性支持向量机。
当数据线性不可分时,我们通过核技巧和软间隔最大化训练出非线性支持向量机。
(2)简单阐述 SVM 和 LR 的区别与联系
相同点:
不同点:
损失函数不同
SVM 为合页(hinge)损失,LR 为 log 损失
对非线性问题的处理方式不同
LR主要靠特征构造,必须组合交叉特征,特征离散化。
SVM也可以这样,还可以通过kernel(因为只有支持向量参与核计算,计算复杂度不高)
(由于可以利用核函数,。SVM则可以通过对偶求解高效处理。LR则在特征空间维度很高时,表现较差。)
SVM的损失函数就自带正则!SVM是结构风险最小化算法,而LR必须另外在损失函数上添加正则项!!
参考:点击
理论
基础理论:机器学习算法/模型——支持向量机
这篇文章讲得特别好:【ML】支持向量机(SVM)从入门到放弃再到掌握
面试考点:数据挖掘(机器学习)面试–SVM面试常考问题
(3)其它问题(来自《百面》):
逻辑回归(Logistic Regression)可以说是机器学习领域最基础也是最常用的模型,逻辑回归的原理推导以及扩展应用几乎是算法工程师的必备技能。
(1)逻辑回归相比于线性回归,有何异同?
不同点:
理论参考:机器学习中的线性函数
决策树
降维:使用一个低维度的向量来表示原始高纬度的特征。
(1)PCA(主成分分析)
PCA 是一种线性、无监督、全局的降维算法。
机器学习算法/模型——有监督到无监督(聚类):由 KNN 到 K-menas
(1)(基本思想:通过迭代的方式,找到使得各个样本距离所属簇中心点的误差平方和最小(损失函数)的 K 个簇。
(2)优缺点
缺点:
优点:
(3)改进点
高斯混合模型假设每个簇的数据都是符合高斯分布(又叫正态分布)的,当前数据呈现的分布就是各个簇的高斯分布叠加在一起的结果
概率图模型 = 图模型
主要包括两大类:
这块是空白,先补几个大洞:
(1)朴素贝叶斯模型、最大熵模型
(2) 生成模型与判别模型
(3)马尔科夫模型
(4)主题模型
参见
(1)什么是机器学习里的优化?
(2)机器学习中那些是凸优化问题,哪些是非凸优化问题?举例说明。
1.直接法(公式法):梯度为 0 的方程组直接求解
条件:①目标函数L(θ)为凸函数 ② 在θ*处梯度为0 闭式有解
所以比较局限,同时满足的经典例子是岭回归,其目标函数为:
推导后可得到最优解:
2.迭代法(数值优化):近似求解
在很多实际问题中,会采用迭代法。迭代法就是迭代地修正对最优解的估计。
这部分也可参考之前的笔记:模型框架:假设函数、目标函数和优化算法
(1)当训练数据量特别大时,经典的梯度下降法存在什么问题,需要做如何改进?
回答上述问题的思路:
梯度下降
|
随机梯度下降
|
小批量梯度下降
经典的梯度下降法采用所有训练数据的平均损失来近似目标函数。因此,经典的梯度下降法在每次对模型参数进行更新时,需要遍历所有的训练数据。
为了解决该问题,随机梯度下降法(Stochastic Gradient Descent,SGD)用单个训练样本的损失来近似平均损失。
因此,随机梯度下降法用单个训练数据即可对模型参数进行一次更新,大大加快了收敛速率。该方法也非常适用于数据源源不断到来的在线更新场景。
为了降低随机梯度的方差,从而使得迭代算法更加稳定,也为了充分利用高度优化的矩阵运算操作,在实际应用中我们会同时处理若干训练数据,该方法被称为小批量梯度下降法(Mini-Batch Gradient Descent)。
对于小批量梯度下降法的使用,有以下三点需要注意的地方:
(2)随机梯度下降法在优化过程中表现不好或者失效的原因?
深度学习中最常用的优化方法是随机梯度下降法,但是随机梯度下降法偶尔也会失效,无法给出满意的训练结果,这是为什么?
随机梯度下降(SGD)法失效的原因 —— 摸着石头下山
随机梯度下降(SGD):蒙上双眼下山
批量梯度下降(BGD):正常下山
深度学习的优化本身就很难,有太多局部最优点的陷进。但随机梯度下降法最怕不是局部最优点的问题,而是山谷和鞍点两类地形:
(3)为了改进随机梯度下降法,研究者都做了哪些改动?提出了哪些变种方法?它们各有哪些特点?
解决之道——惯性保持和环境感知
随机梯度下降法的更新公式为:
参数等于上一步的参数加上一个前进步伐,即负梯度乘上一个控制步幅的学习率,即:
动量(Momentum)方法
动量方法的参数更新方式与普通的迭代法一样 :参数等上一步的参数加上一个前进步伐,只不过这个前进步伐由两部分组成,一是带学习率的负梯度,二是带衰减的前一次步伐。
类比中学物理知识,当前梯度就好比当前时刻受力产生的加速度,前一次步伐好比前一时刻的速度,当前步伐好比当前时刻的速度
与随机梯度下降法相比,动量方法的收敛速度更快,收敛曲线也更稳定。
AdaGrad方法
具有环境感知能力,能够自适应地确定参数的学习率。
梯度下降法依赖于人工设定的学习率,如果设置过小,收敛太慢,而如果设置太大,可能导致算法那不收敛,为这个学习率设置一个合适的值非常困难。
在应用中,我们希望更新频率低的参数可以拥有较大的更新步幅,而更新频率高的参数的步幅可以减小。
AdaGrad方法采用“历史梯度平方和”来衡量不同参数的梯度的稀疏性(取值越小表明越稀疏),从而动态地动态调整学习率。
Adam方法
Adam方法将惯性保持和环境感知这两个优点集于一身(整合了自适应学习率与动量项)。
一方面,Adam记录梯度的一阶矩(first moment),即过往梯度与当前梯度的平均,这体现了惯性保持;另一方面,Adam还记录梯度的二阶矩(second moment),即过往梯度平方与当前梯度平方的平均,这类似AdaGrad方法,体现了环境感知能力,为不同参数产生自适应的学习速率。
其中β1,β2为衰减系数,mt是一阶矩,vt是二阶矩。
…
(1)首先,要弄搞明白为什么需要模型参数具有稀疏性。
稀疏性,说白了就是模型的很多参数是0。这相当于对模型进行了一次特征选择,只留下一些比较重要的特征,提高模型的泛化能力,降低过拟合的可能。
(2)L1正则化使得模型参数具有稀疏性的原理是什么?
参考《百面》有三个角度可以解释:
这一块和图模型一样,基本也是个空白,先看最常见的问题吧。(其实,关于采样,在特种工程的补充部分也有提到过。)
举例说明采样在机器学习中的应用。
采样本质上是对随机现象的模拟,根据给定的概率分布,来模拟产生一个对应的随机事件。采样可以让人们对随机事件及其产生过程有更直观的认识。
例如,通过对二项分布的采样,可以模拟“抛硬币出现正面还是反面”这个随机事件,进而模拟产生一个多次抛硬币出现的结果序列,或者计算多次抛硬币后出现正面的频率
另一方面,采样得到的样本集也可以看作是一种非参数模型,即用较少量的样本点(经验分布)来近似总体分布,并刻画总体分布中的不确定性。从这个角度来说,采样其实也是一种信息降维,可以起到简化问题的作用。
例如,在训练机器学习模型时,一般想要优化的是模型在总体分布上的期望损失(期望风险),但总体分布可能包含无穷多个样本点,要在训练时全部用上几乎是不可能的,采集和存储样本的代价也非常大。因此,一般采用总体分布的一个样本集来作为总体分布的近似,称之为训练集,训练模型的时候是最小化模型在训练集上损失函数(经验风险)。同理,在评估模型时,也是看模型在另外一个样本集(测试集)上的效果。这种信息降维的特性,使得采样在数据可视化方面也有很多应用,它可以帮助人们快速、直观地了解总体分布中数据的结构和特性。
对当前的数据集进行重采样,可以充分利用已有数据集,挖掘更多信息,
如自助法和刀切法(Jack knife),通过对样本多次重采样来估计统计量的偏差、方差等。
另外,利用重采样技术,可以在保持特定的信息下(目标信息不丢失),有意识地改变样本的分布,以更适应后续的模型训练和学习,
例如利用重采样来处理分类模型的训练样本不均衡问题。
此外,很多模型由于结构复杂、含有隐变量等原因,导致对应的求解公式比较复杂,没有显式解析解,难以进行精确求解或推理。在这种情况下,可以利用采样方法进行随机模拟,从而对这些复杂模型进行近似求解或推理。这一般会转化为某些函数在特定分布下的积分或期望,或者是求某些随机变量或参数在给定数据下的后验分布等。
例如,在隐狄利克雷模型和深度玻尔兹曼机(Deep Boltzmann Machines,DBM)的求解过程中,由于含有隐变量,直接计算比较困难,此时可以用吉布斯采样对隐变量的分布进行采样。如果对于贝叶斯模型,还可以将隐变量和参数变量放在一起,对它们的联合分布进行采样。注意,不同于一些确定性的近似求解方法(如变分贝叶斯方法、期望传播等),基于采样的随机模拟方法是数值型的近似求解方法。
…
对于二分类问题,当训练集中正负样本非常不均衡时,如何处理数据以更好地训练分类模型?
两个角度来解决:
基于数据的方法
对数据进行重采样,使原本不均衡的样本变得均衡:
1.直接随机采样:对少数类的样本进行随机过采样,对多数类的样本进行随机欠采样。
最简单的处理不均衡样本集的方法是随机采样。采样一般分为过采样(Over-sampling)和欠采样(Under-sampling)。
随机过采样是从少数类样本集Smin中随机重复抽取样本(有放回)以得到更多样本;随机欠采样则相反,从多数类样本集Smaj中随机选取较少的样本(有放回或无放回)。
随机采样的问题:
直接的随机采样虽然可以使样本集变得均衡,但会带来一些问题,比如,过采样对少数类样本进行了多次复制,扩大了数据规模,增加了模型训练的复杂度,同时也容易造成过拟合;欠采样会丢弃一些样本,可能会损失部分有用信息,造成模型只学到了整体模式的一部分。
2.1 过采样时采取措施生成新的样本,如SMOTE算法
SMOTE算法对少数类样本集Smin中每个样本x,从它在Smin中的K近邻中随机选一个样本y,然后在x,y连线上随机选取一点作为新合成的样本(根据需要的过采样倍率重复上述过程若干次)
2.2 对于欠采样,可以采用Informed Undersampling来解决由于随机欠采样带来的数据丢失问题
基于算法的方法
在样本不均衡时,也可以通过改变模型训练时的目标函数(如代价敏感学习中不同类别有不同的权重)来矫正这种不平衡性;
当样本数目极其不均衡时,也可以将问题转化为单类学习(one-class learning)、异常检测(anomaly detection)
(1)多层感知机表示异或逻辑时最少需要几个隐含层(仅考虑二元输入)?
通用近似定理告诉我们,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种“挤压”性质的激活函数的隐藏层,当给予网络足够数量的隐藏单元时,可以以任意精度近似任何从一个有限维空间到另一个有限维空间的波莱尔可测函数。
可以简单认为我们常用的激活函数和目标函数是通用近似定理适用的一个子集,因此多层感知机的表达能力是非常强的,关键在于我们是否能够学习到对应此表达的模型参数。
(2)如果只使用一个隐层,需要多少隐节点能够实现包含n元输入的任意布尔函数?
(3)…
(1)写出常用激活函数及其导数。
sigmiod
如何记忆?
目的:想将函数值控制在 0 和 1 之间——>取倒数并让分子为1 ;想让函数取到(0, 0.5)且单调递增——>分母取1 + e-x
因此,在函数值取到 0 和 1 的时候,倒数接近0(出现梯度消失)
tanh
如何记忆?
目的:想将函数值固限制在(-1, 1)之间,即x趋近正无穷时y取1,x趋近负无穷时,y取-1;想爱让函数经过原点(0, 0)——>恰好简单的指数函数有这种极端的性质
(2)为什么Sigmoid和Tanh激活函数会导致梯度消失的现象?
Sigmoid激活函数将输入z映射到区间(0,1),当z很大时,f(z)趋近于1;当z很小时,f(z)趋近于0。其导数在z很大或很小时都会趋近于0,造成梯度消失的现象。
对于Tanh激活函数,当z很大时,f(z)趋近于1;当z很小时,f(z)趋近于−1。其导数在z很大或很小时都会趋近于0,同样会出现“梯度消失”。
实际上,Tanh激活函数相当于Sigmoid的平移:tanh(x)=2sigmoid(2x)−1 .
(3)ReLU系列的激活函数相对于Sigmoid和Tanh激活函数的优点是什么?它们有什么局限性以及如何改进?
ReLU 激活函数的局限性
ReLU的局限性在于其训练过程中会导致神经元死亡的问题。这是由于函数导致负梯度在经过该ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。
在实际训练中,如果学习率(Learning Rate)设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。
(1)写出多层感知机的平方误差和交叉熵损失函数。
(2)根据问题1中定义的损失函数,推导各层参数更新的梯度计算公式。
(3)平方误差损失函数和交叉熵损失函数分别适合什么场景?
一般来说,平方损失函数更适合输出为连续,并且最后一层不含Sigmoid或Softmax激活函数的神经网络;交叉熵损失则更适合二分类或多分类的场景。
在大规模神经网络的训练过程中,我们常常会面临“过拟合”的问题,即当参数数目过于庞大而相应的训练数据短缺时,模型在训练集上损失值很小,但在测试集上损失较大,泛化能力很差。解决“过拟合”的方法有很多,包括数据集增强(Data Augmentation)、参数范数惩罚/正则化(Regularization)、模型集成(Model Ensemble)等;其中Dropout是模型集成方法中最高效与常用的技巧。同时,深度神经网络的训练中涉及诸多手调参数,如学习率、权重衰减系数、Dropout比例等,这些参数的选择会显著影响模型最终的训练效果。批量归一化(Batch Normalization,BN)方法有效规避了这些复杂参数对网络训练产生的影响,在加速训练收敛的同时也提升了网络的泛化能力。
(1)神经网络训练时是否可以将全部参数初始化为0?
问题:突然发现并不知道神经网络初始化的意义?
原来初始化参数对神经网络来说极端重要,甚至有人专门研究不依赖训练而只靠初始参数的模型:点击1、点击2
考虑全连接的深度神经网络,同一层中的任意神经元都是同构的,它们拥有相同的输入和输出,如果再将参数全部初始化为同样的值,那么无论前向传播还是反向传播的取值都是完全相同的。学习过程将永远无法打破这种对称性,最终同一网络层中的各个参数仍然是相同的。
因此,我们需要随机地初始化神经网络参数的值,以打破这种对称性。简单来说,我们可以初始化参数为取值范围的均匀分布,其中d是一个神经元接受的输入维度。偏置可以被简单地设为0,并不会导致参数对称的问题。
(2)为什么Dropout可以抑制过拟合?它的工作原理和实现?
Dropout是指在深度网络的训练中,以一定的概率随机地 “临时丢弃”一部分神经元节点
dropout 作用:
dropout 如何训练:
(3)批量归一化的基本动机与原理是什么?在卷积神经网络中如何使用?
神经网络训练过程的本质是学习数据分布,如果训练数据与测试数据的分布不同将大大降低网络的泛化能力,因此我们需要在训练开始前对所有输入数据进行归一化处理。
然而随着网络训练的进行,每个隐层的参数变化使得后一层的输入发生变化,从而每一批训练数据的分布也随之改变,致使网络在每次迭代中都需要拟合不同的数据分布,增大训练的复杂度以及过拟合的风险。
批量归一化在卷积神经网络中应用时,需要注意卷积神经网络的参数共享机制。每一个卷积核的参数在不同位置的神经元当中是共享的,因此也应该被一起归一化。
可以参考之前的文章:卷积基础和常用卷积模型
(1)卷积操作的本质特性包括稀疏交互和参数共享,具体解释这两种特性及其作用。
稀疏交互(局部感受野):每一个神经元仅与前一层特定区域内的神经元存在权重连接
其意义是大大减少了参数量
参数共享:同层的神经元共用相同的卷积核(权值参数)
其意义是使得卷积层具有平移等变性
(2)常用的池化操作有哪些?池化的作用是什么?
最大池化:取滑动窗口内的最大值
平均池化:取滑动窗口内的均值
池化的作用
(3)卷积神经网络如何用于文本分类任务?
这块倒没研究过!
(1)ResNet的提出背景和核心理论是什么?
ResNet的提出背景是解决或缓解深层的神经网络训练中的梯度消失问题。
反向传播时,梯度将涉及两层参数的交叉相乘,可能会在离输入近的网络层中产生梯度消失的现象。ResNet把网络结构调整为,既然离输入近的神经网络层较难训练,那么我们可以将它短接到更靠近输出的层。
对于一般的两层卷积网络, 输入 x 会经历两轮加权求和激活输出的过程,但是在得到输出 F(x) 之前,残差块还引入了一个从输入 x 直接到达网络第二层激活输出的一个额外过程, 如图所示, 这就实现了网络的跳层连接。其结果是在进行最后的激活之前, 得到了输出 F(x) + x, 而不是卷积网络的输出 F(x)。
机器学习之集成学习