内容目录
一、概念及工作原理1、从哪些方面来选择特征呢2、为什么要进行特征选择3、处理高维数据的两大主流技术二、特征选择方法Filter 的四种基本方法1、Filter 之方差选择法2、Filter 之相关系数法3、Filter 之卡方检验4、Filter 之互信息法
一、概念及工作原理
1、从哪些方面来选择特征呢
当数据处理好之后,我们需要选择有意义的特征输入机器学习的模型进行训练,通常来说要从两个方面考虑来选择特征,如下:
(1)特征是否发散
如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
(2)特征与目标的相关性
这点比较显见,首先,特征与目标相关性高的特征,应当优先选择,其次,特征与特征之间相关性高的,应当优先去除掉其中一个特征,因为它们是替代品。
2、为什么要进行特征选择
(1)减轻维数灾难问题
(2)降低学习任务的难度
3、处理高维数据的两大主流技术
(1)特征选择
(2)降维
二、特征选择之 Filter 的四种基本方法
Filter简介
它主要侧重于单个特征跟目标变量的相关性。
优点是计算时间上较高效,对于过拟合问题也具有较高的鲁棒性。
缺点就是倾向于选择冗余的特征,因为他们不考虑特征之间的相关性,有可能
某一个特征的分类能力很差,
但是它和某些其它特征组合起来会得到不错的效果,这样就损失了有价值的
特征。
# 加载 IRIS 数据集做演示
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import LabelEncoder
df = sns.load_dataset('iris')
print(df.head())
print(df.shape)
df['species'] = LabelEncoder().fit_transform(df.iloc[:, 4])
df.head()
df['species'].unique() #array([0, 1, 2], dtype=int64)
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
(150, 5)
Out[5]:
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0
1、方差选择法
为什么方差可以用于选择特征呢?先从方差的概念说起,方差是衡量一个变量的离散程度(即数据偏离平均值的程度大小),变量的方差越大,我们就可以认为它的离散程度越大,也就是意味着这个变量对模型的贡献和作用会更明显,因此要保留方差较大的变量,反之,要剔除掉无意义的特征。
思路:先计算各个特征的方差,然后根据设定的阈值或待选择阈值的个数,选择方差大于阈值的特征,公式如下:
(1) 计算特征的方差。假设X=[x1,x2,...,xn],则方差为(其中是μ平均值,一般样本 方差(n-1)选择较好):
(2) 设定阈值,并筛选出大于阈值的特征或者筛选出待选择阈值的个数。
(3) 比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大 多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有什么作用。所 以无论接下来的特征工程要做什么,都要优先消除方差为0的特征。VarianceThreshold 有重要参数threshold,表示方差的阈值,表示舍弃所有方差小于threshold的特征,不 填默认为0,即删除所有的记录都相同的特征。
# 方差选择法
#方法一
def VarianceThreshold(df, threshold=0.):
dfc = df.iloc[:, :4].copy()
print(dfc.shape) #(150, 4)
print('特征名:\n', dfc.columns.tolist())
# 1 求方差
var = np.sum(np.power(np.matrix(dfc.values)-np.matrix(dfc.mean()), 2), axis=0)/(dfc.shape[0]-1)
print(var.shape) #(1, 4)
T = []
# 2 筛选大于阈