特征工程知识点

提取方差大于阀值的特征数据VarianceThreshold
假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。
那我们怎么来评判一个特征值是不是存在对分析结果而言的高区分度呢,VarianceThreshold就是来帮我们做这一处理的,这样会简化数据分析的复杂程度,也会使得分析结果更有效。
 
比如:
from sklearn.feature_selection import VarianceThreshold
print VarianceThreshold(threshold=1).fit_transform([[1,2,3,5],[1,4,3,6],[1,8,2,9]])  
threshold表示阀值,是将4个特征数据里方差小于1的去掉,仅保留大于1的。
 
 
对定性特征哑编码OneHotEncoder
某些机器学习算法和模型只能接受定量特征的输入,需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。
如果定性值非常多,即高数量类别属性。反之,即低数量类别属性。哑编码对高数量类别属性的适用性并不好。
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(n_values = [2, 3, 4])
enc.fit([[0, 0, 3],[1, 1, 0],[0, 2, 1],[1, 0, 2]])
ans = enc.transform([[0, 1, 3]]).toarray()
print(ans) 
输出:[[1. 0. 0. 1. 0. 0. 0. 0. 1.]]
第一个特征,即第一列 [0,1,0,1],也就是说它有两个取值 0 或者 1,那么 one-hot 就会使用两位来表示这个特征,[1,0] 表示 0, [0,1] 表示 1,在上例输出结果中的前两位 [1,0...] 也就是表示该特征为 0。
第二个特征,第二列 [0,1,2,0],它有三种值,那么 one-hot 就会使用三位来表示这个特征,[1,0,0] 表示 0, [0,1,0] 表示 1,[0,0,1] 表示 2,在上例输出结果中的第三位到第六位 [...0,1,0,0...] 也就是表示该特征为 1。
第三个特征,第三列 [3,0,1,2],它有四种值,那么 one-hot 就会使用四位来表示这个特征,[1,0,0,0] 表示 0, [0,1,0,0] 表示 1,[0,0,1,0] 表示 2,[0,0,0,1] 表示 3,输出结果的最后四位 [...0,0,0,1] 也就是表示该特征为 3。
 
 
posted @ 2019-12-28 17:53  数之美  阅读(254)  评论(0编辑  收藏  举报