Feature Engineering【VarianceThreshold】
- Feature Extraction
- 从文字,图像,声音等其他非结构化数据提取新信息作为特征
- Feature Creation
- 已有的特征进行组合,或者相互计算,得到新的特征
- Feature Selection
- 从所有特征中选择出有意义的,对模型有帮助的特征
达到降低计算成本的效果
Step
- **step1 理解业务:**根据常识对项目的数据进行判断相关性从而理解数据
- 无法理解特征
- 过滤
- 嵌入
- 包装
- 降维算法
- 无法理解特征
维度:指的是特征的数量
如果维度过高,SVM或者神经网络直接算不出来(还要升维的算法),(42000,700+) 的数据,KNN也要跑半小时
过滤!
Filter
进行机器学习算法之前,利用过滤法(根据各种统计检验的分数和各种相关性指标 来 选择特征)
流程: 从全部特征提取出最佳特征子集。再进行机器学习算法使用。
- 方差过滤
- 使用 VarianceThreshold
- 通过特征本身的方差来筛选特征的类
- 方差小表示基本没啥差异:一整个特征的取值十分相近,这样的特征对于区分样本没有太大的作用(方差为0或者很小)
- 这是要优先消除的
- 通过特征本身的方差来筛选特征的类
- 使用 VarianceThreshold
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold()
X_var0 = selector.fit_transform(X)
# 直接写成下面的比较简便
X_var0 = VarianceThreshold().fit_transform(X)
**如何去除指定量的特征:**指定方差的中位数为多少
这前提是想要50%的方差
import numpy as np
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)
"""
X.var() 获得每一列的方差 是 Series结构
X.var().values 每一列方差 是 array结构
np.median(x) x是一堆数,这个方法选取中位数
"""
特征是二分类变量,特征的取值就是伯努利随机变量,计算方差公式可以为
V
a
r
[
X
]
=
p
(
1
−
p
)
Var[X] = p(1-p)
Var[X]=p(1−p)
X是特征矩阵,p是二分类特征中的一类在这个特征中的占比。
这样的降维会使得模型更好吗?
-
对于KNN来说,准确率相似,算法效率会高特别多;
- 对于:**KNN,单棵决策树,SVM,神经网络,回归算法,**都需要遍历特征或者升维进行运算,本身运算量很大。
- sklearn中的决策树自己也是随机选取的但是选的特征数量比随机森林多得多,所以特征多的时候时间也比较长
- 对于:**KNN,单棵决策树,SVM,神经网络,回归算法,**都需要遍历特征或者升维进行运算,本身运算量很大。
-
对于随机森林来说,本身速度很快,所以时间没啥差别,准确率也没什么大的区别。
- 对于:随机森林本身就是随机选取特征进行分枝。
阈值的选择:
- 阈值比较大的时候,模型可能更好也可能不好,看为噪音还是为有贡献的特征;计算复杂度也会可能大幅下降
- 通常选择阈值很小的,过滤基本无影响的数值