特征工程

特征工程简介:

  特征工程(Feature Engineering)是将原始数据转化成更好的表达问题本质的特征的过程,使得将这些特征运用到预测模型中能提高对不可见数据的模型预测精度。

  特征的重要性:如果一个特征与因变量(被预测的事物)高度相关,那么这个特征可能很重要。相关系数和其他单变量的方法(每一个变量被认为是相互独立的)是比较通用的评估方法。 更复杂的方法是通过预测模型算法来对特征进行评分。这些预测模型内部有这样的特征选择机制,比如MARS,随机森林,梯度提升机。这些模型也可以得出变量的重要性。

  探索性数据分析(EDA,Exploratory Data Analysis):集中趋势、离中趋势、分布形状

特征工程中的重要环节——特征处理

1.数据预处理

1.1缺失值处理

  缺失值删除——dropna():删除实例、删除特征

  缺失值填充——fillna():固定值、均值、众数、预测、聚类填充等

  注:LightGBM和XGBoost都能将NaN作为数据的一部分进行学习,所以不需要处理缺失值。

1.2异常值处理

  • 基于统计的异常点检测算法,例如极差,四分位数间距,均差,标准差等,这种方法适合于挖掘单变量的数值型数据。
  • 基于距离的异常点检测算法,主要通过距离方法来检测异常点,将数据集中与大多数点之间距离大于某个阈值的点视为异常点,主要使用的距离度量方法有绝对距离(曼哈顿距离)、欧氏距离和马氏距离等方法。
  • 基于密度的异常点检测算法,考察当前点周围密度,可以发现局部异常点。

1.3重复值处理

1.4数据格式处理

1.5数据采样

  多的类别过采样/少的类别欠采样来平衡分布欠采样(undersampling)和过采样(oversampling)会对模型带来不一样的影响。

2.特征转换

  特征也就是我们常常说的变量/自变量,一般分为三类:连续型,无序类别(离散)型 ,有序类别(离散)型

2.1连续型特征处理

    函数转换,非线性函数转换(需要将转换之后的特征和原特征一起加入训练模型进行训练)

  特征缩放,如岭回归,要求你必须将特征值缩放到相同的范围值内

  无刚量化,使不同规格的数据转换到同一规格(标准化、归一化、区间缩放法)

  二值化,将数值型数据输出为布尔类型

  离散化分箱处理,数值型转类别型,能够避免过拟合

2.2离散型特征处理

    数值化处理

  哑编码:热独编码,方便计算距离,保证无共线性

      顺序性哑变量,用递进表达了值之间的顺序关系

  时间序列处理

3.特征选择

3.1特征检验

    单变量:正态性建议、显著性分析

  多变量:一致性建议、多重共线性

3.2特征选择

    从大量的特征中选择少量的有用特征。 不是所有的特征都是平等的。那些与问题不相关的属性需要被删除;还有一些特征可以比其他特征更重要;也有的特征跟其他的特征是冗余的。特征选择就是自动地选择对于问题最重要的特征的一个子集。

  作用:简化模型,增加模型的可解释性;缩短训练时间;避免维度灾难;改善模型通用性、降低过拟合

  思路:1.判断特征是否发散:如果一个特征不发散,就是说这个特征大家都有或者非常相似,说明这个特征不需要。

       2. 判断特征和目标是否相关:与目标的相关性越高,越应该优先选择。

     3.按照特征评价标准分类: 选择使分类器的错误概率最小的特征或者特征组合。

     4.利用距离来度量样本之间相似度。 利用具有最小不确定性(Shannon熵、Renyi熵和条件熵)的那些特征来分类。

     5. 利用相关系数, 找出特征和类之间存在的相互关系; 利用特征之间的依赖关系, 来表示特征的冗余性加以去除。

  方法:

  Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。(方差选择法、相关系数法、互信息法、卡方检验)

移除低方差特征
'''  单变量的特征选择是通过基于单变量的统计测试来选择最好的特征。简单的处理方法有:

移除除了评分最高K个以外的特征SelectKBest()
p移除除了排名在一定百分比以外的特征SelectPercentile()
对于单变量的检验方法,常用的有F检验,互信息方法(需要较多数据),卡方检验(只适用于分类问题)
对于回归: f_regression , mutual_info_regression
对于分类: chi2 , f_classif , mutual_info_classif  '''

