特征工程 - 特征变换
一、基本概念
特征变换就是对数据进行规范化处理,包括对数据进行特征二值化、标准化、离散化、稀疏化处理等等,达到适用于挖掘的目的。
- 特征数值化
- 特征二值化
- OneHot编码
- 数据变换
- 特征离散化
- 特征规范化
特征数值化、特征二值化和OneHot编码,都是将标称属性和二元属性的数据,转化为数值属性,满足机器学习算法的输入要求。
二、特征数值化
将标称属性和二元属性的数据,进行数值化处理,以便机器学习算法的使用。在基础概念中已经讲过,比较简单。
三、特征二值化
根据设定的某一阈值,将属性分为两个类别。
# 使用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、聚类离散化
聚类离散化包括两个过程:
- 选取聚类算法(K-Means算法)将连续属性值进行聚类。
- 处理得到的k个簇,使用簇,为同一个簇内的属性值做统一表示。
k-means算法聚类,在上面的例子中的strategy参数中有包含。
4、决策树离散化
跳过,感兴趣可以参考下面的文章。
可以参考下面两篇blog,英文的。
https://towardsdatascience.com/discretisation-using-decision-trees-21910483fa4b
或下面这篇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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步