专栏首页数据STUDIO特征选择与特征提取最全总结

特征选择与特征提取最全总结

在上篇特征选择与提取最全总结之过滤法中已经介绍了特征选择的其中一大方法--过滤法。本篇将继续介绍特征选择与特征提取方法,其主要内容如下所示。

嵌入法

嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行。在使用嵌入法时,我们先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小选择特征。

这些权值系数往往代表了特征对于模型的某种贡献或某种重要性,比如决策树和树的集成模型中的 feature_importances_ 属性,可以列出各个特征对树的建立的贡献,我们就可以基于这种贡献的评估,找出对模型建立最有用的特征。

因此相比于过滤法,嵌入法的结果会更加精确到模型的效用本身,对于提高模型效力有更好的效果。

SelectFromModel是一个元变换器,可以与任何在拟合后具有coef_,feature_importances_ 属性或参数中可选惩罚项的评估器一起使用(比如随机森林和树模型就具有属性feature_importances_,逻辑回归就带有l1和l2惩罚项,线性支持向量机也支持l2惩罚项)。

基于树的特征选择

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()

# X_embedded = SelectFromModel(clf,threshold=0.005).fit_transform(X,Y)

clf.fit(X,Y)
RFC = pd.DataFrame(clf.feature_importances_, columns = ["RFC"], index=features.columns)
RFC = RFC.reset_index()
RFC.sort_values(['RFC'],ascending=0)

极端随机树分类器

极端随机树ET或Extra-Trees(Extremely randomized trees)是由PierreGeurts等人于2006年提出。该算法与随机森林算法十分相似,都是由许多决策树构成。但该算法与随机森林有两点主要的区别:

  1. 随机森林应用的是Bagging模型,而ET是使用所有的训练样本得到每棵决策树,也就是每棵决策树应用的是相同的全部训练样本;
  2. 随机森林是在一个随机子集内得到最佳分叉属性,而ET是完全随机的得到分叉值,从而实现对决策树进行分叉的。
from sklearn.ensemble import ExtraTreesClassifier
# 特征提取
model = ExtraTreesClassifier()

# X_embedded = SelectFromModel(model,threshold=0.005).fit_transform(X,Y)
model.fit(X, Y)
print(model.feature_importances_)
[0.214 0.216 0.307 0.188 0.027 0.029 0.019]
ET = pd.DataFrame(model.feature_importances_, columns = ["Extra Trees"], index=features.columns)
ET = ET.reset_index()
ET.sort_values(['Extra Trees'],ascending=0)

L1正则化

使用惩罚项的模型的嵌入法。

而对于使用惩罚项的模型来说,正则化惩罚项越大,特征在模型中对应的系数就会越小。当正则化惩罚项大到一定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0。

但是我们会发现一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。也就是说,我们选择特征系数较大的特征。

另外,支持向量机和逻辑回归使用参数C来控制返回的特征矩阵的稀疏性,参数C越小,返回的特征越少。Lasso回归,用alpha参数来控制返回的特征矩阵,alpha的值越大,返回的特征越少。

使用L1正则化作为惩罚项的线性模型会得到稀疏解:大部分特征对应的系数为0。特别指出,常用于此目的的稀疏预测模型有:

linear_model.Lasso(回归) linear_model.LogisticRegression svm.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)
l1 = pd.DataFrame(model.get_support(), columns = ["L1"], index=features.columns)
l1 = l1.reset_index()

岭回归

前面LASSO是L1正则化,而岭回归是L2正则化。

from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1.0)
ridge.fit(X,Y)
def pretty_print_coefs(coefs, names = None, sort = False):
    if names == None:
        names = ["X%s" % x for x in range(len(coefs))]
    lst = zip(coefs, names)
    if sort:
        lst = sorted(lst,  key = lambda x:-np.abs(x[0]))
    return " + ".join("%s * %s" % (round(coef, 3), name)
                                   for coef, name in lst)
  
print ("Ridge model:", pretty_print_coefs(ridge.coef_))
Ridge model: 
-0.093 * X0 + 0.475 * X1 + 
0.622 * X2 + 0.0 * X3 + -0.013 * X4 + 
0.203 * X5 + -0.123 * X6
Ridge = pd.DataFrame(ridge.coef_, columns = ["Ridge"], index=features.columns)
Ridge = Ridge.reset_index()
Ridge.sort_values('Ridge',ascending=0)

包装法

包装法也是一个特征选择和算法训练同时进行的方法,与嵌入法十分相似,它也是依赖于算法自身的选择,比如coef_属性或feature_importances_ 属性来完成特征选择。

包装法在初始特征集上训练评估器,并且通过coef_ 属性或通过feature_importances_ 属性获得每个特征的重要性。然后,从当前的一组特征中修剪最不重要的特征。

在修剪的集合上递归地重复该过程,直到最终到达所需数量的要选择的特征。区别于过滤法和嵌入法的一次训练解决所有问题,包装法要使用特征子集进行多次训练,因此它所需要的计算成本是最高的。

