数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
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.无量纲化方法
- 标准化:转换成标准正态分布
from sklearn.preprocessing import StandardScaler
- 区间缩放法:
如:
from sklearn.preprocessing import MinMaxScaler
2.2.归一化
依照特征矩阵的行处理数据。
目的:将样本向量转化为单位向量。使样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准。
标准化是依照特征矩阵的列处理数据,其通过z-score的方法,将样本的特征值转换到同一量纲下。
规则为L2的归一化公式如下:
from sklearn.preprocessing import Normalizer
2.3.定性特征One-hot/哑编码
from sklearn.preprocessing import OneHotEncoder
其实One-hot和哑编码是有区别的(详见博文)。哑编码就是去除了One-hot的冗余变量。
2.4.定量特征二值化
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的样本频数的观察值与期望的差距,构建统计量:
from sklearn.feature_selection import SelectKBest, chi2
#参数k为选择的特征个数
X_new = SelectKBest(chi2, k = 20).fit_transform(X, y)
3.1.4.互信息法
利用相关性。
- 评价定性自变量对定性因变量的相关性。
- 定量数据:最大信息系数法。
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