0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据挖掘任务最重要的特征抽取

上海磐启微电子有限公司 来源:数据STUDIO 作者:云朵君 2021-09-01 09:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

不幸的是,关于怎样选取好的特征,还没有严格、快捷的规则可循,其实这也是数据挖掘科学更像是一门艺术的所在。

创建好的规则离不开直觉,还需要专业领域知识和数据挖 掘经验,光有这些还不够,还得不停地尝试、摸索,在试错中前进,有时多少还要靠点运气。

通常特征数量很多,但我们只想选用其中一小部分。有如下几个原因。

1、降低复杂度

随着特征数量的增加,很多数据挖掘算法需要更多的时间和资源。减少特征数量,是提高算法运行速度,减少资源使用的好方法。

2、降低噪音

增加额外特征并不总会提升算法的表现。额外特征可能扰乱算法的正常工作,这些额外特征间的相关性和模式没有实际应用价值(这种情况在小数据集上很常见)。只选择合适的特征有助于减少出现没有实际意义的相关性的几率。

3、增加模型可读性

根据成千上万个特征创建的模型来解答一个问题,对计算机来说很容易,但模型对我们自己来说就晦涩无比。因此,使用更少的特征,创建我们自己可以理解的模型,就很有必要。

有些分类算法确实很强壮,能够处理噪音问题,特征再多也不在话下,但是选用干净的数据,选取更具描述性的特征,对算法效果提升很有帮助。

根据特征选择的形式又可以将特征选择方法分为三种

Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。

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

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

写在前面为了帮助更好地理解特征选择,这里使用我们常用的股市数据作为基础数据。

由于文章较长,为方便阅读,我将特征选择与特征提取总结文章拆分为上下两篇,上篇(本文)主要内容包括如下图所示,主要介绍过滤法中常用的几种特征选择方法。

导入相关模块import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import warnings

warnings.filterwarnings(“ignore”)

import yfinance as yf

yf.pdr_override()

获取数据仍然用腾讯股市数据,辅助理解本文内容。

symbol = ‘TCEHY’

start = ‘2016-01-01’

end = ‘2021-01-01’

df = yf.download(symbol, start, end)

# df = df.reset_index()# View columns

df.head()

特征构造dataset = df.copy()

[‘Increase_Decrease’] = np.where(dataset[‘Volume’].shift(-1) 》 dataset[‘Volume’],1,0)

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 = dataset.dropna()

dataset.head()

数据准备设定目标标签为收盘价,研究哪些变量对收盘价影响加大。通过一定对方法剔除几乎没有影响的特征,选出影响较多对特征。特征选择在维度较大时尤为重要。

features = dataset.drop([‘Adj Close’, ‘Close’, ‘Returns’], axis=1)

array = features.values

X = array.astype(int)

Y = dataset[‘Adj Close’].values.astype(int)

过滤法过滤方法通常用作预处理步骤,特征选择完全独立于任何机器学习算法。它是根据各种统计检验中的分数以及相关性的各项指标来选择特征。

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

scikit-learn中的VarianceThreshold转换器可用来删除特征值的方差达不到最低标准的特征。

from sklearn.feature_selection import VarianceThreshold

vt = VarianceThreshold()

vt.fit_transform(X)

var_thd = pd.DataFrame(vt.variances_, columns = [“Variance”], index=features.columns)

var_thd = var_thd.reset_index()

var_thd.sort_values(‘Variance’,ascending=0)

无论什么时候,拿到数据后,先做下类似简单、直接的分析,对数据集的特点做到心中有数。方差为0的特征不但对数据挖掘没有丝毫用处,相反还会拖慢算法的运行速度。

单变量选择单变量的特征选择是通过基于一些单变量的统计度量方法来选择最好的特征。属于过滤法的一种。

scikit-learn提供了几个用于选择单变量特征的转换器,其中SelectKBest返回 个最佳特征,SelectPercentile返回表现最佳的前 个特征。这两个转换器都提供计算特征表现的一系列方法。都将得分函数作为输入,返回单变量的得分和p值。可作为输入的评分函数有:

对于回归: f_regression , mutual_info_regression, 互信息

对于分类: chi2 , f_classif , mutual_info_classif, 皮尔森相关系数

SelectKBest 选择出前k个与标签最相关的特征,主要有两个参数:

1、score_func : callable,函数取两个数组X和y,返回一对数组(scores, pvalues)或一个分数的数组。默认函数为f_classif,默认函数只适用于分类函数。

2、k:int or “all”, optional, default=10。所选择的topK个特征。“all”选项则绕过选择,用于参数搜索。

卡方单个特征和某一类别之间相关性的计算方法有很多。最常用的有卡方检验。经典的卡方检验是检验定性自变量对定性因变量的相关性。

卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。卡方检验类 feature_selection.chi2 计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。

再结合 feature_selection.SelectKBest 这个可以输入”评分标准“来选出前K个分数最高的特征的类,我们可以借此除去最可能独立于标签,与我们分类目的无关的特征。

from sklearn.feature_selection import SelectKBest

from sklearn.feature_selection import chi2

# 再使用SelectKBest转换器类,用卡方函数打分,初始化转换器。test = SelectKBest(score_func=chi2, k=3)

test.fit(X, Y)

# 得分情况

np.set_printoptions(precision=3)

print(test.scores_)

[6.365e+03 6.416e+03 6.286e+03 8.295e+08

2.949e+01 2.240e+01 3.059e+01]

卡方检验的本质是推测两组数据之间的差异,其检验的原假设是”两组数据是相互独立的”。卡方检验返回卡方值和P值两个统计量,其中卡方值很难界定有效的范围,而p值,我们一般使用0.01或0.05作为显著性水平,即p值判断的边界。

从特征工程的角度,我们希望选取卡方值很大,p值小于0.05的特征,即和标签是相关联的特征。而调用SelectKBest之前,我们可以直接从chi2实例化后的模型中获得各个特征所对应的卡方值和P值。

F检验另外类似的方法还有F检验,又称ANOVA,方差齐性检验,是用来捕捉每个特征与标签之间的线性关系的过滤方法。它即可以做回归也可以做分类,因此包含feature_selection.f_classif(F检验分类)和feature_selection.f_regression(F检验回归)两个类。其中F检验分类用于标签是离散型变量的数据,而F检验回归用于标签是连续型变量的数据。

F检验的本质是寻找两组数据之间的线性关系,其原假设是”数据不存在显著的线性关系“。它返回F值和p值两个统 计量。

和卡方过滤一样,我们希望选取p值小于0.05或0.01的特征,这些特征与标签时显著线性相关的,而p值大于 0.05或0.01的特征则被我们认为是和标签没有显著线性关系的特征,应该被删除。

互信息互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和F检验相似,它既可以做回归也可以做分类,并且包含两个类 feature_selection.mutual_info_classif(互信息分类)和feature_selection.mutual_info_regression(互信息回归)。这两个类的用法和参数都和F检验一模一样,不过互信息法比F检验更加强大,F检验只能够找出线性关系,而互信息法可以找出任意关系。

互信息法不返回p值或F值类似的统计量,它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关。

关于F检验和互信息,可以参见官方例子:Comparison of F-test and mutual information[1]

提取简化后的特征

# 调用transform()或直接使用fit_transform方法,# 对相同的数据集进行预处理和转换。

new_features = test.transform(X)

# 打印出特征提取前后特征数print(‘原始特征数:’, X.shape[1])

print(‘简化的特征数:’, new_features.shape[1])

原始特征数: 7

简化的特征数: 3

chi_sq = pd.DataFrame(fit.scores_, columns = [“Chi_Square”], index=features.columns)

chi_sq = chi_sq.reset_index()

chi_sq.sort_values(‘Chi_Square’,ascending=0)

皮尔逊相关系数Pearsonr函数的接口几乎与scikit-learn单变量转换器接口一致,该函数接收两个数组 (当前例子中为x和y)作为参数,返回两个数组:每个特征的皮尔逊相关系数和p值,直接把它传入到SelectKBest函数中。

SciPy的pearsonr函数参数为两个数组,但要注意的是第一个参数x为一维数组。我们来实现一个包装器函数,这样就能像前面那样处理多维数组。

from scipy.stats import pearsonr

def multivariate_pearsonr(X, Y):

# 创建scores和pvalues数组,遍历数据集的每一列。

scores, pvalues = [], []

for column in range(X.shape[1]):

# 只计算该列的皮尔逊相关系数和p值,并将其存储到相应数组中。

cur_score, cur_p = pearsonr(X[:,column], Y)

scores.append(abs(cur_score))

pvalues.append(cur_p)

#函数最后返回包含皮尔逊相关系数和p值的元组。

return (np.array(scores), np.array(pvalues))

该方法衡量的是变量之间的线性相关性,结果的取值区间为,

-1表示完全的负相关;

+1表示完全的正相关;

0表示没有线性相关。

现在,就可以像之前那样使用转换器类,根据皮尔逊相关系数对特征进行排序。

m_pearsonr = SelectKBest(score_func=multivariate_pearsonr, k=3)

X_pearson = m_pearsonr.fit_transform(X, Y)

print(m_pearsonr.scores_)

[9.989e-01 9.992e-01 9.994e-01 3.903e-01

9.078e-03 9.203e-04 2.001e-02]

pearsonr = pd.DataFrame(m_pearsonr.scores_, columns = [“pearsonr”], index=features.columns)

