机器学习系列(5)_特征工程02特征提取(上)

简介: 数据预处理,特征选择的目的是改善数据质量,体现数据的本质特征,降低计算成本,提升模型的表现。

数据预处理,特征选择的目的是改善数据质量,体现数据的本质特征,降低计算成本,提升模型的表现。

特征选择–主要分为三个模块:


  1. 特征提取(Features Extraction):如从文本型数据提取日期型数据;从非结构化数据(文本,视频,音频等)提取数据。如:Web爬取等;
  2. 特征创建(Features Creation):通过组合,计算等方法,得到原本不存在的特征(必须是合理的),比如:使用(数量*单价-折扣)得到销售额字段;
  3. 特征选择(Features Selection):从所有特征中,选择对当前模型有价值的特征,但必须要经过验证。

   特征选择是独立于任何机器学习算法的,往往是根据各种统计检验的分值  以及相关性指标来选择特征。

  1. 特征选择与模型应用的基本流程
    全部特征有哪些–》通过统计检验获取最佳特征子集(无创造新特征)–》通过算法进行训练–》模型评估–》模型应用

创造新特征:在数据整理的时候,

import pandas as pd
data=pd.read_csv("digit recognizor.csv")# 手写体数字特征提取

05d817ccdddb43ff94ed8f405050ccb6.png

X=data.iloc[:,1:] # 前面的标签不要

174850ace18e43eb9ef05eac7fbf8684.png

y=data.iloc[:,0]
y.unique()  # 想要知道每个数据上有多少数据


8a62b4c0339147418375a7d98859b205.png

# 体现0-9共十个数字每个数字有多少个样本
a=data.groupby("label").count()


一、Filter过滤法



1、方差过滤


方差过滤:消除方差为0的数据。


为什么使用方差过滤?

  1. 方差用来衡量随机变量或数据的离散程度(统计),或者衡量随机变量与数学期望(如均值)之间的偏离程度。
  2. 方差小,表示样本在特征上基本无差异,这种情况对于样本区分的价值不高
  3. 消除方差为0的特征是特征工程的重要任务。使用threshold来进行筛选,默认为0。

在机器学习的数据预处理的过程中常常会是使用到过滤法,而方差过滤是过滤法之一。所谓的方差过滤就是过滤掉那些特征方差较小的特征。


比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有什么作用。


所以可以设置一个过滤的阈值,过滤掉那些方差小的特征,从而达到特征筛选的目的。

在 sklearn中可以调用from sklearn.feature_selection import VarianceThreshold 类实现方差过滤。


以手写识别为例子:

7ced907c926c40a6b74eeae944e27030.png


from sklearn.feature_selection import VarianceThreshold
selector=VarianceThreshold() # 实例化,默认方差为0
X_var0=selector.fit_transform(X) # 获取具有特定价值的新特征矩阵
X_var0.shape # 使用方差进行过滤时,过滤掉了80+的数据

faa4e12762d442a898cc28d3f133606d.png

3cc28c511c444b68bc0941f64dfab77b.png

import numpy as np 
np.median(X.var().values)
# 以特征方差中位数为阈值,考察特征选择结果 
X_fsvar=VarianceThreshold(np.median(X.var().values)).fit_transform(X)
fff63182c8a544ef993a6fd361de5c1a.png
# 若特征是伯努利的随机变量,假设p=0.8 :表示如果某一种分类站到80%以上时,要删除特征
X_bvar=VarianceThreshold(.8*(1-0.8)).fit_transform(X)
X_bvar.shape # (42000, 685) 大概消除了100个特征
from sklearn.feature_selection import VarianceThreshold
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn.model_selection import cross_val_score   # 交叉验证

利用KNN和随机森林对全部特征,和以方差中位数为阈值的特征进行比较:

21a580f433914a469719ce62a6e2ecd3.png


(1)使用KNN进行考察


过滤:特征选择。

比较KNN在方差过滤前后的准确度:

# KNN在方差过滤之前
cross_val_score(KNN(),X,y,cv=5).mean() # 0.9658
%%timeit   # 计算运行时间
cross_val_score(KNN(),X,y,cv=5).mean()
# KNN在方差过滤之后
cross_val_score(KNN(),X_fsvar,y,cv=5).mean() # 0.966
%%timeit # 计算运行时间
cross_val_score(KNN(),X_fsvar,y,cv=5).mean()


