提取的特征当中,有一些相关(相似)的「冗余特征」,这种特征是没有必要统计的,我们需要「减少」相关的特征,留下不相关的特征。也就是「特征降维」

特征降维的方式有很多,这里使用其中的一种:方差选择法(低方差过滤)

一、方差科普

先简单科普一下,方差=平方的均值减去均值的平方,公式是:

【机器学习】特征降维 - 方差选择法VarianceThreshold-LMLPHP

比如,1、2、3、4、5这五个数,平均数是3;

「方差」是各个数据分别与其和的平均数之差的平方的和的平均数:[(1-3)^2+(2-3)^2+(3-3)^2+(4-3)^2+(5-3)^2]/5=2,也就是2。

方差小,就意味某个特征大多样本的值比较相近;方差大,就意味着某个特征大多样本的值都有差别。

方差选择法也叫「低方差过滤」,顾名思义,就是设定一个方差的值,所有低于这个方差的特征都会被删掉。


二、方差选择API

sklearn.feature_selection 是特征选择的API

sklearn.feature_selection.VarianceThreshold( threshold=0 )

  • VarianceThreshold.fit_transform( data ):接收字典类型的原始数据,返回方差过滤后的数字特征
  • VarianceThreshold.inverse_transform( data ):将过滤后的数字特征,转回原始数据
  • VarianceThreshold.get_feature_names_out():返回特征名字
  • VarianceThreshold.variances_:返回每个特征对应的方差值

三、获取数据集

这里我们使用鸢尾花数据集来做示例

from sklearn import datasets

# 初始化鸢尾花数据集
iris = datasets.load_iris()

# 打印数据特征
print(iris.data)
# 打印特征数总结
print(iris.data.shape)

输出:

[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 ......
 [5.9 3.  5.1 1.8]]
(150, 4)

从输出结果可以看到,数据集现在有150条数据,每条数据有4个特征。


四、进行方差过滤

接下来我们进行方差过滤,指定方差为0.2

from sklearn import feature_selection
from sklearn import datasets

# 初始化鸢尾花数据集
iris = datasets.load_iris()
# 初始化转换器(指定方差为0.2)
vt = feature_selection.VarianceThreshold(threshold=0.2)

# 使用转换器对数据进行低方差过滤
result = vt.fit_transform(iris.data)

# 打印数据特征
print(result)
print(result.shape)

输出:

[[5.1 1.4 0.2]
 [4.9 1.4 0.2]
 ......
 [5.9 5.1 1.8]]
(150, 3)

从输出结果可以看到,转换后的数据集有150条数据,每条数据有3个特征,方差小于0.2的那个特征被过滤掉了。

接下来,我们把方差改成1

from sklearn import feature_selection
from sklearn import datasets

# 初始化鸢尾花数据集
iris = datasets.load_iris()
# 初始化转换器(指定方差为1)
vt = feature_selection.VarianceThreshold(threshold=1)

# 使用转换器对数据进行低方差过滤
result = vt.fit_transform(iris.data)

# 打印数据特征
print(result)
print(result.shape)

输出:

[[1.4]
 [1.4]
 ......
 [5.1]]
(150, 1)

从输出结果可以看到,数据集的的特征变成了1个,方差小于1的那三个特征被过滤掉了。


五、获取特征的方差值

接下来,我们获取每一个特征的方差值,来验证过滤的准确性。

from sklearn import feature_selection
from sklearn import datasets

# 初始化鸢尾花数据集
iris = datasets.load_iris()
# 初始化转换器(指定方差为1)
vt = feature_selection.VarianceThreshold(threshold=0.2)

# 使用转换器对数据进行低方差过滤
result = vt.fit_transform(iris.data)

# 获取特征的方差值
print(vt.variances_)

输出:

[0.68112222 0.18871289 3.09550267 0.57713289]

从输出结果可以看到,4个特征的方差值,有3个大于0.2,有1个大于1,上述试验的过滤结果符合预期。

07-10 10:38