归一化的依据非常简单,不同变量往往量纲不同,归一化可以消除量纲对最终结果的影响,使不同变量具有可比性。比如两个人体重差10KG,身高差0.02M,在衡量两个人的差别时体重的差距会把身高的差距完全掩盖,归一化之后就不会有这样的问题。
标准化的原理比较复杂,它表示的是原始值与均值之间差多少个标准差,是一个相对值,所以也有去除量纲的功效。同时,它还带来两个附加的好处:均值为0,标准差为1。
怎么用
在涉及到计算点与点之间的距离时,使用归一化或标准化都会对最后的结果有所提升,甚至会有质的区别。那在归一化与标准化之间应该如何选择呢?如果把所有维度的变量一视同仁,在最后计算距离中发挥相同的作用应该选择标准化,如果想保留原始数据中由标准差所反映的潜在权重关系应该选择归一化。另外,标准化更适合现代嘈杂大数据场景。
小结:
更多解释可参考知乎高赞解答。
参考文章
特征工程是为了对数据进行处理,特征是原始数据的数值表示。特征工程是在给定数据、模型和任务的情况下设计出最合适的特征的过程。
没有足够的特征,模型将不能完成最终的任务,特征过多,模型会很难训练且训练成本高昂。
特征工程的步骤可大致概括为如下3大块:
1. 数据清洗
2. 特征构造
3. 特征选择
特征工程内容总结:
以上图片来自知乎,各模块详细内容可参考深度了解特征工程这篇文章或者机器学习中,有哪些特征选择的工程方法?高赞解答。
参考文章
1. 特征选择的目的
对于一个特定的学习算法来说,哪一个特征是有效的是未知的。因此,需要从所有特征中选择出对于学习算法有益的相关特征。而且在实际应用中,经常会出现维度灾难问题。如果只选择所有特征中的部分特征构建模型,那么可以大大减少学习算法的运行时间,也可以增加模型的可解释性。
2. 特征选择的原则
获取尽可能小的特征子集,不显著降低分类精度、不影响分类分布以及特征子集应具有稳定、适应性强等特点。
3. 特征选择方法的内容总结
各模块具体内容介绍参考特征选择方法最全总结!这篇文章。
1. 离散化原因
数据离散化是指将连续的数据进行分段,使其变为一段段离散化的区间。分段的原则有基于等距离、等频率或优化的方法。数据离散化的原因主要有以下几点:
2. 离散化的优势
在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:
3. 离散化的方法
关于离散化方法的具体介绍可参考连续特征离散化(整理)这篇文章。
参考文章
为什么深度学习的结构特点不利于稀疏特征向量的处理呢?
机器学习中如何利用id类特征?
深度学习模型处理前,一般是先把高维稀疏特征用embedding的方式,转成低维稠密特征。可以先用一些降维的办法对embedding做初始化,以提高训练效果,例如word2vec,svd等等。
以上回答参考知乎~
参考文章
1. 样本不均衡现象以及带来的问题
很多机器学习算法都有一个基本假设,就是数据分布是均匀的。当我们把这些算法直接应用在实际数据中时,大多数情况下都无法取得理想的结果,因为实际数据往往分布的很不均衡,都存在长尾效应。
举个例子,大部分(假如是97%以上)的微博的总互动数(包括被转发,评论和点赞数量)都在0~5之间,交互数多的微博(多于100)非常的少,如果我们去预测一条微博交互数所在档位,预测器只需要把所有微博预测为第一档(0-5)就能解决非常高的准确率,而这样的预测器没有任何价值。
再比如,CTR任务中我们需要预测用户是否会对广告进行点击,通常情况下曝光一个广告用户点击的比率非常低,这里我们假如给101个用户曝光广告可能只有一个人点击,那么得到的正负样本比例就为1:100。如果是更高层级的广告转化目标比如下载、付费等正负样本的比例就更低了。
2. 解决办法
总体来看,样本不均衡问题可以从数据层面和模型层面来解决。
2.1 数据层面
上采样(过采样):通过增加分类中少数类样本的数量来实现样本均衡,最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是如果样本特征少而可能导致过拟合的问题;经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。如机器学习中的SMOTE算法,NLP中相似文本生成技术,深度学习中数据增强等。
下采样(欠采样):通过减少分类中多数类样本的样本数量来实现样本均衡,最直接的方法是随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类样本中的一些重要信息。
上采样和下采样更适合大数据分布不均衡的情况,尤其是第一种(上采样)方法应用更加广泛。
2.2 模型层面
1)正负样本的惩罚权重
在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量类别权重高,大样本量类别权重低),然后进行计算和建模。
如果算法本身支持基于类别参数的调整设置,这种思路是更加简单且高效的方法。
下面举例说明以下:
可以修改模型的损失函数,比如采用类别加权的loss、Focal Loss等。
拿二分类任务来举例,通常使用交叉熵来计算损失,下面是交叉熵的公式:
上面的公式中y是样本的标签,p是样本预测为正例的概率。
为了解决样本不均衡的问题,最简单的是基于类别的加权Loss,具体公式如下:
基于类别加权的 Loss 其实就是添加了一个参数 α \alpha α,这个 α \alpha α 主要用来控制正负样本对 Loss 带来不同的缩放效果,一般和样本数量成反比。
需要说明的是,上面基于类别加权Loss虽然在一定程度上解决了样本不均衡的问题,但是实际的情况是不仅样本不均衡会影响Loss,而且样本的难易区分程度也会影响Loss。在样本不均衡的场景中,有非常多的负样本是易区分样本。虽然这些样本的Loss很低,但是数量确很多,所以对于最终的Loss有很大的贡献,导致模型最终的效果不够好。基于这个问题2017年何恺明大神在论文《Focal Loss for Dense Object Detection》中提出了非常火的Focal Loss,下面是Focal Loss的计算公式:
相比于公式2来说,Focal Loss 添加了参数 γ \gamma γ 从置信的角度来加权 Loss 值。假如 γ \gamma γ 设置为0,那么公式3退化成了基于类别的加权也就是公式2;下面重点看看如何通过设置参数 γ \gamma γ 来使得简单和困难样本对 Loss 的影响。当 γ \gamma γ 设置为2时,对于模型预测为正例的样本也就是 p>0.5 的样本来说,如果样本越容易区分那么 (1-p) 的部分就会越小,相当于乘了一个系数很小的值使得 Loss 被缩小,也就是说对于那些比较容易区分的样本 Loss 会被抑制,同理对于那些比较难区分的样本 Loss 会被放大,这就是 Focal Loss 的核心:通过一个合适的函数来度量简单样本和困难样本对总的损失函数的贡献。 关于参数γ的设置问题,Focal Loss 的作者建议设置为2。下面是不同的参数值γ样本难易程度对Loss的影响对比图:
下面是一个Focal Loss的实现:
2)组合/集成
组合/集成方法指的是在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。
例如,在数据集中的正、负例的样本分别为100和10000条,比例为1:100。此时可以将负例样本(类别中的大量样本集)随机分为100份(当然也可以分更多),每份100条数据;然后每次形成训练集时使用所有的正样本(100条)和随机抽取的负样本(100条)形成新的数据集。如此反复可以得到100个训练集和对应的训练模型。
这种解决问题的思路类似于随机森林。如果计算资源充足,并且对于模型的时效性要求不高的话,这种方法比较合适。
3)一分类
对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(one class learning) 或异常检测问题,这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,比较有代表性的是 one-class-SVM。
单分类实际中有很多应用,比如人脸识别,我们不可能给所有的图片让机器去分类,事实上我们只能给出很多人脸的图像,让机器去学习识别。之后再来图像时,符合这些图像特征的就属于人脸,反之则不是。对比二分类,显著的区别就是,二分类不但能的出来这个图片不是人脸,他还能告诉你这个图片是猪脸。
参考文章
类别型特征主要指性别(男、女)、血型(A、B、AB、O)等只在有限选项内取值的特征。类别型特征元时输入通常是字符串形式,除了决策树等少数模型能直接处理字符串形式的输入,对于逻辑回归,SVM等模型,类别型特征必须要转换为数值型才能使用。
处理类别型特征的方法
序号编码。序号编码通常用来处理类别间具有大小关系的数据。例如,成绩分为‘高,中,低’三档,将其转换为序号后,序号编码会依据大小关系对类别型特征赋予一个数值ID。例如高表示为3,中表示为2,低表示为1。转换后依然保留了大小关系。
独热编码。当类别间不存在大小关系时,可以采用独热向量编码。比如特征“颜色”有“红,黄,蓝”三种,转换为独热向量之后,红表示为(1,0,0),黄表示为(0,1,0),蓝表示为(0,0,1)。经过这样的变换之后,不同类别之间具有同等的地位。但是,如果采用序号编码,将三种颜色表示为1,2,3的话,就会有问题。因此这种编码方式默认了蓝色比其它颜色的数值要大,这是不合理的,这三种颜色应该是平等的。对于类别特别多的特征,在使用独热向量编码时,需注意如下问题:
a)使用稀疏向量存储来节省空间。one-hot编码中,特征向量只有某一维度取1,其余维度均为0。因此可以利用向量的稀疏表示有效节省空间;
b)配合特征选择降低维度。因为高维度特征会带来如下几方面的问题:
二进制编码。二进制编码分为两步。首先进行序号编码。给每个类别一个ID,然后再将该ID转换为二进制。这种做法的本质在于利用二进制对ID进行映射,最终也得到0/1向量,但是维度显著小于独热向量编码,节省了存储空间。
lightgdm序号编码后不需要归一化的原因?
integer-encoded categorical features
),例如,进行如下编码mapping{'川建国': 1, '傻蛋': 2, '其他': 0}
,在官方文档中也建议使用从0开始的连续的数值进行编码,当训练集中的某个类别型的特征取值个数超大,可以将其看做是连续特征看待,或者进行embedding编码。参考文章
lightgdm:Optimal Split for Categorical Features
用一个热编码来表示分类特征是很常见的,但这种方法对于树学习者来说是次优的。特别是对于高基数的分类特征,基于one-hot特征构建的树往往是不平衡的,需要非常深才能获得良好的准确性。
最佳的解决方案不使用one-hot编码,而是通过将类别划分为2个子集来拆分类别特征。如果该特征有k个类别,则有2^(k-1)-1个可能的分区。但是回归树有一个有效的解决方案8。需要大约O(k*log(k))才能找到最佳分区。
其基本思想是根据每次划分的训练目标对类别进行排序。更具体地说,LightGBM根据其累积值(sum_gradient/sum_hessian)对直方图进行排序(针对分类特征),然后在排序后的直方图上找到最佳分割。
以上回答参考知乎~
参考文章
1. 为什么要做特征交叉
特征交叉(Feature Crosses)也叫特征组合,是指通过将两个或多个特征相乘,实现对样本空间的非线性变换,来增加模型的非线性能力。从本质上讲,特征交叉是利用非线性映射函数f(x)将样本从原始空间映射至特征空间的过程。
特征交叉的目的是「提升模型的效果」。通过特征交叉,将样本映射至高维空间,从而增加模型的非线性能力,提升模型的预测效果。
2. 怎么做特征交叉
特征交叉主要有两大类:1) 显示交叉;2) 隐式交叉
2.1 显式交叉
显示交叉主要是基于先验知识通过人工来手动构造交叉特征,主要有三种类型的交叉:1)內积;2)哈达玛积;3)笛卡尔积。
在构造显性交叉特征时,一定要结合业务和数据分析来构造,切忌无脑交叉。
代表方法有:FM、FFM
注:FM从形式上来说应该算显示交叉,但其实其具体交叉向量是在模型训练过程中不断优化的(隐式的)。
2.2 隐式交叉
显示特征交叉有以下几个局限性:(1)对非线性的建模能力是有限的,(2)很难扩展到更高阶的特征交叉,(3)但数据稀疏性很大时,模型训练比较困难,(4)对所有特征交叉项一视同仁,可能会限制模型的表达能力,(5)不能自动化实现特征交叉。
相较于显示交叉,隐式交叉省去了手动设计交叉的工作,直接通过模型来学习交叉。这样做的好处在于可以解决显示交叉需要依赖人工经验、特征交叉计算量大、维度爆炸等问题。主要有基于FM和MLP两大类隐式交叉方法。
代表方法有:DeepFM、Wide & Deep、Deep Crossing、Deep Cross Network等
小结:
在推荐系统中对模型优化基本都是围绕特征交叉进行的,要么手动显示的构造各种交叉特征,让模型根据历史数据学习交叉特征的有效性;要么是采用FM或MLP等方式实现隐式交叉,让模型从历史数据中自动学到有效的交叉特征。
从总体来看,当前主流的推荐模型大多是同时包含了**手动交叉+FM交叉+MLP交叉
**,始终是围绕对业务的分析和理解来选择特征和模型。
另外,当前主流的推荐算法基本都是通过对Wide&Deep进行魔改优化的,总体都逃不过交叉。
参考文章
要理解Pearson相关系数,首先要理解协方差(Covariance),协方差是一个反映两个随机变量相关程度的指标,如果一个变量跟随着另一个变量同时变大或者变小,那么这两个变量的协方差就是正值,反之相反,公式如下:
Pearson相关系数公式如下:
由公式可知,Pearson相关系数是用协方差除以两个变量的标准差得到的,虽然协方差能反映两个随机变量的相关程度(协方差大于0的时候表示两者正相关,小于0的时候表示两者负相关),但是协方差值的大小并不能很好地度量两个随机变量的关联程度,例如,现在二维空间中分布着一些数据,我们想知道数据点坐标X轴和Y轴的相关程度,如果X与Y的相关程度较小但是数据分布的比较离散,这样会导致求出的协方差值较大,用这个值来度量相关程度是不合理的,如下图:
为了更好的度量两个随机变量的相关程度,引入了Pearson相关系数,其在协方差的基础上除以了两个随机变量的标准差,容易得出,pearson是一个介于-1和1之间的值,当两个变量的线性关系增强时,相关系数趋于1或-1;当一个变量增大,另一个变量也增大时,表明它们之间是正相关的,相关系数大于0;如果一个变量增大,另一个变量却减小,表明它们之间是负相关的,相关系数小于0;如果相关系数等于0,表明它们之间不存在线性相关关系。《数据挖掘导论》给出了一个很好的图来说明:
以上回答来自知乎~
参考文章
K-最近邻(K-nearest-neighbor, KNN)搜索是高维数据常用的一个操作,一般用于搜索目标数据点周围最近(最相似)的K个数据点。为了提高搜索效率,也会采用近似的搜索方法(approximate nearest neighbor, ANN),即搜索到的K个点未必是最近的点,允许存在一定误差。
如果不使用最近邻检索的库,怎么做最近邻检索
最近邻检索的方法可分为三大类:
1)基于树的方法
KD树是其下的经典算法。一般而言,在空间维度比较低时,KD树的查找性能还是比较高效的;但当空间维度较高时,该方法会退化为暴力枚举,性能较差,这时一般会采用下面的哈希方法或者矢量量化方法。
2)哈希方法
LSH(Locality-Sensitive Hashing)是其下的代表算法。
对于小数据集和中规模的数据集(几个million-几十个million),基于LSH的方法的效果和性能都还不错。这方面有2个开源工具FALCONN和NMSLIB。
3)矢量量化方法
矢量量化方法,即vector quantization。在矢量量化编码中,关键是码本的建立和码字搜索算法。比如常见的聚类算法,就是一种矢量量化方法。而在相似搜索中,向量量化方法又以PQ方法最为典型。
对于大规模数据集(几百个million以上),基于矢量量化的方法是一个明智的选择,可以用用Faiss开源工具。
参考文章