(2)使用随机森林(RFC)进行考察


# 随机森林考察特征选择效果
%%timeit
cross_val_score(RFC(n_estimators=10,random_state=0),X,y,cv=5).mean()
%%timeit
cross_val_score(RFC(n_estimators=10,random_state=0),X_fsvar,y,cv=5).mean()

使用方差过滤后的特征对KNN和RFC的影响:

  1. 对两种算法的检测结果,可看出其模型精度是上升的,说明方差过滤是有效的,即将随机模式设置为random——state=0之后大部分噪声都被过滤掉了。
  2. 阈值较小被过滤的特征也会更少,模型表现不同会受影响,运行时间总体会少,但有时不明显。
  3. 阈值较大被过滤的特征相对较多,模型表现可能会更好,因为噪声在某些算法下可能被过滤了,但也有可能是相反的,在运行时间方面肯定会降低。
tempdf=pd.DataFrame(X,y)
tempdf.reset_index(inplace=True)
tempdf
56b7b51e7c6140ceb9f1282cccb4461c.png
r1=PearsonFirst(tempdf['label'],tempdfempdf['pixel400']) # 使用公式一计算X与Y的相关系数
r2=PearsonFirst(tempdf['label'],tempdfempdf['pixel400']) # 使用公式二计算X与Y的相关系数
tempdf.corr(method="pearson") # 耗时太长,了解即可


2、相关性过滤



选出与标签相关且有意义的特征。

(1)卡方过滤

  1. 专门针对离散型的标签(分类问题,如0,1,2…),使用sklearn.feature_selection.chi2计算每个非负特征(标准化,归一化过程)和标签之间的卡方统计量。根据统计量进行排名,并结合sklearn.feature_selection.chi2输入评选标准来选择K个特征。
  2. 卡方检测中若检测到某特征中所有值都相同,会提示使用方差过滤法进行先行处理。
  3. 卡方过滤一般使用经过中位数参数方差过滤后的特征数据进行,但若模型表现下降,则使用无过滤的原数据。
from sklearn.ensemble import RandomForestClassifier as RFC 
from sklearn.model_selection import cross_val_score     #交叉验证
from sklearn.feature_selection import SelectKBest 
from sklearn.feature_selection import chi2      #卡方
# 假设需要300个特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)   
# 从使用中位数方差过滤后的特征中选择
X_fschi.shape

8503791b77eb49ce967fa8c9a97df1d8.png6e6f27bc64aa484487e61a0df52e157c.png


(2) 用随机森林进行比较特征选择


# 用随机森林进行比较特征选择
cross_val_score(RFC(n_estimators=20,random_state=0),X_fschi,y,cv=10).mean()

2aecc864673341e3bfb0dc8e94a1b1cb.png

计算时间:


d47cec8a77b54bcbb23aab8c9338c75c.png


(3)选取超参数


k到底选择多大最合适?利用算法+学习曲线进行判断

# 选取超参数
%matplotlib inline 
import matplotlib.pylab as plt
score=[]
for i in range(390,200,-10):
    X_fschi=SelectKBest(chi2,k=i).fit_transform(X_fsvar,y)
    once=cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()
    score.append(once)
plt.plot(range(390,200,-10),score)
plt.show()

如下图,最高大约在94%,因此K值大约选在380位置处。

9e40ebc353c94472b955a49aa1cf234f.png

对应score如下:

2d348f2d172a49448d82ea244ffff888.png


特征工程的角度,选取卡方值较大,P值小于0.05的特征 ,即与标签有较大相关性。返回k值进行检验