递归特性消除

最典型的评估器是递归特征消除法 (Recursive feature elimination, 简写为RFE) 。它是一种贪婪的优化算法, 旨在找到性能最佳的特征子集。

它反复创建模型,并在每次迭代时保留最佳特征或剔除最差特征,下一次迭代时,它会使用上一次建模中没有被选中的特征来构建下一个模型,直到所有特征都耗尽为止。

然后,它根据自己保留或剔除特征的顺序来对特征进行排名,最终选出一个最佳子集。

另外还有一个RFECV通过交叉验证的方式执行RFE,以此来选择最佳数量的特征。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# 特征提取
model = LogisticRegression()
rfe = RFE(model, 3)
rfe.fit(X, Y)
print("Num Features: %s" % (rfe.n_features_))
print("Selected Features: %s" % (rfe.support_))
print("Feature Ranking: %s" % (rfe.ranking_))
Num Features: 3
Selected Features: [True True False True
                    False False False]
Feature Ranking: [1 1 2 1 3 4 5]
features.columns
Index(['Open', 'High', 'Low', 'Volume',
       'Increase_Decrease',
       'Buy_Sell_on_Open', 'Buy_Sell'],
      dtype='object')
RFE = pd.DataFrame(rfe.ranking_, columns = ["RFE"], index=features.columns)
RFE = RFE.reset_index()
RFE.sort_values('RFE',ascending=0)

多种方法整合

from functools import reduce
dfs = [Ridge,var_thd ,pearsonr, RFE, ET, RFC, chi_sq, l1, vif]
final_results = reduce(lambda left, right: pd.merge(left,
                                                   right,
                                                   on='index',
                                                   how='outer'), 
                       dfs)
final_results

特征提取

特征提取(特征工程)是将原始数据转化为适合建模的特征。特征提取被用于所有的机器学习算法。

特征提取用于文本、图像、地理空间数据、日期和时间,以及时间序列。

特征提取从一组初始测量数据开始,并构建具有信息性和非冗余性的派生值(特征),促进后续的学习和泛化步骤,在某些情况下还会导致更好的人类解释。

特征提取是一个降维过程,原始变量的初始集合被简化为更易于处理的组(特征),同时仍然准确和完整地描述原始数据集。(维基百科)

特征工程是使用数据的领域知识来创建特征,使机器学习算法工作的过程。特征工程是机器学习应用的基础,既困难又昂贵。(维基百科)

数据准备

dataset = df.copy()
# Add more data
dataset['Increase_Decrease'] = np.where(dataset['Volume'].shift(-1) > dataset['Volume'],'Increase','Decrease')
dataset['Buy_Sell_on_Open'] = np.where(dataset['Open'].shift(-1) > dataset['Open'],1,0)
dataset['Buy_Sell'] = np.where(dataset['Adj Close'].shift(-1) > dataset['Adj Close'],1,0)
dataset['Returns'] = dataset['Adj Close'].pct_change()
dataset['Average'] = dataset[['Open','High','Low','Adj Close']].mean(axis=1)
dataset['Std'] = dataset[['Open','High','Low','Adj Close']].std(axis=1)
dataset['Month'] = dataset.index.month 
dataset['Day'] = dataset.index.day 
dataset['Year'] = dataset.index.year
dataset['Norm_Price'] = (dataset['Adj Close'] - dataset['Average']) / dataset['Std'] 
dataset['Date_Stamp'] = pd.to_datetime(dataset.index)
dataset = dataset.dropna()
dataset.head()

tsfresh特征提取

需要安装第三方模块:pip install tsfresh

TsFresh能自动地计算出大量的时间序列特征,即所谓的特征,这些特征描述了时间序列的基本特征,如峰数、平均值或最大值或更复杂的特征,如时间反转对称统计。

同时通过假设检验来将特征消减到最能解释趋势的特征,称为去相关性。然后,可以使用这些特征集在时间序列上构造统计或机器学习模型,例如在回归或分类任务中使用。

指定少量特征提取

from tsfresh import extract_features
import tsfresh
df2 = dataset.reset_index()
df2 = df2.dropna(how='all')
new_features = extract_features(df2[['Norm_Price', 'Day', 'Date_Stamp']], 
                              column_id="Day", column_sort="Date_Stamp", 
                              column_value="Norm_Price", n_jobs=0).dropna(axis=1)
new_features.head()
Feature Extraction: 100%|██████████| 
31/31 [00:02<00:00, 15.23it/s]

对整个数据表提取特征

X = extract_features(df2, column_id='Month', 
                     column_sort='Date', 
                     column_value='Adj Close')
X.head()
Feature Extraction: 100%|██████████| 
6/6 [00:00<00:00,  7.88it/s]
>>> tsfresh.feature_extraction.feature_calculators.abs_energy(dataset['Adj Close'])
2549098.5821893318
>>> tsfresh.feature_extraction.feature_calculators.absolute_sum_of_changes(dataset['Adj Close'])
858.289228439331

