在数理统计中,方差是测算随机变量离散趋势最重要、最常用的指标,方差是各变量值与其均值离差平方的平均数,它是测算数值型数据离散程度的最重要的方法。
当数据分布比较集中时,各个数据与平均数的差的平方和较小,当数据分布比较分散(即数据在平均数附近波动较大)时,各个数据与平均数的差的平方和较大,方差就较大。因此方差越大,数据的波动越大;方差越小,数据的波动就越小,因此需要优先消除方差为0或较小的特征。
sklearn库中的用于特征选择的函数,使用VarianceThreshold法,先要计算各个特征的方差,然后根据阈值,剔除方差大于阈值的特征。
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
class VarianceSelect():
def __init__(self):
pass
# 将数据进行0-1标准化
def MaxMinTransform(self,data):
for var_name in data.columns:
mi = data[var_name].min()
ma = data[var_name].max()
data[var_name] = data[var_name].apply(lambda x: (x - mi) / (ma - mi))
return data
# 方差特征筛选
def VarianceFunc(self,data_final):
selector = VarianceThreshold(threshold=0.01)
result_select = selector.fit_transform(data_final)
result_support = selector.get_support(indices=True)
return result_select,result_support
# 加载及调用
def load_transform(self):
path = r'E:\programGao\csdnProgram'
data = pd.read_excel(path + '/dataset.xlsx', 'all')
print('查看初始数据 : ', data.head())
print('查看各变量均值方差 : ', np.mean(data.iloc[:, 2:]), np.var(data.iloc[:, 2:]))
data_final = self.MaxMinTransform(data.iloc[:, 2:])
print('查看0-1标准化后数据 : ', data_final.head())
print('标准化后查看各变量均值方差 : ', np.mean(data_final), np.var(data_final))
result_select, result_support = self.VarianceFunc(data_final)
print('筛选方差大于0.01的特征 : ', result_select)
print('方差筛选后保留特征索引 : ', result_support)
if __name__ == '__main__':
VarianceSelect().load_transform()
- 筛选后的结果