卡方选择(chi-square)能用到logistic regression当中么?(二)

继续前一篇写。


4. 实验准备和结果

采用前面Logistic regression中的 LROne projectLRTwo project,都是二值(0-1)分类,分别对应了二值输入和实值输入。简单把卡方值低的特征值置为零来去除该特征,代码参考《动手实现Logistic Regression (c++)_测试_再次》中的代码。实验结果,简单来说,发现效果并没有提升。相对直接去除绝对值小的权重对应的特征,如(一)中谈到的策略,用卡方值做指标来过滤特征,并没有获得性能提升,反而略有下降。因为LROne和LRTwo所采用的数据集合的数据量比较少,特征数目也比较少,其实所谓的性能“上升”和“下降”并不明显,都是小数点后三位的事情,对应于测试集合,也就是不超过十个测试样例的结果不同。至于具体数字,因为都是这两天断断续续在办公室和在家做的,而微软Skydrive的同步又是这么的屎,现在手头上也没有,就不列出来了。但结论是确定的,就是用卡方选择特征,在LR模型中并没有实质性的性能提升。对比《动手实现Logistic Regression (c++)_测试_再次》中的实验结果,用权重绝对值来过滤特征,如(一)中的策略,实验证明是能够缓解过拟合,得到性能的提升的。用卡方的方法,如果思路正确,即便性能不提升,也不至于下降啊。

这是为什么呢?难道我们最初的假设错了?


5. 查看数据

以 LROne project 中的训练数据为例,共10个特征,300个样本。对每个特征,它和两个类别的卡方计算结果如下:

11355.8 
81.0208 
487.556 
11018.4 
350.297 
837.993 
1259.29 
361.004 
706.618 
2475.33

因为只有两个类别,所以每个特征对这两个类别的卡方值计算结果一样,我就只列出一列数值。如果是多类别,如《 第三次实现Logistic Regression(c++)_接口》中LRThree project的实验,特征和各个类别的卡方值就不同了,这就涉及到一个问题,即便是根据卡方值来选择特征,那么根据 哪个卡方值来进行选择?可以参考我从前的博文《 【朴素贝叶斯】实战朴素贝叶斯_代码实现_特征选择1》的处理方法。哦,又跑题了。


LROne project训练出来的特征权重如下:

2.5668
0.12814
-0.135231
2.55564
-0.0892993
-0.256378
-0.279498
-0.100414
-0.185509
-0.447792

粗略看一下,上面的特征权重的大小关系,和特征与类别的卡方值的相对大小关系,两者并没有什么关系。说起来比较拗口,我们看细节。在训练出的权重中,第1维和第4维的权重绝对值最大,都超过了2,一定要保留;第5维和第8维的权重最小,可以去除。在计算出的卡方值中,第1维和第4维的数值的确最大,表示这两类特征与目标分类的关联最大,要保留;第5维和第8维的权重也的确小,但是最小的是第2维的特征。在卡方值计算中,第6维(837)和第9维(706)的卡方值计算结果差不多;但在权重中,第6维权重(-0.25)和第9维权重(-0.18)差别还是很明显的。

补充在 LRTwo project 的训练集australian_scale_train.txt的计算结果。卡方值计算结果:

0
582.223 
214.274
1356.59
11789.5
259.979
621.773
1462.74
582.223
582.223
533.89 
582.223
1907.78
1293.47
111.91 

模型训练出的权重:

0
-0.0414852
0.0974799
0.118787
0.257041
0.547778
0.203394
0.157669
1.4241
0.616544
0.0734307
-0.082194
0.127154
-0.117253
0.0548999

总之,我观察的结果是,各个特征之间,卡方值计算结果比较,和特征权重大小比较,两者没有直接联系。


6. 查看数据——继续

我又不死心,因为卡方值是有明确物理意义的,只不过这种意义不是我从前想象的方式来映射到特征权重上面罢了。接下来我做了一个有意思的事情,我把LROne project训练出来的特征权重加和平均,均值是0.375646,是个正数——回头我们再说这个正数的物理含义。注意:我能把这些权重进行加和平均,这样做是有前提的,就是:这些特征的取值范围是相同的,即都是0-1取值,如果到了LRTwo,就都是[0, 1]区间内的取值。这样,才不用考虑特征值之间的scaling,才能够直接进行加和平均。取得平均值之后,我把每个特征的权重与这个平均值做差,再求绝对值,结果如下:

2.19115413
0.24750587
0.51087687
2.17999413
0.46494517
0.63202387
0.65514387
0.47605987
0.56115487
0.82343787

如果做差再求平方的话,就是在计算标准差了,哦,又是题外话。总之,经过这样一折腾,发现折腾后的数据的相对大小关系、与特征对应的卡方值的相对大小关系 一致了。为了看得更清楚一些,我把上面表格与LROne的权重并列放到一起,如下:

2.19115413	11355.8
0.24750587	81.0208
0.51087687	487.556
2.17999413	11018.4
0.46494517	350.297
0.63202387	837.993
0.65514387	1259.29
0.47605987	361.004
0.56115487	706.618
0.82343787	2475.33

可以看到,两列数值之间的大小关系是一致的。嗯,看不清楚?那我就把这两列按照数值大小分别排序,再看一下,两列数字之间的对应关系没变,说明相对大小的关系是一致的:

0.247506 	81.020800 
0.464945 	350.297000 
0.476060 	361.004000 
0.510877 	487.556000 
0.561155 	706.618000 
0.632024 	837.993000 
0.655144 	1259.290000 
0.823438 	2475.330000 
2.179994 	11018.400000 
2.191154 	11355.800000 

这说明了什么?


7. 0.375646的物理意义

0.375646就是我们计算的各个特征权重的平均值,这个值的物理意义是什么?直观的说,那就是各个权重的平均值了。那么,映射到“样本--特征”之间,这个均值表示什么呢?当样本中各个特征完全均匀分布的时候,对于一个样本来讲,某个特征是否出现都是一个随机事件,一旦出现,那么该特征的期望权重是0.375646,一个样本中有n个特征出现,则n个特征的期望权重之和是 n * 0.375646。这个数字是多少并不重要,重要的是,这个是个正数,>0.0 的数字,那么在用sigmoid函数计算过后,就是 >0.5 的函数值,就会被分类为正样本。绕了一大圈,总而言之,就是因为0.375646是个正数,则从概率意义上,当特征均匀地投射到各个样本上的时候,该样本在概率意义上被分类为正样本。为啥是正样本不是负样本?我看了眼数据集,发现正样本的数量明显多于负样本的数量(223个正样本 vs 77个负样本)。

聊到这儿,那以上这些和卡方选择有什么关系?别忘了,卡方选择的最初目的是用于分类的,训练样本集合中不同类别的比重会影响卡方特征计算的结果

在Logistic regression中,当某个特征权重比较小的时候,它对模型的分类贡献就比较小(从LR的分类过程中就能得出这一结论);不过,它的卡方值并不一定小,即该特征和类别的联系并不一定小。具体来说,对LR模型,有特征A和特征B,经过抽样训练集上的训练,出来的权重分别是0.01和0.36。因为LR模型的分类过程,注定了特征A的对分类结果的影响比较小。不过,特征权重的均值是0.375646,0,01距离0.375646很远,0.36距离0.375646很近。卡方选择计算出来的结果,是特征A的卡方值要大于特征B的卡方值。我在想,如果LR模型在计算线性和的过程中不是和0.0比较、或者给LR模型加一个偏置(取值永远是1的特征),卡方选择和根据特征绝对值选择的结果就应该是一致了。


8. 不需要的验证

不需要的验证,就是明知道结论,还是想亲眼看一眼这个结论所做的验证。这个结论是刚才说的,正负样本比例会影响LR的训练权重。

弄了一个“理想”实验环境:0-1二值分类,10个特征,100个样本,每个样本的特征取值都相同,都是取所有10个特征,如下:

0 0 1 2 3 4 5 6 7 8 9
0 0 1 2 3 4 5 6 7 8 9
......
1 0 1 2 3 4 5 6 7 8 9
1 0 1 2 3 4 5 6 7 8 9
1 0 1 2 3 4 5 6 7 8 9
1 0 1 2 3 4 5 6 7 8 9
......

负样本数量是40个,正样本数量是60个,训练LR模型。看各个特征权重结果:显然,各个特征权重相同,计算出来都是0.14,>0.0。分类的时候,所有样本都被分为正样本(数量多的那类)。主要是看0,14这个值,就是对应上面实验中0.375646这个数字。验证了,当正负样本比例不均衡的时候,训练出的模型权重,更倾向于把未知样本分类到比重大的样本类别中去。


9. 结语

卡方选择这个是这几天断断续续在办公室和在家里面做的,比较随性,总结起来也不太好总结,自己都有点儿绕晕了。需要注意的是,这些验证都是在很小规模数据集上做的(几千个样本、十几个、几百个特征)。真正大规模数据集上是怎么样,还需要具体尝试,这里面的结论不能直接照搬。
最后吐槽一句,之所以做这个,就是觉得paper中的那些方法太屎了!丫的科研人员只管能不能发paper(这部分显然不是发paper的好素材),就不看看实际应用中的问题,哎,官僚科研体制害死人啊!

(完)

转载请注明出处:http://blog.csdn.net/xceman1997/article/details/19249241

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值