chivalue,pyvalues_chi=chi2(X_fsvar,y) # 输入特征矩阵与标签
k=chivalue.shape[0]-(pyvalues_chi>0.05).sum() # 去除与标签无关的相关值
X_fschi=SelectKBest(chi2,k=k).fit_transform(X_fsvar,y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean
# n_estimators=10 选取10颗树,使用RFC来进行交叉验证
k=chivalue.shape[0]-(pvalues_chi>0.05).sum() # 去除与标签无关的相关值
# 大于0.05表示与标签无关

feac187a50034b0194fb2b51a9c47406.png

求出K值,就可以用在下面的代码中:

X_fschi=SelectKBest(chi2,k=k).fit_transform(X_fsvar,y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

9c8be9c4cf2b43d5b5eec6361038951b.png

如果使用全特征呢?870f44df63ee49b4a6eb6d85f986a210.png

# 如果使用全特征呢?
chivalue,pvalues_chi=chi2(X,y) # 输入特征矩阵和标签
k=chivalue.shape[0]-(pvalues_chi>0.05).sum() # 去除与标签无关的相关值
k

870f44df63ee49b4a6eb6d85f986a210.png

可以看到全特征计算出的K值更多:↑

43bdc255810743009aff46404b55ca8e.png

但是准确度小于中位数特征值处理后的准确度:↑

总结卡方检验的作用:

推测两组数据之间的差异,原假设是:两组数据之间是相互独立的。返回卡方值和P值这两个统计量。

P值 <0.05或者0.01 >0.05或者0.01
数据差异 差异不是自然形成的 差异是自然形成的
相关性 两组数据是相关的 两组数据是相互独立的
原假设 拒绝原假设 接受原假设


从特征工程的角度,选取卡方值较大,P值小于0.05的特征,即与标签有较大相关性。返回K值进行检验。

调用SelectKBest之前,直接从chi2实例化后的模型中获得各个特征所对应的卡方值和P值。


4)F检验


  1. F检验是用来捕捉每个特征与标签之间的线性关系的过滤方法。
  2. 可回归,可分类,故包含(离散型变量feature_selection.f_classif)和(连续型变量feature_selection.f_regression)两类。
  3. 需要与SelectKBest联合使用,即也需要有超参数
  4. 正态分布情况下效果稳定
  5. 原假设:数据之间不存在显著的线性关系。返回F和P值。小于0。05或者0.01代表显著性相关
from sklearn.feature_selection import f_classif
F,pvalues_f=f_classif(X_fsvar,y)
F 

4e74f7c8cf734d3fa84e71fad4bd0574.png

P值当中存在大量的0:↓

8a111d806ffe42af8ba36cbf8adcca4a.png

接着求出K值后,代入随机森林当中做计算:

0d63c57658784c57972e45d965cff9e6.png

X_fsF=SelectKBest(f_classif,k=k).fit_transform(X_fsvar,y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

d7e25919dd384097b04234b57a8e3da8.png

(5)互信息法


  1. 两个随机变量的互信息(mutual information)是变量之间相互依赖性的量度
  2. 互信息度量是两个随机变量共享的信息——知道随机变量x,对随机变量Y的不确定性减少的程度(或者知道随机变量Y,对随机变量X的不确定性减少的程度),用I(X:Y)表示
  3. 特征与标签之间可能存在任意关系(线性和非线性)
  4. 可回归,可分类,feature_selection.mutual_info_classif(互信息分类)和feature_selection.mutual_info_regression(互信息回归)
  5. 不返回P或者F,返回的是每个特征与目标特征之间互信息量的估计值,【0,1】之间取值
#X_fsvar 利用中位数取的特征,使用的是互信息法的方式
from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar,y) 
result

49dcce4e8c8945f996cc761b4c2ac7fd.png

k = result.shape[0] - sum(result <= 0)
k

image.png

根据算出的K值,计算交叉验证得到的准确度

X_fsmic = SelectKBest(MIC, k=k).fit_transform(X_fsvar, y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()

5c1bd28577e24886b5e9e79f0a7dd76d.png


相关文章
|
1月前
|
机器学习/深度学习 数据采集 算法
探索机器学习中的特征工程
【5月更文挑战第10天】 在机器学习领域,特征工程扮演着至关重要的角色。它涉及选择、修改和创造从原始数据中提取的特征,旨在提高模型的性能。本文将深入探讨特征工程的多个方面,包括数据清洗、特征选择、维度缩减以及特征编码等,同时提供实用的技巧和策略,帮助读者构建出更有效的机器学习模型。
|
22天前
|
机器学习/深度学习 算法 Python
特征工程:机器学习成功的关键步骤
【6月更文挑战第4天】特征工程是机器学习的关键,涉及特征选择、构建和变换,旨在提升模型性能。通过处理原始数据,如顾客购买行为,选择相关特征,创建新特征并转换数据(如对数变换),可以增强模型预测能力。例如,对异常值丰富的收入数据进行对数变换,可提升模型稳定性和准确性。特征工程是耗时且需要创造力的过程,是连接数据与智能的桥梁,在机器学习中发挥着至关重要的作用。
39 2
|
7天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】小波变换在特征提取中的实践与应用
【机器学习】小波变换在特征提取中的实践与应用
11 0
|
1月前
|
机器学习/深度学习 数据采集 算法
探索机器学习中的特征工程之艺术
【5月更文挑战第25天】 在机器学习的实践中,特征工程是连接原始数据与高效模型的桥梁。不同于常规的摘要侧重于概括文章内容,本文将通过具体案例深入剖析特征工程的重要性、方法论以及实际应用中的经验教训。文章将揭示如何通过细致的特征选择、构建和转换,来提升模型性能,并讨论在此过程中遇到的挑战及应对策略。
|
1月前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习中的特征工程最佳实践
【5月更文挑战第21天】 在机器学习领域,特征工程是模型性能优化的关键环节之一。本文将深入探讨特征工程的核心概念、方法及其在构建高效机器学习模型中的应用。文章不仅总结了实用的特征选择技巧和数据预处理策略,还介绍了如何通过自动化工具简化特征工程流程。通过案例分析,我们展示了在不同数据集上应用这些技术的效果,并讨论了特征工程在未来发展中的潜在趋势与挑战。
|
1月前
|
机器学习/深度学习 数据采集 算法
DataFrame 与机器学习:数据预处理与特征工程
【5月更文挑战第19天】数据预处理(如处理缺失值、标准化)和特征工程对机器学习模型的性能至关重要。使用`pandas`进行缺失值填充,`StandardScaler`实现数据标准化,通过创建新特征(如从日期提取月份、对数变换价格)和特征组合增强信息。相关性分析帮助选择重要特征,提升模型准确性和泛化能力。灵活运用这些方法能有效提升模型性能。DataFrame简化了数据操作,助力高效机器学习。
37 1
|
26天前
|
机器学习/深度学习 人工智能 自然语言处理
构建高效机器学习模型:从特征工程到模型优化
【5月更文挑战第31天】 在数据科学领域,构建一个高效的机器学习模型是实现精准预测和数据分析的关键步骤。本文将深入探讨如何通过有效的特征工程技术增强模型的预测能力,以及应用先进的模型调优方法来提升算法性能。我们还将讨论避免过拟合的策略和评估模型的指标,以确保模型的泛化能力和实用性。
|
1月前
|
机器学习/深度学习 数据采集 搜索推荐
机器学习中的特征工程:提升模型性能的关键步骤
【5月更文挑战第3天】特征工程是提升机器学习模型性能的关键,涉及从原始数据中提取、选择和创造特征。它能提高模型预测准确率,简化模型复杂度,增强泛化能力。常用技术包括特征选择(Filter、Wrapper、Embedded方法)、特征构造(组合、多项式、文本特征提取)和特征变换(标准化、归一化、离散化)。通过优化特征工程,可找到最佳特征组合,提升模型性能。
|
1月前
|
机器学习/深度学习 数据采集 自然语言处理
探索机器学习中的维度诅咒与特征工程
【4月更文挑战第26天】 在高维数据空间航行,机器学习模型常受维度诅咒之困扰,遭遇过拟合、计算成本增加和解释性下降等问题。本文通过深入分析维度诅咒的成因,探讨了特征工程作为解决之道的关键策略,包括特征选择、特征提取及特征转换等技术。我们将透过实例说明如何巧妙运用这些方法,以降低数据维度,提升模型性能,同时保持结果的可解释性。
|
1月前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型:从特征工程到模型调优
【4月更文挑战第16天】 在数据驱动的时代,机器学习已成为解决复杂问题的关键工具。本文旨在分享一套实用的技术流程,帮助读者构建高效的机器学习模型。我们将重点讨论特征工程的重要性、选择合适算法的策略,以及通过交叉验证和网格搜索进行模型调优的方法。文章的目标是为初学者提供一个清晰的指南,同时为有经验的实践者提供一些高级技巧。