本文分享自微信公众号 - 数据STUDIO(jim_learning),作者:云朵君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 特征选择与提取最全总结之过滤法

    特征抽取是数据挖掘任务最为重要的一个环节,一般而言,它对最终结果的影响要高过数据挖掘算法本身。

    数据STUDIO
  • 特征选择与特征提取(降维)

    特征选择和降维有着些许的相似点,这两者达到的效果是一样的,就是试图去减少特征数据集中的属性(或者称为特征)的数目;但是两者所采用的方式方法却不同:降维的方法主要...

    里克贝斯
  • 特征选择与特征抽取

    特征抽取和特征选择是DimensionalityReduction(降维)两种方法,但是这两个有相同点,也有不同点之处:

    统计学家
  • SFS与SBS特征选择算法

    (1)序列前向选择( SFS , Sequential Forward Selection )

    里克贝斯
  • C++ OpenCV特征提取之Brisk特征检测与匹配

    BRISK是BRIEF描述子的一种改进,相比于BRIEF特征,它具有旋转不变性、尺度不变性和对噪声的鲁棒性。几个特征检测的速度比较:SIFT>SURF>BRIS...

    Vaccae
  • 特征工程完全总结

    目录 1 特征工程是什么? 2 数据预处理   2.1 无量纲化     2.1.1 标准化     2.1.2 区间缩放法     2.1.3 标准化与归一化...

    用户1332428
  • 浅析互信息与特征选择

    那么什么是互信息呢?变量x与变量y之间的互信息,可以用来衡量已知变量x时变量y的不确定性减少的程度,同样的,也可以衡量已知变量y时变量x的不确定性减少的程度。

    用户1908973
  • ConvLSTM:时空特征提取结构 [github代码]

    这篇文章[1]想要解决的问题是预测一个区域短时间内的降水变化,在它之前的工作(2015年之前)还很少有采用机器学习的方法来做相关预测。由于预测的输入是时序雷达图...

    Minerva
  • NLP界最强特征提取器--Transformer

    前面介绍NLP领域词向量技术的时候提到了目前最炙手可热的语言模型BERT,而BERT之所以能取得这样的瞩目成就,离不开其采用的超强特征提取器Transforme...

    流川枫
  • 基于遗传算法的特征选择:通过自然选择过程确定最优特征集

    遗传算法是一种基于自然选择的优化问题的技术。在这篇文章中,我将展示如何使用遗传算法进行特征选择。

    deephub
  • OpenCV中ORB特征提取与匹配

    OpenCV中ORB特征提取与匹配 FAST特征点定位 ORB - (Oriented Fast and Rotated BRIEF)算法是基于FAST特征检测...

    OpenCV学堂
  • PCL点云特征描述与提取(1)

    3D点云特征描述与提取是点云信息处理中最基础也是最关键的一部分,点云的识别。分割,重采样,配准曲面重建等处理大部分算法,都严重依赖特征描述与提取的结果。从尺度上...

    点云PCL博主
  • PCL点云特征描述与提取(3)

    已知点云P中有n个点,那么它的点特征直方图(PFH)的理论计算复杂度是,其中k是点云P中每个点p计算特征向量时考虑的邻域数量。对于实时应用或接近实时应用中,密集...

    点云PCL博主
  • PCL点云特征描述与提取(4)

    这将自动生成一个呈矩形的点云,检测的特征点处在角落处,参数-m是必要的,因为矩形周围的区域观测不到,但是属于边界部分,因此系统无法检测到这部分区域的特征点,选项...

    点云PCL博主
  • PCL点云特征描述与提取(2)

    正如点特征表示法所示,表面法线和曲率估计是某个点周围的几何特征基本表示法。虽然计算非常快速容易,但是无法获得太多信息,因为它们只使用很少的几个参数值来近...

    点云PCL博主
  • 特征离散化与选择EPSO算法详解

    EPSO的主要思想是使用BBPSO直接演化出一个可以在相应的特征值范围[MinF···MaxF]内任何值的切点。每个粒子的位置表示一个候选解,它是一个与问题的维...

    里克贝斯
  • 全面综述:图像特征提取与匹配技术

    链接 | https://zhuanlan.zhihu.com/p/133301967

    AI算法与图像处理
  • 使用通用的单变量选择特征选择提高Kaggle分数

    Kaggle 是全球首屈一指的数据科学网,Kaggle 现在每月提供表格竞赛,为像我这样的新手提供提高该领域技能的机会。因为 Kaggle 提供了一个很好的机会...

    deephub
  • 特征提取和泛化中深度ReLU网络的深度选择(CS.LG)

    深度学习被认为能够发现深层特征以进行表示学习和模式识别,而无需借助人类的独创性和先验知识就可以使用优雅的特征工程技术。因此,它引发了机器学习和模式识别方面的大量...

    蔡小雪7100294

扫码关注云+社区

领取腾讯云代金券