pearsonr = pearsonr.reset_index()

pearsonr.sort_values(‘pearsonr’,ascending=0)

多重共线性方差膨胀系数方差膨胀系数(variance inflation factor,VIF)是衡量多元线性回归模型中复 (多重)共线性严重程度的一种度量。它表示回归系数估计量的方差与假设自变量间不线性相关时方差相比的比值。

多重共线性是指自变量之间存在线性相关关系,即一个自变量可以是其他一个或几个自变量的线性组合。

通常以10作为判断边界。

当VIF《10,不存在多重共线性;

当10《=VIF《100,存在较强的多重共线性;

当VIF》=100, 存在严重多重共线性。

from statsmodels.stats.outliers_influence import variance_inflation_factor

def calculate_vif(features):

vif = pd.DataFrame()

vif[“index”] = features.columns

vif[“VIF”] = [variance_inflation_factor(features.values, i) for i in range(features.shape[1])]

return(vif)

vif = calculate_vif(features)

while vif[‘VIF’][vif[‘VIF’] 》 10].any():

remove = vif.sort_values(‘VIF’,ascending=0)[‘index’][:1]

features.drop(remove,axis=1,inplace=True)

vif = calculate_vif(features)

vif

过滤法总结

最后用一张表格将过滤法做个总结,方便大家查阅学习。

说明 超参数的选择
VarianceThreshold 方差过滤,可输入方差阈值,
返回方差大于阈值的新特征矩阵
看具体数据究竟是含有更多噪声
还是更多有效特征一般就使用0或1
来筛选也可以画学习曲线
或取中位数跑模型来帮助确认
SelectKBest 用来选取K个统计量结果最佳的特征,
生成看配合使用的统计量
符合统计量要求的新特征矩阵
看配合使用的统计量
chi2 卡方检验,专用于分类算法,捕捉相关性 追求p小于显著性水平的特征
f_classif F检验分类,只能捕捉线性相关性
要求数据服从正态分布
追求p小于显著性水平的特征
f_regression F检验回归,只能捕捉线性相关性
要求数据服从正态分布
追求p小于显著性水平的特征
mutual_info_classif 互信息分类,可以捕捉任何相关性
追求互信息估计大于0的特征
不能用于稀疏矩阵
追求互信息估计大于0的特征
mutual_info_regression 互信息回归,可以捕捉任何相关性
不能用于稀疏矩阵
追求互信息估计大于0的特征
pearsonr 皮尔逊相关系数,只能捕捉线性相关关系 追求p小于显著性水平的特征

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7315

    浏览量

    93985
  • 模型
    +关注

    关注

    1

    文章

    3649

    浏览量

    51713

原文标题:特征选择与提取最全总结之过滤法

