特征工程的方法和步骤


数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

0.示意图

在这里插入图片描述
原图

1.特征类别

1.1.类别特征

  • one-hot encoding
  • hash encoding
  • label encoding
  • count encoding
  • label-count encoding
  • target encoding
  • category embedding
  • Nan encoding
  • polynomial encoding
  • expansion encoding
  • consolidation encoding

1.2.数值特征

  • rounding
  • binning
  • scaling
  • imputation
  • interactions
  • no linear encoding
  • row statistics

1.3.时间特征

1.4.空间特征

1.5.自然语言处理

1.6.深度学习/神经网络

1.7.图特征

1.7.Leakage

1.8.统计聚合

1.9.自动化特征工程

2.数据预处理

利用Sklearn的preprocessing库。

2.1.无量纲化方法

  • 标准化:转换成标准正态分布x=xXSx'=\frac{x-{\overline X}}{S}
from sklearn.preprocessing import StandardScaler
  • 区间缩放法:
    如:x=xminmaxminx'=\frac{x-{min}}{max-min}
from sklearn.preprocessing import MinMaxScaler

2.2.归一化

依照特征矩阵的处理数据。
目的:将样本向量转化为单位向量。使样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准。

标准化是依照特征矩阵的处理数据,其通过z-score的方法,将样本的特征值转换到同一量纲下。

规则为L2的归一化公式如下:
x=xjmxj2x'=\frac{x}{\sqrt {\sum_j^mx_j^2}}

from sklearn.preprocessing import Normalizer

2.3.定性特征One-hot/哑编码

from sklearn.preprocessing import OneHotEncoder

其实One-hot和哑编码是有区别的(详见博文)。哑编码就是去除了One-hot的冗余变量。

2.4.定量特征二值化

x={1,x>threshold0,xthresholdx=\begin{cases}1,x>threshold \\0,x\leqslant threshold\end{cases}

from sklearn.preprocessing import Binarizer
Binarizer(threshold=3).fit_transform(iris.data)

2.5.缺失值填充

列平均值、0/1

from sklearn.preprocessing import Imputer
# 缺失值计算,返回值为结算缺失值后的数据
# 参数 missing_value为缺失值的表示形式,默认为NaN
# 参数 strategy为填充方式,默认为“均值填充”
Imputer().fit_transform(data)))

2.6.数据变换

提高算法对特征的信息利用率。

  • 多项式变换
from sklearn.preprocessing import PolynomialFeatures
# 参数degree为度
PolynomialFeatures().fit_transform(iris.data)
  • 指数变换、对数变换等
from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
# 自定义转换函数为对数函数的数据变换
# 第一个参数是单变元函数
FunctionTransformer(log1p).fit_transform(iris.data)

3.特征选择

sklearn中的feature_selection库
选择有意义的特征进行训练。通常从两个方面来考虑:

  • 特征是否发散: 如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
  • 特征与Y的相关性: 与目标相关性高的特征,应当优先选择。

3.1.Filter过滤法

按照发散性相关性对各个特征进行评分,设定阈值特征个数,选择特征。

3.1.1.方差选择法

利用发散性
计算各个特征的方差,选择方差>阈值的特征。

from sklearn.feature_selection import VarianceThreshold
VarianceThreshold(threshold = 3).fit_transform(iris.data)

3.1.2.相关系数法

利用相关性
计算各个特征对目标值Y的相关系数的评分。

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
# 参数k为选择的特征个数
# 第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数。
SelectKBest(lambda X,Y:np.array(list(map(lambda x:pearsonr(x,Y),X.T))).T,k = 2)
.fit_transform(X_test,y_test)

3.1.3.卡方检验

利用相关性
检验定性自变量对定性因变量的相关性。
假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数观察值与期望的差距,构建统计量:
χ2=(AE)2E\chi^2=\sum\frac{(A-E)^2}{E}

from sklearn.feature_selection import SelectKBest, chi2
#参数k为选择的特征个数
X_new = SelectKBest(chi2, k = 20).fit_transform(X, y)

3.1.4.互信息法

利用相关性

  1. 评价定性自变量对定性因变量的相关性。
    I(X;Y)=xXyYp(x,y)logp(x,y)p(x)p(y)I(X;Y)=\displaystyle\sum_{x\in X}\displaystyle\sum_{y\in Y}p(x,y)log\frac{p(x,y)}{p(x)p(y)}
  2. 定量数据:最大信息系数法。
from sklearn.feature_selection import SelectKBest
from minepy import MINE # 最大信息系数法

# 由于MINE的设计不是函数式,定义mic方法将其改为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
def mic(x,y):
    m = MINE()
    m.compute_score(x,y)
    return (m.mic(),0.5)

SelectKBest(lambda X, Y: array(list(map(lambda x:mic(x, Y), X.T))).T, k = 2).fit_transform(iris.data, iris.target)

3.2.Wrapper包装法

根据目标函数/预测效果评分,每次选择若干特征,或排除若干特征。

3.2.1.递归特征消除法

使用一个基模型来进行多轮训练
每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。

假如有50个特征,最终只保留10个特征。运行50次estimator,每次删掉一个特征,对50次的模型性能排序。特征删掉后,模型性能显著降低的将被留下。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
RFE(estimator=LogisticRegression(),n_features_to_select=2).fit_transform(iris.data,iris.target)

3.3.Embedded嵌入法

 先使用某些机器学习的算法模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。
 类似于Filter法,但是通过训练来确定特征的优劣。

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
selector = SelectFromModel(estimator=LogisticRegression()).fit(X, y)
print(selector.estimator_.coef_)
selector.transform(X)

树模型(如GBDT)也可以用来作为基模型。

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data,iris.target)

3.3.1.基于惩罚项

使用带惩罚项(L1、L2正则化)的基模型,除了筛选出特征外,同时也进行了降维。

正则化会将一些特征的权重降低。

4.特征降维

特征矩阵过大,会导致计算量大、训练时间长。

4.1.正则化

损失函数添加对权重的惩罚项。

4.2.主成分分析法(PCA)

from sklearn.decomposition import PCA
# 参数n_components为主成分数目
PCA(n_components = 2).fit_transform(iris.data)

4.3.线性判别分析(LDA)

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
# 参数n_components为降维后的维数
LDA(n_components = 2).fit_transform(iris.data,iris.target)

PCA和LDA有很多的相似点,其本质都是要将原始的样本映射到维度更低的样本空间中
但是PCA和LDA的映射目标不一样:

  • PCA是为了让映射后的样本具有最大的发散性
  • LDA是为了让映射后的样本有最好的分类性能

因此,PCA是无监督的降维方法,而LDA是有监督的降维方法。

5.特征衍生

从原始数据中构建新的特征,也属于特征选择的一种手段。特征构建工作并不完全依赖于技术,它要求我们具备相关领域丰富的知识或者实践经验,基于业务,花时间去观察和分析原始数据,思考问题的潜在形式和数据结构,从原始数据中找出一些具有物理意义的特征。
还没太懂,具体参考

5.1.特征扩展

如:特征离散化、One-hot

5.2.特征组合

将两个或多个特征通过数学运算进行组合。

  • 数值运算:对特征进行加,减,乘,除等。
  • 特征交叉:对多个特征进行交,并,补,笛卡尔积等。注意,暴力交叉可能产生稀疏问题。

再来一个示意图

在这里插入图片描述

参考

https://www.zhihu.com/question/29316149
https://www.jianshu.com/p/7066558bd386
https://blog.csdn.net/sunyaowu315/article/details/95446244

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章