首先,特征筛选时筛掉相关性高的特征是任何建模过程都绕不开的步骤,是基础中的基础。而降维则不是,降维只在某些特定场合用得上,比如每个基因作为一个特征有几万个,或每个像素作为一个特征有成千上万个像素。
所以一个是普遍的做法,一个是不普遍的做法,任何情况下先使用普遍的做法才是正常人的反应。
但这道题真正想问的是:如果不用相关性先筛一遍特征而直接降维,会有什么弊端吗?
结论(以PCA为例):降维的时候,把多个特征融合成一个特征,这其间必然伴随信息的提炼和损失,那么提炼什么?损失什么呢?我们很自然而然地推测:权重高的信息会被留下,权重低的则会被损失。即是说,由于高相关性的特征重复出现,这些特征会被赋予本不属于它的高权重,降低其他特征所蕴含的信息。
举个例子,如果一共有100个(99个 A i A_i Ai和1个B)特征,这99个 A i A_i Ai都高度相关,它们蕴含的信息其实只相当于1个特征蕴含的信息,也就是说这100个特征其实只相当于2个特征A和B,如果让人类来做特征筛选,最后只会剩下1个A和1个B。但是如果让PCA来降维会怎样呢?结果必然是B的信息几乎损失完,只留下A的信息,因为A有99个,B只有1个。
以下是测试:
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
# 实例化PCA,n_components=1意思是让它降到1维
pca = PCA(n_components=1)
# 测试用数据,可以看出特征0是个具有单调性的特征,而特征1是个周期特征
test1 = pd.DataFrame([[1,2,3,4,5,6], [1,6,1,6,1,6]]).T
test1
0 | 1 | |
---|---|---|
0 | 1 | 1 |
1 | 2 | 6 |
2 | 3 | 1 |
3 | 4 | 6 |
4 | 5 | 1 |
5 | 6 | 6 |
# 降维后的结果,看得出来在尽量权衡两个特征,周期波动中也蕴含着绝对值大小的变化
result = pca.fit_transform(test1)
result
array([[ 3.16227766],
[-1.8973666 ],
[ 2.52982213],
[-2.52982213],
[ 1.8973666 ],
[-3.16227766]])
pca = PCA(n_components=1)
# 周期特征增加到99个,其实这个数据集的信息量和上面是一样的,因为2到99号特征完全重复
test2 = test1.copy()
for i in range(2, 100):
test2[i] = [1,6,1,6,1,6]
test2
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 2 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | ... | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
2 | 3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
3 | 4 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | ... | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
4 | 5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
5 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | ... | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
6 rows × 100 columns
# 第一次PCA,降到一维,这个数据里几乎只能看出周期性了
result = pca.fit_transform(test2)
result
array([[ 24.92007774],
[-24.83934329],
[ 24.87971052],
[-24.87971052],
[ 24.83934329],
[-24.92007774]])
pca = PCA(n_components=2)
# 第二次PCA,降到二维,看看能不能把原本的单调性抢救回来
result = pca.fit_transform(test2)
result
array([[ 2.49200777e+01, -1.99742969e+00],
[-2.48393433e+01, -2.00175547e+00],
[ 2.48797105e+01, 2.16288704e-03],
[-2.48797105e+01, -2.16288704e-03],
[ 2.48393433e+01, 2.00175547e+00],
[-2.49200777e+01, 1.99742969e+00]])
从以上实验不难看出,特征之间的相关性会导致它们蕴含的信息被赋予本不应该有的高权重,从而加大其他特征蕴含的信息的损失。
最后第二组实验降到二维,我觉得这个信息也算抢救回来了许多,但别忘了这是在实验,专门使用了很有特点的数据,我们也知道一共其实就两个特征,所以才能设定降到二维保留最多的信息。而真实情况,数据不仅没有这种强规律,我们也不清楚到底降到几维是最好的,所以PCA降维损失了多少信息我们是无从判别的。也就只有追求“程序正义”,一开始就不要带入相关性强的特征了。