机器学习40讲_11_10_特征预处理
你好,我是王天一。
今天我和你分享的主题是机器学习中的特征,预处理华盛顿大学的教授终极算法。
这本书的作者佩州dominos曾经发表了一篇名为机器学习,你不得不知的那些事儿。
哎,这个题目的一篇小文章介绍了十二条机器学习当中所谓的金科玉律。
那么里面的第七条和第八条说的就是对数据作用的认识。
托宾格斯的观点是什么呢?数据量比算法更重要。
即使说算法本身并不存在着那些精巧的设计,但是我用大量的数据去训练它,也能够起到填鸭的效果。
这个效果呢比使用少量数据训练出来的聪明的算法,它的性能还要好。
这也应了那句老话,数据它决定了机器学习的上限,那么算法呢只是尽可能的逼近这个上限。
但是多宾格斯嘴里的数据呢,可不是说硬件采集或者软件抓取得到的原始数据,而是经过特征工程处理之后的精修数据,它把特征工程看作是机器学习的关键。
通常来说呢原始数据它并不直接的适用于学习,但是呢又是特征筛选构造,还有生成的基础。
一个好的预测模型,它必然和高效的特征提取,还有明确的特征表示息息相关。
如果说通过特征工程能够得到很多独立的,并且和所属类别相关的这个特征,那么学习过程就变成小菜一碟。
特征的本质呢是用于预测分类结果的信息。
那么特征工程呢,实际上就是对这些信息的一个编码。
在机器学习当中,很多具体的算法都可以归纳到特征工程的范畴之中。
比如说我使用l一正则画项的这个拉搜,回归它的作用呢就是通过将某些特征的权重系数给它缩小到零啊,来实现特征的过滤。
再比如说啊常见的主成分分析,就是将具有相关性的一组特征,变换成另一组线性无关的特征。
这些方法呢本质上完成的都是特征工程的任务。
但今天呢啊我们先不讨论这些,而是把关注点放在算法之外看一看。
在进入模型之前啊,或者说在特征工程的处理之前,数据的特征需要经过哪些必要的一个预处理特征。
缩放可能是最广为人知的。
这个预处理的技巧,它的目的呢是保证所有的特征,数值具有相同的数量级。
在有些情况下呢,数据里的特征会有不同的这个尺度。
比方说我在电商上买一件衣服啊,那么这时候呢我的身高还有体重啊,就是不同尺度的特征。
假设说我的身高是一米八五啊,一点八五米,体重呢是六十四公斤。
那我还有两个朋友买了同样的一款衣服,其中呢一个一米七五八十公斤的朋友买的是l号啊,正合适。
那么另一个一米五八五十二公斤的买的s号啊也是正合适。
那么根据日常的经验判断啊,我们不说学习不学习啊,就根据日常的经验来判断的话,肯定是l码更适合我啊,可能还要大一码搞一个叉l.但是如果啊我把身高和体重这个二元的组啊看成二维空间,这为一个点的话,那么代表我自己的点显然和代表s码的这个一点五八五十二代表s码的这个点,它们之间的欧式距离更近啊,你可以自己的去计算一下。
这时候如果这个电商不开眼的话,那么保不齐就把这个s码推荐给我。
但实际上呢不会有哪个电商能做出这么弱智的推荐啊,因为他们都会使用特征缩放在上面。
例子当中啊,体重的数据是比身高的数据高出一个数量级。
所以在计算欧式距离的时候,身高的影响相比于体重就可以忽略不计了,相当于起作用的只有体重一个特征。
反过来啊,如果我在表示身高的时候,以厘米作为单位的话,那么这时候体重的影响相比于身高又可以忽略不计,起作用的又相当于只有身高一个特征。
那么不管怎么样,这种算法呢,都会把起作用的那个特征啊作为相似的划分。
把相似的数据划分到同一个类别当中,最终的结果啊都是错误的,或者说不正常的一个近似特征。
缩放的作用就是消除特征的不同尺度所造成的偏差。
那么它具体的变换方法呢,包括标准化,还有归一化,点击文稿,你可以看到它们的操作方法。
那么不难看出,标准化的方法是用原始数据减去均值,再除以标准差。
它不管原始特征的取值范围有多大啊,那么得到的每一组新数据呢,它都是均值为零,方差为一。
这就之下呢所有的数据哎被强行的拉到了同一个尺度之上。
相比之下呢,归一化的方法则是用每个特征的取值区间作为一把尺子,再用这把尺将不同的数据按比例进行转换,让所有的数据都落在零一这个范围之内。
虽然实践的方式不同,但是两者的作用呢都是对数据再做出一个重新的标定。
这样呢就避免了不同尺度的特征,它的影响程度不一样啊,这种情况可以说是殊途同归。
除了尺度之外啊,数据的偏度也是值得关注的一个问题。
偏度呢它是概率论当中一个概念,用来描述概率分布,非对称性这样的一个指标。
点击文稿,你可以看到两个分别具有负偏度,还有正偏度的概率分布的示意图。
从这个图中可以看出,从这偏分布则表示状都是类布的这里面呢一侧是受高的形状啊,占据的概率分布的大部分另一侧呢则是比较长的一个员位啊,想要理解解这个图形表表示的概率。
布布呢你只需要把正偏度的图形想象成你所在单位的工资分布就可以了。
这当中呢左侧的受高形状表示的拿着低工资的绝大部分的普通员工啊,那么右侧的拖尾呢则表示的工资更高。
但是人数更少的这个中层领导啊,还有高级的主管。
不管你的单位是机关也好啊,事业单位也好,还是企业也好啊,我猜公司的分布大抵都拖不出这样的形状,数据服从有偏的分布,这意味着什么呢?你第一反应应该是啊数据当中是不是存在着异常点。
三十个维密模特啊,他的体重应该近似的服从正态分布,而正态呢它又是一个无偏的分布,它偏度等于零是对称的。
可是如果我把其中的一个模特的体重啊,给他换成一个相扑运动员的体重。
这时候这个数据集的均值就会产生明显的上升,数据的直方图呢也会朝着新均值的方向发生明显的偏移。
这个时候偏度它体现的就是少量的异常点。
对于样本整体一个拉拽的作用啊,像一个火车头一样把它带跑偏了。
这呢就类似于用一个董事长和九十九个普通工人来计算平均工资所产生的这种喜拽的效果。
所以啊面对偏度较大的数据啊,你首先应该看一看是不是有异常点的存在。
那到底什么是异常点呢?一般来说,如果说少量数据和其他数据点具有明显的区别的话,这些点呢就可以看成是异常点。
在处理异常点的时候,首先要检测这些数据的可靠性。
看一看这异常的取值是不是由于看看看这混异异常而导致的。
像那个混进维密模特里的相扑选手啊,这个数值实际上就是一个错误的数值。
如果说异常点本身并没有问题的话,接下来要考虑的就是异常点是否和正常点来源于不同的生成机制,不同的生成机制又让两者具有不同的概率分布。
如果说对于异常点的分布啊,采样数据较少的话,这个时候呢可能不足以体现出分布的一个特性。
就导致单个的数据点看起来呢比较突兀。
对于像决策数这一类,对于异常点比较敏感的算来说呢,不管这个异常点的来源如何,只要它异常,那么就都需要被处理。
最直接的方法就是把异常点砍掉啊不要了。
但是当数据集的容量比较小的时候啊,这种一刀切的方式会进一步减少可用的数据啊,从而丢失一些信息。
为了避免这种情况的发生呢,可以采用一种名叫空间标识的数值处理方法。
空间标识方法呢先对所有的数据点进行前面所提到的这个标准化的处理。
再用数据向量啊,也就是我单独一个样本的二范数,来对这个样本所有的特征进行归一化。
那么点击文稿,你可以看到它的数学表达式、空间标识算法的作用是什么呢?是将所有的数据点都映射到高维空间的球面之上。
这个映射呢和前面所提到的特征缩放,它不所有的地方在哪儿呢?在于它处理的对象啊不是所有样本的同一个特征啊,而是同一个样本的所有特征。
我将一个样本作为整体啊来处理它的不同的特征。
答然经过这样的处理之后呢,异常点还是会有一个异常的情况。
数据点啊映射到高维空间的球面上之后,大多数的正常点会集中在一个区域,而那少量的异常点呢也会集中在另一个区域。
当然了,即使在没有异常点的情况之下啊,数据依然可能呈现出由偏的分布。
当样的情况在数字图像处理当中呢不要太常见,有片分布。
它的一个明显特点是最大值和最小值之间啊相差比较大,通常呢可以达到二十倍啊或者更高。
这种数据的尺度不一致呢,即使出现在单个的特征之上,也不是一件好事情。
那么要对它进行修正,也就是对数据进行去偏度处理。
啊,最常用的方法就是采用对数变换。
对数变换什么意思呢? A我把特征的这个数值给它取一个对数,假设说啊最大值和最小值之间就是二十倍的差距啊,那么经过对数变换之后啊,这个差距是多少呢?我对二十求二的对数啊,约等于四点三也是二的,四次方是十六啊,那十对二的对数肯定是大于四的。
那么和原来的二十倍这个差距相比啊,四点三倍这个水平就在可以接受的范围之内。
当然除了取对数之外啊,求平方根或者求倒数就在可出偏度的常见的处理方式。
在具体案例当中啊,应用哪种方法啊,那就具体情况是距相数异常点也好啊,尺度不一致也好,当然至少呢还是完整的数据。
可是在有些时候,一个样本里的某些特征会根本没有取值啊,而是一片空白。
这种情况呢就是缺失值,也是生活当中常见的一种情况。
数据缺失的可能的原因呢多种多样啊,我们就不说它,关键还是在于如何去处理这些缺失值。
最简单粗暴的方法就是将不完整的数据全部删除。
那么对于小数据集来说,这仍然不是一个理想的处理方式。
更主动的处理方式是什么呢?就是给这些缺失值啊,我给它进行一个人为的赋值啊,我对它做一个预测。
那么这就像数值计算或者是信号处理当中,这个插值方法和他们的方思想是类似的。
人为赋值呢相当于在机器学习当中又嵌套了一层机器学习。
那么这里层的积器方习呢,它的任务就是估计缺失值的取值啊,也就是未知的属性值。
它同样也要使用训练数据。
最主用的赋值方法呢就是k级邻选取离具有缺失值样本最近的k个样本,并且用它们对应的这个特征的平均值来为缺失值赋值。
假如说啊一个缺失值离它最近的五个点,这个特征的取值是一二三四五啊,那么这个缺失值呢它在赋值的时候就可以选取这五个点的平均值啊,等于二点五。
除此之外,线性回归也可以用来对缺失值进行拟合。
但是可以确定的是什么呢?不管采用什么方法啊,你局部的这个k近零也好,全局的线性回归也好啊,人为的复制都会引入额外的不确定性。
给模型的性能呢带来一定程度的影响。
会做加法也要会做减法。
缺失的数据啊,我得添加。
那么多余的数据呢也要删除。
在模型训练之前呢,移除一些特征,一方面有助于增强模型的可解释性,另一方面呢也可以降低计算中的开销。
如果说两个特征之间的相关性较强,也可以说成是具有所谓的贡献性。
这时候呢我就可以删掉其中的一个而不会对模型的性能啊造成影响。
这呢实际上就是主成分分析所做的事。
除了这个贡献性之外啊,如果说某个特征在绝大多数的数据当中取值都是相同的啊,那这个特征呢也没有什么存在的意义,如为它体现不出来对于不同的分类结果的区分度。
这就像在学校里呢,老师给所有同学的出勤啊,不管你平时是名点没点到啊,上课来没来啊,给你打个满分。
那么这一部分的平时分呢就拉不开成绩的差距啊,最终要看你学得好还是会啊,还是要看这个期末考试的成绩。
什么样的特征,它不具备区分度呢?这儿有两个经验性的标准,一是特征取值的总数啊和样本数目的比例在百分之十以下。
这样的特征呢在一百个样本里啊,它的取值数目可能不超过十个,总共就一二三四五六七八九啊,这九种可能的取值。
那么这样的特征呢,就可以认为它不具备区分度。
二一个是什么呢?出现频率最高的特征,它的出现频率应该在出现频率次高的特征,它频率的二十倍以上。
如果说有九十个样本的特征取值为一啊,四个样本的特征取值为二,其余取值的样本数目呢都在四个以下啊,那么这时候呢最高频率九十除以次高频率啊啊得到的结果就是二十倍以上。
这是一个什么情况呢?其实保不齐啊你除了取值为一之外啊,所有其他的取值都是异常点。
这种情况下呢,这个特征也就可以被删除。
今天我和你分享了在模型训练之前啊,对于数据特征进行预处理的一些指导性的原则与方法。
啊,包括着以下四个要点,第一,特征缩放可以让不同特征的取值具有相同的尺度,方法呢包括标准化和归一化。
第二,异常点会导致数据的有偏分布,对数变换和空间标识,都可以去除数据的偏度。
第三,KG邻方法和线性回归可以用来对特征的缺失值进行人为的赋值。
第四,删除不具备区分度的特征,能够降低计算开胶,增强可解释性。
在这里呢我挂一漏案的分享了一些特征,预处理的技巧。
那么在解决实际问题的时候,你遇到过哪些不理想的特征,数据又是如何处理的呢?欢迎分享你的经历。