# 导入鸢尾花数据集
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
print(X.shape)
# 导入SelectKBest方法和检测指标f_classif(F检验)
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
X_new = SelectKBest(f_classif, k=2).fit_transform(X, y)
print(X_new.shape)
单变量特征选择

  Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。(递归特征消除法、前向选择法、后向剃除法)

'''递归式特征消除法使用某种估计器每次移除最不重要的特征,再在移除后的小集合中重复这个过程,通过交叉循环找到最佳的特征数量选择。'''

#递归式特征消除法进行重要性排名
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.feature_selection import RFE
import matplotlib.pyplot as plt
# 加载数据集
digits = load_digits()
X = digits.data
y = digits.target
print(X.shape)
# 创建RFE对象并进行排名
svc = SVC(kernel="linear", C=1)
rfe = RFE(estimator=svc, n_features_to_select=1, step=1)
rfe.fit(X, y)
ranking = rfe.ranking_.reshape(digits.images[0].shape)
# 根据排名ranking进行作图
plt.matshow(ranking)
plt.colorbar()
plt.title("Ranking of pixels with RFE")
plt.show()

#递归式特征消除法自动调整特征数
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
from sklearn.datasets import make_classification
# 使用三个特征进行交叉验证
X, y = make_classification(n_samples=1000, n_features=25, n_informative=3,
                           n_redundant=2, n_repeated=0, n_classes=8,
                           n_clusters_per_class=1, random_state=0)
# 创建RFE对象,计算交叉验证分数(准确度得分)
svc = SVC(kernel="linear")
# 使用rfecv函数,迭代到最佳特征数
min_features_to_select = 1 
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),
              scoring='accuracy',
              min_features_to_select=min_features_to_select)
rfecv.fit(X, y)
print("Optimal number of features : %d" % rfecv.n_features_)
递归式特征消除

  Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。(基于惩罚项、基于树模型、深度学习)

'''L1正则化方法能够将数据稀疏化,在数据更加分散的过程中,许多系数逐渐归0。该方法可以和SelectModel方法一起使用,选取在稀疏过程中没有为0系数的特征。'''

# 导入鸢尾花数据集
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
print(X.shape)
# 使用LinearSVC方法
from sklearn.svm import LinearSVC
from sklearn.feature_selection import SelectFromModel
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
print(X_new.shape)
L1正则化
'''使用树中的estimators模块,也能够消除一些不必要的特征'''
# 导入鸢尾花数据集
from sklearn.datasets import load_iris
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
X.shape

clf = ExtraTreesClassifier(n_estimators=50)
clf = clf.fit(X, y)
clf.feature_importances_  

model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
X_new.shape   
基于树的特征选取

3.3特征构造

    从原始数据中构造新特征 在机器学习或者统计学中,又称为变量选择、属性选择或者变量子集选择,是在模型构建中,选择相关特征并构成特征子集的过程。 根据已有特征生成新特征,增加特征的非线性。

  方法:

  1.四则运算

  2.特征交叉,将两个或更多的类别属性组合成一个

  3.分解类别特征

  4.重构数值量(如构造二值特征)

  5.分解Datatime

  6.机器学习

3.4特征提取

  许多机器学习问题涉及成百上千的特征,应用庞大的特征量往往会造成许多问题:

  • 训练速度大大降低,很难寻找好的解决方案
  • 过高的数据维度更可能会产生过拟合,导致模型泛化能力弱。
  • 高维数据具有稀疏性,许多训练实例之间可能距离很远,找到数据规律更困难
  • 解决以上问题,可以使用降维的方法。降维通过过滤掉一些不必要的冗余信息和细节信息,能够使模型更加准确,有效地加快训练速度。

    特征提取是一个自动化的降维过程。使得特征太多的样本被建模的维数降低。

  数据降维有以下几点好处: ​

  1、避免维度灾难,导致算法失效,或者时间复杂度高 ​ 2、避免高维数据中引入的噪声,防止过拟合 ​ 3、压缩存储,可视化分析

  方法:PCA、TCA、LDA...

4.入模评估

参考链接: 七种常用的特征工程 - 白开水加糖 - 博客园 (cnblogs.com)

     深度了解特征工程 - 知乎 (zhihu.com)

posted @ 2022-04-03 13:27  hungry_J  阅读(23)  评论(0)    收藏  举报