1、方差筛选法
移除低方差的特征。低方差说明特征比较均匀,区分度低。如,一列数值全为1,则这列数值的方差为0。这一列特征对于训练模型是没有意义的。
使用方差筛选法的代码:
from sklearn.feature_selection import VarianceThreshold
# 6个样本,3维的特征向量
X = [[0, 0, 1],
[0, 1, 0],
[1, 0, 0],
[0, 1, 1],
[0, 1, 0],
[0, 1, 1]]
# 根据方差.对于布尔值类型的数据,删除80%的值都为1或都为0的特征。所以下面使用0.8
# 由于特征是伯努利随机变量(两个取值),方差计算公式:var_thresh = p(1-p)
df=pd.DataFrame(X,columns=['age','sex','level'])
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
feature=sel.fit_transform(X)
## feature 的值如下:
array([[0, 1],
[1, 0],
[0, 0],
[1, 1],
[1, 0],
[1, 1]])
这里筛选之后,变成了array类型,丢失了特征名称,如果想要知道保留的是哪些特征,可以如下操作
chosed_feat=[]
all_columns=df.columns.tolist()
feat_index=sel.get_support(indices=True)
for i in feat_index:
chosed_feat.append(all_columns[i])
## chosed_feat 为 ['sex', 'level']
方差分析法可以作为初级的特征筛选方法,一般可以先将阈值设置大一些(如0.95),先删除那些取值过于均匀的特征。
2、基于单变量统计特征进行选择
2.1 使用卡方统计量
import numpy as np
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
data=pd.DataFrame(np.array(X),columns=['A','B','C','D'])
print('原始特征:')
print(X.shape)
print(X[:10, :])
# 使用卡方分布选择2个维度的变量
# X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
selector = SelectKBest(chi2, k=2).fit(data, y)
x_new=selector.transform(data) #fit_transform()就是将fit和transform两个结合起来了
print('选取之后:')
print(x_new[:10])
fea_index=selector.get_support(indices=True) #得到筛选的特征的index
columns=data.columns.tolist()
fea=[]
for i in fea_index:
fea.append(columns[i])
print('筛选的特征为:')
print(fea)
结果如下:
当然,除了卡方(chi),我们也可以使用其他单变量方法。如:
只需要改变SelectKBest 中的参数就可以了。如我们可以使用户信息方法。
selector = SelectKBest(mutual_info_classif, k=2).fit(data, y)
参考的博客:
1、特征选择SelectKBest
2、python 特征选择