文章出处:【微信号:gh_6a53af9e8109,微信公众号:上海磐启微电子有限公司】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    奥松电子协办第二届智能计算与数据挖掘国际学术会议

    2025年10月24日至26日,第二届智能计算与数据挖掘国际学术会议(ICDM 2025)在中国广州隆重举行。本次会议由广州航海学院、汕头大学、广东省数智科技研究会联合主办,广州奥松电子股份有限公司作为协办单位之一,携手多家产业机构,共同推动智能计算与
    的头像 发表于 11-03 14:18 399次阅读

    工业相机数据爆炸?ICY DOCK硬盘抽取盒极速存 + 0宕机!

    工业相机在高速图像采集与毫秒级数据处理中面临3个核心痛点:TB级数据流迫切需要超高速传输接口;严苛的工厂环境(震动、粉尘、电磁干扰、温差)威胁设备稳定运行;系统停机维护成本高昂,迫切需要快速故障定位
    的头像 发表于 09-05 16:02 299次阅读
    工业相机<b class='flag-5'>数据</b>爆炸?ICY DOCK硬盘<b class='flag-5'>抽取</b>盒极速存 + 0宕机!

    【「DeepSeek 核心技术揭秘」阅读体验】+混合专家

    并非在所有任务中都被激活,而是根据输入数据的特点,由门控网络精准筛选后参与运算。这就如同一个高效的任务分配系统,让每个路由专家专注于处理特定类型的输入或特征。调用最专业的“知识”来进行
    发表于 07-22 22:14

    用树莓派挖掘5种顶级加密货币!

    加密货币是用于在线交易的数字货币。挖掘这些货币通常需要专门的硬件,如ASIC矿机或高性能GPU。然而,有些加密货币仍可用树莓派来挖掘。在本文中,我将为您介绍可在树莓派上挖掘的最佳加密货币。适合用树莓
    的头像 发表于 07-21 16:34 930次阅读
    用树莓派<b class='flag-5'>挖掘</b>5种顶级加密货币!

    【硬盘抽取盒民主实验】你的真话,决定产品命运!敢说就送!

    这不是一场营销,而是一次硬盘抽取盒民主实验。ICYDOCK诚邀敢说真话的你!你的每一条真实反馈,都可能被采纳,直接塑造CP138产品的命运!你的声音,至关重要!CP138核心亮点速览CP138是专为
    的头像 发表于 07-18 16:32 267次阅读
    【硬盘<b class='flag-5'>抽取</b>盒民主实验】你的真话,决定产品命运!敢说就送!

    国产操作系统加速崛起——鸿蒙电脑补齐鸿蒙生态最重要拼图

    国产操作系统加速崛起——鸿蒙电脑补齐鸿蒙生态最重要拼图 5月19日,首次应用鸿蒙操作系统的个人电脑(PC)在四川成都正式发布。这标志着我国拥有了完全自主可控的电脑操作系统,国产操作系统在个人电脑领域
    的头像 发表于 05-21 11:41 499次阅读

    ICY DOCK PCIe可拆卸式扩展插槽硬盘抽取盒或转接器,革新存储解决方案

    在快节奏的云计算时代,对快速高效的数据存储解决方案的需求至关重要。从笨重的3.5英寸SATA硬盘过渡到灵活、基于PCIe的高速NVMeSSD,ICYDOCKExpressSlot系列可拆卸式PCIe
    的头像 发表于 04-18 14:42 694次阅读
    ICY DOCK PCIe可拆卸式扩展插槽硬盘<b class='flag-5'>抽取</b>盒或转接器,革新存储解决方案

    特征空间在端侧的作用

    解决方案的过程中,算法并不是最重要的因素(虽然是必要的),尤其是对于端侧应用。数据才是关键,一旦有了数据,真正起决定作用的,其实是隐藏在其中的“特征”(Feature)。
    的头像 发表于 04-08 09:44 673次阅读
    <b class='flag-5'>特征</b>空间在端侧的作用

    三一挖掘机一键启动开关易坏的原因及更换注意事项

    三一挖掘机一键启动开关易坏的原因虽然三一挖掘机的一键启动系统设计旨在提高便利性和安全性,但在实际使用中,可能会出现一些问题导致开关易坏。这些问题可能包括:频繁使用:挖掘机在施工过程中频繁启动和关闭
    发表于 03-12 09:29

    Linux系统中最重要的三个命令

    Linux三剑客是Linux系统中最重要的三个命令,它们以其强大的功能和广泛的应用场景而闻名。这三个工具的组合使用几乎可以完美应对Shell中的数据分析场景,因此被统称为Linux三剑客。
    的头像 发表于 03-03 10:37 803次阅读

    BEVFusion —面向自动驾驶的多任务多传感器高效融合框架技术详解

    丰富的语义信息,激光雷达提供精确的空间信息,而雷达提供即时的速度估计。 因此,多传感器融合对于准确可靠的感知具有重要意义。**来自不同传感器的数据以根本不同的方式表示:**例如,摄像机在透视图中捕获数据
    的头像 发表于 02-26 20:33 5976次阅读
    BEVFusion —面向自动驾驶的多<b class='flag-5'>任务</b>多传感器高效融合框架技术详解

    当我问DeepSeek AI爆发时代的FPGA是否重要?答案是......

    在AI时代,FPGA(现场可编程门阵列)具有极其重要的地位,主要体现在以下几个方面: 1.硬件加速与高效能 • 并行处理能力:FPGA内部由大量可编程逻辑单元组成,能够实现高度并行的数据处理。这种
    发表于 02-19 13:55

    传输线特征阻抗是设计中最重要的因素

    就称为受控阻抗的传输线。 传输线特征阻抗是设计中最重要的因素 传输线的瞬间阻抗或者是特征阻抗是影响信号品质的最重要的因素。如果信号传播过程中,相邻的信号 传播间隔之间阻抗保持一致,
    发表于 01-21 07:11

    AMC1210对AMC1305进行数字抽取滤波,输出后的数据是否需要用处理器进行一次平均和移位处理?

    我使用的AMC1210对AMC1305进行抽取滤波。AMC1210配置为SIN3,256倍抽取。积分器为128倍积分。AMC1210配置为中断方式SPI接口32bit输出。输出后的数据,是否需要用
    发表于 01-14 08:21

    MVTRF:多视图特征预测SSD故障

    任务随机森林( MVTRF )方案。MVTRF基于从SSD的长期和短期监测数据中提取的多视图特征预测SSD故障。特别地,采用多任务学习,通过同一模型同时预测什么类型的故障以及何时发生
    的头像 发表于 12-30 11:04 981次阅读
    MVTRF:多视图<b class='flag-5'>特征</b>预测SSD故障