特征工程 - 特征变换

一、基本概念

  特征变换就是对数据进行规范化处理,包括对数据进行特征二值化、标准化、离散化、稀疏化处理等等,达到适用于挖掘的目的。

  • 特征数值化
  • 特征二值化
  • OneHot编码
  • 数据变换
  • 特征离散化
  • 特征规范化

  特征数值化、特征二值化和OneHot编码,都是将标称属性和二元属性的数据,转化为数值属性,满足机器学习算法的输入要求。

 

二、特征数值化

  将标称属性和二元属性的数据,进行数值化处理,以便机器学习算法的使用。在基础概念中已经讲过,比较简单。

 

三、特征二值化

  根据设定的某一阈值,将属性分为两个类别。

(1)y={0,xθ1,x>θ

  θ表示阈值,阈值的设置可以为平均值,也可以根据实际情况选择。

复制代码
# 使用scikit-learn.preprocessing的Binarizer方法,对数据进行二值化处理。
bn = Binarizer(threshold = data['属性名'].mean()) # threshold默认0
result = bn.fit_transform(data[['属性名']])

# 将处理后的数据,加入到原数据中
df['二值化处理后的新属性名'] = result

# 使用sklearn.preprocessing的binarize方法。
fbin = binarize(data[['属性名']],
                threshold = data['属性名'].mean())

result = fbin[data[['属性名']]]        
复制代码

 

四、OneHot编码

  独热编码,对应的属性值匹配则为1,否则为0。如:是yellow则为1,其他颜色则为0。

  对应OneHot,还有OneCold。与独热编码相反,匹配则为0,否则为1。

  color color_red color_white color_yellow
0 red 1 0 0
1 white 0 1 0
2 yellow 0 0 1
3 red 1 0 0
4 yellow 0 0 1
5 white 0 1 0

  如上表格所示,原始数据为color,通过独热编码后,得到后面3列。

复制代码
# 使用pandas的get_dummies方法。
df_dum = pd.get_dummies(data['属性名'],
                        drop_first = True)            

# 与原数据合并
data.merge(df_dum,
           left_index = True,
           right_index = True)        

# 使用sklearn.preprocessing的OneHotEncoder方法。
ohe = OneHotEncoder()
features = ohe.fit_transform(data[['属性名']])
dum = features.toarray()[:, 1:]
复制代码

  避免数据的冗余,所以在get_dummies 中设置drop_first 为True,丢弃第一列编码。

  在OneHotEncoder方法中,没有丢弃第一个哑变量的设置,所以通过Numpy切片操作手动去掉。

 

五、数据变换

  为研究数据集中的属性间的潜在规律,对属性进行某些函数变换,更容易发现规律。

  两个变量之间的关系,最直观的方法,是通过绘制的散点图。

  而有时,通过散点图观察,可能并不是很明显或很准确,此时做数据变换。

  数据变换的一些方法有:

  • 对数变换
  • 指数变换
  • 多项式变换
  • Box-Cox变换

 

六、特征离散化

  Discretization Operation

  数据离散化是指将连续的数据进行分段,使其变为一段段离散化的区间,用小间隔的标签代替属性的许多常数值。

  所以离散化处理,实际就相当于“分箱”。 

 

  为什么要做离散化处理?

  • 模型需要。如:决策树、朴素贝叶斯、logistic回归等算法,都是基于离散型的数据展开的。如果要使用该类算法,必须使用离散型数据。
  • 离散化的特征相对于连续型特征更易理解。如:将月薪2000和20000直接转换为离散型数据 低薪、高薪,不用通过数值层面理解差异,表达更加直观。
  • 可以有效的克服数据中隐藏的缺陷,消除离群值的影响,使模型结果更加稳定。

 

  有效的离散化能减小算法的时间和空间开销,提高系统对样本的分类聚类能力和抗噪声能力。

  等频法:使得每个箱中的样本数量相等,例如总样本n=100,分成k=5个箱,则分箱原则是保证落入每个箱的样本量=20。

  等宽法:使得属性的箱宽度相等,例如年龄变量(0-100之间),可分成 [0,20],[20,40],[40,60],[60,80],[80,100]五个等宽的箱。

  聚类法:根据聚类出来的簇,每个簇中的数据为一个箱,簇的数量模型给定。

   

  1、自顶向下离散化  Top-down Discretization

  如果首先考虑一个或几个点(所谓的分裂点)来划分整个属性集,并重复此方法直到最后,那么该过程称为自顶向下离散化,也称为分裂。

  2、自底而上离散化  Bottom-up Discretization

  如果先将所有的常数值视为分裂点,通过区间内邻域值的组合丢弃一些常数值,这个过程称为自底向上离散化。

 

   一些典型的离散化方法有:

  • 分箱
  • 直方图分析
  • 聚类分析
  • 决策树分析
  • 卡方分析

  下图来源 → https://cs.rhodes.edu/welshc/COMP345_F18/Lecture4.pdf

 

1、分箱离散化

  分箱技术对于用户指定的箱子个数很敏感,并且容易受到离群点的影响。这种情况下可以指定分割点,来消除离群点的影响。

  分箱可以是固定区间宽度,也可以根据具体数据自定义区间宽度。

  years name label_A label_B label_C
0 12 A 0 young young
1 15 B 0 young young
2 33 C 1 young middle
3 51 D 2 young senior
4 31 E 1 young middle
5 47 F 2 young middle
6 333 G - senior senior

  如表格所示,原数据为序号0-5。使用下面代码,得到结果label_A。第2个参数表示分箱个数,第3个参数表示标签列表。

# 使用pandas的cut方法。 
result = pd.cut(data['years'], 
                3, 
                labels = [0, 1, 2]) 

data['label_A'] = result

  依旧如表格所示,这回元数据为序号0-6,但很明显6号样本的years是个离群值。使用下面的代码,得到结果label_B。很明显,收到离群值的影响,离散化失败。

result = pd.cut(data['years'],
            3,
             labels = ['young', 'middle', 'senior'])

data['label_B'] = result

  同样地情况,只需要指定分箱的分割点边界即可。

result = pd.cut(data['years'],
                3,
                bins = [9, 30, 50, 500]
                labels = ['young', 'middle', 'senior'])

data['label_C'] = result

  在scikit-learn中有无监督离散化的方法,KBinsDiscretizer。

from sklearn.preprocessing import KBinsDiscretizer
kbd = KBinsDiscretizer(n_bins = 3, # 区间个数
                       encode = 'ordinal',    # 保存方式
                       strategy = 'uniform')    # 离散化策略

result = kbd.fit_transform(data[['years']])

data['kbd'] = result[:, 0]

  encode保存方式有三种,默认为onehot。

  • onehot:先离散化,再进行独热编码,返回一个矩阵。
  • onehot-dense:先离散化,再进行独热编码,返回稠密数组。
  • ordinal:先离散化,再用整数数值进行记录。

  strategy策略同样有三种,默认为quantile。

  • uniform:分区宽度相同。
  • quantile:分区内的样本数量相同。
  • kmeans:根据k-means聚类算法进行分区。

 

2、直方图离散化

  基于直方图的数据离散化方法,将数据分为不同区间。原理是通过统计数据在不同区间的频数确定分割点,根据分割点将数据进行离散化。

  确定离散化区间的数量或区间的宽度,将数据根据区间分为不同的组,并统计每个组中数据的频数。

  

  选择合适的分割点是直方图离散化中的关键步骤。常用的分割点选择方法包括等宽法和等频法。

  • 等宽法:分成相等大小的区间,区间内的数据个数可能不一样。
  • 等频法:分成相等数量的组,组内的数据个数一样。

  选择合适的分割点方法取决于具体的数据特点和实际需求。可以根据数据分布的形状和离散化后的效果来选择最合适的方法。

 

3、聚类离散化

  聚类离散化包括两个过程:

  1. 选取聚类算法(K-Means算法)将连续属性值进行聚类。
  2. 处理得到的k个簇,使用簇,为同一个簇内的属性值做统一表示。

  k-means算法聚类,在上面的例子中的strategy参数中有包含。

 

4、决策树离散化

  跳过,感兴趣可以参考下面的文章。

  可以参考下面两篇blog,英文的。

  https://towardsdatascience.com/discretisation-using-decision-trees-21910483fa4b

  https://medium.com/@joachimiak.krzysztof/discretizing-features-with-gradient-boosted-decision-trees-fc7a235cfa6a

  或下面这篇blog,网站是台湾ip,需要科学FQ。

  https://ithelp.ithome.com.tw/articles/10236233

 

5、卡方分析离散化

  跳过,感兴趣可以参考下面的文章。

  https://blog.csdn.net/misite_J/article/details/112283660

  https://blog.csdn.net/zhaoyl03/article/details/8689440

  https://www.cnblogs.com/wujiazhong/p/9526962.html

  https://developer.aliyun.com/article/636005

  https://blog.csdn.net/mousever/article/details/52425027

  《ChiMerge: Discretization of Numeric Attributes》

 

除了上述提到的5种离散化方法,还有其他的离散化方法,如:基于熵、基于分位数、1R(1 rule)等。

 

七、特征规范化

  不同特征的量纲可能不一致,数值间的差别可能很大,需要对数据按照一定比例进行缩放。

  特别是基于距离的挖掘方法,聚类,KNN,SVM一定要做规范化处理。

  → 详细讲解链接

    


 

 

本文作者:paramotor

本文链接:https://www.cnblogs.com/paramotor/p/17921640.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   paramotor  阅读(223)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 Ahh Mantap Tik Tok Tarik Sis De Yang Gatal Bukan Pho (Remix) DJ Desa
Ahh Mantap Tik Tok Tarik Sis De Yang Gatal Bukan Pho (Remix) - DJ Desa
00:00 / 00:00
An audio error has occurred.