「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》
方差选择法
- 一、方差科普
- 二、方差选择API
- 三、获取数据集
- 四、进行方差过滤
- 五、获取特征的方差值
提取的特征当中,有一些相关(相似)的「冗余特征」,这种特征是没有必要统计的,我们需要「减少」相关的特征,留下不相关的特征。也就是「特征降维」。
特征降维的方式有很多,这里使用其中的一种:方差选择法(低方差过滤)
一、方差科普
先简单科普一下,方差=平方的均值减去均值的平方,公式是:
比如,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,上述试验的过滤结果符合预期。