继续前一篇写。
4. 实验准备和结果
采用前面Logistic regression中的 LROne project 和LRTwo 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
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
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
......
9. 结语
卡方选择这个是这几天断断续续在办公室和在家里面做的,比较随性,总结起来也不太好总结,自己都有点儿绕晕了。需要注意的是,这些验证都是在很小规模数据集上做的(几千个样本、十几个、几百个特征)。真正大规模数据集上是怎么样,还需要具体尝试,这里面的结论不能直接照搬。
最后吐槽一句,之所以做这个,就是觉得paper中的那些方法太屎了!丫的科研人员只管能不能发paper(这部分显然不是发paper的好素材),就不看看实际应用中的问题,哎,官僚科研体制害死人啊!
(完)
转载请注明出处:http://blog.csdn.net/xceman1997/article/details/19249241