<转>特征工程(二)
出处:
http://blog.csdn.net/longxinchen_ml/article/details/50493845,
http://blog.csdn.net/han_xiaoyang/article/details/50503115
1. 剧情一:挑螃蟹的秘密
李雷与韩梅梅的关系发展得不错,趁国庆休假一起来天津玩。今天,李雷十分神秘地请韩梅梅去一家餐馆吃螃蟹。韩梅梅大失所望,这个餐馆很不起眼,感觉就像路边的老食堂。菜单都用粉笔写在黑板上,一点都不高档。一看价格,满黄螃蟹120块钱一只!这也太贵了。
李雷看到了韩梅梅的神情,笑着解释道:“这家店老板有一个绝活——会看螃蟹。他能保证120块的螃蟹就是满黄。如果拆开来不是,这个螃蟹就不要钱,再换一个。靠着老板的绝活,这家店已经是几十年的老店了,在当地非常有名气。郭德纲、赵丽蓉这些天津社会名流都来这家店吃过螃蟹。”
韩梅梅将信将疑。拆开螃蟹,饱满的蟹黄喷薄欲出。韩梅梅边吃边惊叹:“从没有吃个这么好吃的螃蟹!”
李雷接着说:“老板的绝活密不外传,几十年来都自己上货。虽说是一个大老板,一年到头满身海鲜味。而且他也不开分店。”
韩梅梅说:“那是,这么高明的绝活只有他自己知道才能挣钱啊。”这时,韩梅梅拂面而笑,突然想考一考自己的相亲对象,说:“李大码农,你不是做机器学习的吗?如果要你去用机器学习挑满黄的螃蟹,你怎么做?”
2. 初步划定特征的范围,获取特征
李雷早就想过这个问题了。长期的职业素养让他对任何事情都想用机器学习的方法去鼓捣。李雷的基本思路是这样的,我们尽可能观察螃蟹更多的特征,从中找出与“螃蟹满黄”最相关的特征来,帮助我们去判断。当然特征有非常多,我们可以先头脑风暴一下:
- 一些直观的特征:包括蟹壳的颜色和光泽度、钳子的大小、肚脐的形状、螃蟹腿的粗细和长度、眼睛的大小和颜色光泽、螃蟹的品种、重量、体积、腰围等等……
- 一些需要在互动过程中观察到的特征:螃蟹钳子的力量,对外界刺激的反应,用筷子触碰螃蟹眼睛后的反应,螃蟹行动的速度……
- 还有一些外部环境的特征: 收获螃蟹的季节,培养螃蟹的水域……
韩梅梅插话到:“这么多特征我头都大了,你还有完没完?”
其实,如果真要穷举出所有的特征可能永远也举不完。但是我们目的很明确——判断螃蟹是否是满黄。所以我们只关心跟这个问题(“标签”)相关的特征,它们只占所有特征中很小一部分。怕就怕一些糊涂的需求方连目的都不明确就要求一通乱搞,即便出来了一堆结果,也不知道有什么用。
头脑风暴完之后,很重要的一点就是找到对这个问题有长期经验的人,虚心向他们学习。人脑其实是一个很好的特征筛选器,这些经验可以给我们非常多的指导和启发,极大地减少我们试错的工作量。比如我们可以直接去找海鲜市场问螃蟹贩子,去田间地头找螃蟹养殖户,去海鲜饭店去问有经验的采购员和厨师……他们的最一线的经验是特征工程中的宝贵财富。
但这里需要考虑将经验转换成可量化的指标,才能便于机器学习。比如人们可能会说螃蟹很“活跃”、很“精神”,或者很“慵懒”。这些特征需要转换成一些可量化指标去衡量,具体怎么转换也有很大学问。
接下来要考虑的问题是对这些特征的可用性进行简单的评估。比如:
- 特征获取、描述难度
- 数据的规模
- 特征的准确率
- 特征的覆盖率
- 其他
我们通过明确目标,头脑风暴,咨询专家,特征量化,可用性评估等流程,就基本划定了特征范围。
3. 剧情二:“特征预处理”的门道
李雷说完,便拿出自己的平板,给韩梅梅看自己某个项目中搜集的初始特征。这些特征被放在一张巨大的表里。
韩梅梅看着这些密密麻麻的数字,心想:看李雷说得头头是道,但还是没告诉我怎么挑,不能让他轻易绕过去。
于是她说:“我看你这些特征数据有大有小,有些就是几万上下浮动,有些仅仅是小数点后好几位的微小变化,有些就是在0或1这两种可能中变化,有些连值都没有。你这些数据能用吗?”
李雷说:“不能,要转换成标准件。”
韩梅梅:“标准件?”
4. “特征标准件”
如果把机器学习过程当做一个加工厂的话,那输入的数据(特征、标签)就是原材料,输出的模型和判断结果就是产品。并不是胡乱扔进去任何原材料都能加工出合格产品的。原材料需要一个“预处理”过程才能方便地被算法处理。这些预处理后的数据,李雷起了个不够规范的名字,叫做“特征标准件”。
以二分类问题为例,不同的算法对“特征标准件”的要求是不同的。比如逻辑回归和神经网络,比较喜欢归一化之后在[-1,1]区间内浮动的特征。而贝叶斯方法,喜欢因子化之后的{0,1}分布的二元特征,每个特征只有“是”和“不是”两种可能的状态。
5. 连续特征与非连续特征
特征可以分为两类:“连续特征”和“非连续特征”。
“身高”、“体重”、“成绩”、“腰围”、“长度”、“宽度”、“体积”、“速度”等等,都是连续特征。连续特征能够比较方便地进行归一化。归一化的统一公式如下:
x∗=x−μS
μ为所有样本数据的均值,x−μ的步骤叫做去均值化
- 当S=xmax−xmin时,经过处理的数据在区间[-1,1]之间。
- 当S=σ(所有样本的标准差)时,经过处理的数据符合标准正态分布,即均值为0,标准差为1
另一方面:“是否高富帅”、“是否白富美”、“螃蟹的品种”、“螃蟹所在的水域”、“收获螃蟹的季节”等等,都是非连续特征。非连续特征能够比较方便地进行因子化,或者它本身就是二元特征。方法如下:
特征“收获螃蟹的季节”:{春,夏,秋,冬} 因子化后的结果为:
- 特征“是否春”:{是,否}
- 特征“是否夏”:{是,否}
- 特征“是否秋”:{是,否}
- 特征“是否冬”:{是,否}
6. 两类特征的相互转化
连续特征可以当非连续特征来用,非连续特征可以当连续特征来用。
连续特征可以离散化非连续特征。比如“年龄”作为一个连续特征,假设它的取值范围是[0,100]。我们可以中间切一刀,比如选择60(岁)。大于等于60岁的就叫做“老年”,小于60岁的就是“非老年”,这样就转化成了一个二元特征了。怎么选择离散的分离边界也很有学问。
如果我们中间切两刀甚至更多刀,比如18(岁)和60(岁)。大于等于60岁的就叫做“老年”,18岁到60岁之间的就叫做“中青年”,小于18岁就叫做“未成年”。然后再把这3类因子化成3个二分类就够了:“是否老年”、“是否中青年”和“是否未成年”。
非连续特征因子化成二元特征{0,1}后可以直接当做[0,1]之间的连续特征来用。我们之前文章《机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾》就是这么使用的。
7. 去除特征之间的共线性
我们在对离散特征因子化过程中细分到二元特征为止即可。那对于二元特征本身能否因子化成两个特征?比如以下例子:
特征“螃蟹的性别”:{公,母} ,可否转换为:
- 特征“是否公螃蟹”:{是,否}
- 特征“是否母螃蟹”:{是,否}
这是不行的,因为这两个特征的信息完全一样,也叫做共线性。计算这两个特征之间的条件熵:
H(“是否公螃蟹”|“是否母螃蟹”)=0
也可以用计算条件熵的方法去衡量两类离散特征的差异性,方便去除共线性关系的特征。
连续特征也有着共线性的情况,比如同一个品种的螃蟹腿的“长度”和“粗细”是共线性关系。也就是说,如果我们知道螃蟹腿的长度是x厘米,那么螃蟹腿的直径就是kx厘米,k是一个稳定的常数。因此我们只需要螃蟹腿的“长度”这一个特征就够了。那么连续特征的共线性如何去除?
可以计算两个变量(x,y)的相关系数:
rxy=cov(x,y)σxσy=cov(x,y)cov(x,x)×cov(y,y)√
rxy的取值范围是[-1,1],如果是0则统计独立,如果接近1则强相关。
可以计算这些数据的协方差矩阵,进而求出相关系数矩阵。就可以比较任意两个特征了。
既然协方差矩阵都求了,那就干脆用主成分分析(PCA)吧,这样更省事。得到主成分,线性相关的那些量就直接被舍弃了。我们在前文《深度学习与计算机视觉系列(7)_神经网络数据预处理,正则化与损失函数》 对PCA有相关论述。
感兴趣的同学可以试试把上述离散二元特征当做连续变量使用,构造几个数据,计算其相关系数并进行主成分分析。发现其相关系数就是-1,主成分分析后自动就变成一个主成分了。可见PCA对于连续特征与非连续特征都是去除共线性的通用方法。
8. 缺失值的处理
这个问题现在才讲,但实际过程中应该在前期去处理。掌握以下三点就够了:
- 如果某个特征的缺失值比较多:可能就直接舍弃。
- 如果缺失值不是很多,而且是连续特征:可以考虑用回归方法去拟合,或者直接用众数、中位数、平均数等具体的值去替代即可。
- 如果缺失值不是很多,而且是非连续特征:可以尝试把缺失值当做一个新的类目去处理,可能也揭示了一定的客观现实。
9. 离群点的分析
对于连续特征,最好看看其在样本中的分布。如果某些值偏离了主要聚集区域,可能需要单独抽出来分析,里面可能包含了更多的信息,可以这样画图方便观察:
10. 特征预处理小结
特征的预处理步骤比较多,相互之间的关系比较复杂。我们画了一张图以揭示它们之间的关系:
11. 剧情三:李雷另辟蹊径挑螃蟹
韩梅梅长叹一口气:“终于听你叨逼叨逼说完了。”
李雷说:“没办法啊,这块工作其实挺多的。我还要好多没说完……” “你打住”,韩梅梅赶紧说,“我算服了你了。但是李大码农,你还没有跟我说你怎么靠这些特征挑螃蟹呢。”
李雷说:“不急,用逻辑回归……”韩梅梅说:“不要用逻辑回归,我已经从赵媒婆那知道了。你换个方法,用非连续特征来做。”韩梅梅存心想刁难她的相亲对象。
李雷说:“那可以用贝叶斯。”
12. 用贝叶斯方法挑螃蟹
我们的标签用Y=“是满黄”来表示,相应的Y¯¯¯=“不是满黄”。Xi表示所有离散化的二元特征,如X1=“是河蟹”,X2=“是秋季收货”,X3=”钳子的力量大”……。于是在已知这些特征的情况下,该螃蟹“是满黄”的概率如下:
P(Y|X1,X2,X3...)=P(X1,X2,X3...|Y)×P(Y)P(X1,X2,X3...)
其实,可以直接判断P(Y|X1,X2,X3...)是否大于1/2即可。因为P(X1,X2,X3...)这一项算起来比较麻烦,我们用以下方法直接把它约掉。
先求出螃蟹“不是满黄”的概率:
P(Y¯¯¯|X1,X2,X3...)=P(X1,X2,X3...|Y¯)×P(Y¯)P(X1,X2,X3...)
再两式相处,得到:
P(Y|X1,X2,X3...)P(Y¯|X1,X2,X3...)=P(X1,X2,X3...|Y)×P(Y)P(X1,X2,X3...|Y¯)×P(Y¯)
这样就约去了P(X1,X2,X3…)。只需要判断P(Y|X1,X2,X3...)P(Y¯|X1,X2,X3...)是否大于1即可。但是,工程上用除法不太方便,两边同时取对数log,得到:
logP(Y|X1,X2,X3...)P(Y¯|X1,X2,X3...)=logP(X1,X2,X3...|Y)P(X1,X2,X3...|Y¯)+logP(Y)P(Y¯)
左边是螃蟹“是满黄”的逻辑发生比,只需要判断其是否大于0即可。
到目前为止,以上都是等价变换。
接下来我们引入贝叶斯方法中常用的条件独立假设:
P(X1,X2,X3...|Y)=P(X1|Y)×P(X2|Y)×P(X3|Y)...
P(X1,X2,X3...|Y¯¯¯)=P(X1|Y¯¯¯)×P(X2|Y¯¯¯)×P(X3|Y¯¯¯)...
将它们带入上式,就变成了:
logP(Y|X1,X2,X3...)P(Y¯|X1,X2,X3...)=logP(X1|Y)P(X1|Y¯)+logP(X2|Y)P(X2|Y¯)+logP(X3|Y)P(X3|Y¯)+...+logP(Y)P(Y¯)
于是我们得到了一个简单的求和式,只需要判断等式右边求和的结果是否大于0即可。而最关键的就是右边每一项都非常好求!假如训练集中所有的满黄螃蟹收集在一起,统计每一个特征出现的次数,除以满黄螃蟹的总数,就是其相应的条件(后验)概率了。再统计该特征在非满黄螃蟹集合中的条件(后验)概率,二者相除再取对数即可。
13. 用贝叶斯方法进行特征有效性分析
等式右边作为一个求和式,其中每个求和项logP(Xi|Y)P(Xi|Y¯)的绝对值越大,其对结果的影响越强烈,相对应的特征就是显著特征。而绝对值比较小的特征就是非显著特征,剔除掉也不会很明显地影响结果。这就完成了一个特征筛选的过程。
我们再分析一下各个求和项的结构,里面的概率部分是后验概率,是特征相对于标签的后验概率。这个后验概率与我们上一篇文章《从白富美相亲看特征预处理与选择(上)》中的后验概率方向相反,不要搞混淆了。
14. 贝叶斯与逻辑回归之间的关系
我们继续看看这个求和项,是不是很像逻辑回归中的求和项?我们如果拿二元特征当做连续变量采用逻辑回归方法。其判别式如下:
z=w1x1+w2x2+w3x3+...+b;其中xi∈{0,1}
二者的表达式惊人地相似!莫非logP(Xi|Y)P(Xi|Y¯)=wi,二者一模一样?
感兴趣的同学可以自己举个例子试一下,发现还是有区别的,二者求出来的权重不一样。产生这样差别的原因是什么呢?
想必大家都猜到了。就是贝叶斯方法引入的两个条件独立假设。正因为这两个条件独立假设,贝叶斯方法直接跳过了逻辑回归中反复迭代用梯度下降法才能求出的各个权重。
因此贝叶斯方法与逻辑回归的区别就是贝叶斯方法引入了一个更强的附加假设,而且可以直接通过统计结果求权重,而不必用梯度下降法。
所以有些情况下贝叶斯方法求出来的结果不好,就可以考虑考虑是不是条件独立假设的原因。
因此,可以说“在某种假定下,可以证明:与朴素贝叶斯分类方法一样,许多神经网络和曲线拟合算法输出最大的后验假定。”——韩家炜:《数据挖掘:概念与技术(第三版)》
15. 剧情四:李雷露馅儿了
韩梅梅听完,十分感慨地说:“难怪机器学习能挑出正确的结果,难怪赵媒婆用机器学习方法从这么多人中能把你挑出里来。你还是有两下子嘛。”
“废话,她是我干妈”,李雷志得意满,不小心说漏嘴。 韩梅梅:“什么?!”
李雷后悔不已,尴尬地陪着笑脸说道:“梅梅,我错了,我不该瞒你这么久。”到了这个地步,李雷只能和盘托出了。
16. 数据VS算法
其实李雷早就知道韩妈妈要挑选相亲名单,如果按她的标准,李雷根本没法进入名单中。而李雷也猜想她会去找赵媒婆。他就早早地联系赵媒婆,跟她推销他的机器学习方法。赵媒婆终于被李雷忽悠动心了。李雷就帮她开发那个相亲算法。但其实赵媒婆的样本数量不够,特征数量却非常多,肯定会过拟合。李雷就跟她说他会多找一些相亲的数据。李雷能从哪里找啊,只能发动周围的同学,让他们找他们观察到的情侣案例。而在这些群体中,恰好中学、大学是同学的情侣比率非常高,而且很多男方是码农。而李雷刚好符合这个条件,李雷的评分就非常高了。
因为样本选择本来就代表性不足,没能覆盖更多的青年群体,所以还是过拟合,只是偏向了李雷这边的概率而已。
可见,做机器学习虽然看起来比较炫酷的是算法,但真正关键的是数据。数据决定了你结果的上限,而算法只是尽可能逼近这个上限。而这点李雷并没有告诉赵媒婆。
对样本情况的分析要在特征优化过程中尤其注意。整个流程图如下:
17. 特征选择的局限性
而且,李雷并不觉得感情这样复杂的东西能够用赵媒婆那些量化的指标衡量好的。房子、车子、学历、文凭这些并不能衡量两个人之间的感情。一些非常重要的特征是难以量化的,比如两个人的“三观”、两个人对待感情的态度、两个人相互相处的独一无二的经历、两个人刻骨铭心的情感体验、那种两个人相信能够一辈子都在一起的笃定的感觉……这些至关重要的特征极其复杂,却非常难以量化。所以对于这类问题,机器学习的能力还是很有限的。
18. 剧情五:尾声
韩梅梅听完李雷,既生气,又好笑,还有一点点小感动:这小子为了感情还是蛮拼的。
一段沉默之后,韩梅梅笑着对李雷说:“好了好了,我不怪你了。”李雷长舒一口气。
韩梅梅继续说:“问个挑螃蟹的问题。你刚才选了这么多特征。为什么不考虑用B超直接照一下,看看里面什么东西不就成了吗?”
李雷一听,犹如当头一棒,整个脑子都被草泥马占满了:“我去,这么简单的方法我怎么想不到?!”
韩梅梅这时已经笑得肚子痛了,根本说不上话。
李雷吐槽到:“梅梅,你太厉害了。我觉得机器永远也学不到的两样东西就是人类的情感和脑洞啊!”
19. 后记
其实博主也没有丧心病狂到抓只螃蟹去照B超,只是自己被这个想法逗乐了,大家开心就好哈。O(∩_∩)O~~
如果真要死磕,据说B超的穿透力比较弱,对骨骼、空气等很难达到深部,因此难以成像。但是通过声波的回声来判断,也是一个思路。就像有些人可以通过拍打西瓜听声音来判断它甜不甜的道理一样。
如果不用机械波而用电磁波,比如X射线,估计哪怕能看到螃蟹满黄顾客也不会吃了。顾客也会担心放射残留的。CT应该好些,但是贵呀。一套设备下来,螃蟹估计也不止120块钱了吧。没玩过CT,不知道成本多少……总之还是要考虑获取特征的成本的。
<转>特征工程(二)的更多相关文章
- 机器学习实战基础(十五):sklearn中的数据预处理和特征工程(八)特征选择 之 Filter过滤法(二) 相关性过滤
相关性过滤 方差挑选完毕之后,我们就要考虑下一个问题:相关性了. 我们希望选出与标签相关且有意义的特征,因为这样的特征能够为我们提供大量信息.如果特征与标签无关,那只会白白浪费我们的计算内存,可能还会 ...
- 使用sklearn做单机特征工程
目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...
- 【转】使用sklearn做单机特征工程
这里是原文 说明:这是我用Markdown编辑的第一篇随笔 目录 1 特征工程是什么? 2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 无量纲化与正则化的区别 ...
- 转载:使用sklearn做单机特征工程
目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...
- Python机器学习笔记 使用sklearn做特征工程和数据挖掘
特征处理是特征工程的核心部分,特征工程是数据分析中最耗时间和精力的一部分工作,它不像算法和模型那样式确定的步骤,更多的是工程上的经验和权衡,因此没有统一的方法,但是sklearn提供了较为完整的特征处 ...
- AI学习---特征工程【特征抽取、特征预处理、特征降维】
学习框架 特征工程(Feature Engineering) 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 什么是特征工程: 帮助我们使得算法性能更好发挥性能而已 sklearn主 ...
- sklearn—特征工程
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- [特征工程]-------使用sklearn做单机特征工程[转载]
https://www.cnblogs.com/jasonfreak/p/5448385.html 使用sklearn做单机特征工程 目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1 ...
- Auto-ML之自动化特征工程
1. 引言 个人以为,机器学习是朝着更高的易用性.更低的技术门槛.更敏捷的开发成本的方向去发展,且Auto-ML或者Auto-DL的发展无疑是最好的证明.因此花费一些时间学习了解了Auto-ML领域的 ...
随机推荐
- Linux CPU Load Average
理解Linux系统负荷 LINUX下CPU Load Average的一点研究 Linux load average负载量分析与解决思路 Understanding Linux CPU Load - ...
- 【Hibernate步步为营】--最后的集合映射
上篇文章具体讨论了组合对象映射的原理.它事实上指的是怎样将对象模型中的组合关系映射到关系模型中,它是通过使用Hibernate提供的<component>标签来实现的,并须要在该标签中加入 ...
- kubeadm init 卡在 Created API client, waiting for the control plane to become ready
执行 kubeadm init 时出现卡在了 [apiclient] Created API client, waiting for the control plane to become ready ...
- Process和Thread在指定CPU运行
最近帮朋友写了一个多线程程序,他那边一运行多线程就出错,我这边却没有任何问题,找了好久才找到解决方法,原来是CPU的问题,有朋友遇到同样的问题,可以一起参考 //进程与指定cpu绑定 SetProce ...
- python pip 更换国内安装源(windows)
1.点击此电脑,在最上面的的文件夹窗口输入 : %APPDATA% 2.按回车跳转到以下目录,新建pip文件夹 3.创建pip.ini文件 4.打开文件夹,输入以下内容,关闭即可(注意:源镜像可替换) ...
- linux 下启动tomca慢问题
编辑文件vim /etc/profile 后面加入一句:export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" 设置立 ...
- 下拉刷新XListView的简单分析
依照这篇博文里的思路分析和理解的 先要理解Scroller,看过的博文: http://ipjmc.iteye.com/blog/1615828 http://blog.csdn.net/wangji ...
- GridView通过RowDataBound事件获取字段值、数据源列值
如果数据源有某一列,而在绑定到GridView时不显示该列,编程时要用到该列的值可以用以下方法: protected void GridView1_RowDataBound(object sender ...
- centos 离线安装Ambari
1.首先要下载它们的安装包,别尝试着在yum来下,特别慢,最好的方式是通过建立本地资源的方式来安装. http://public-repo-1.hortonworks.com/HDP/centos6/ ...
- geoserver 数据图层输出格式
1.WMS服务请求参数 一般WMS的请求地址如下: http://localhost:8080/geoserver/topp/wms?service=WMS&versi on=1.1.0&am ...