特征工程

article/2025/8/15 21:01:04

文章目录

      • 一、特征工程概述
      • 二、特征选择
        • 1.什么是特征选择
        • 2.为什么要做特征选择
        • 3.特征选择的基本原则
        • 4.特征选择常用的四种方法
          • 4.1 方差选择法
          • 4.2 相关系数法
          • 4.3 递归特征消除法
          • 4.4 模型选择法
        • 参考:
      • 三、特征构造
        • 1.什么是好?
        • 2.常见做法
        • 3.两个变量组合而成的特征转换
        • 4.常见的多个变量的特征转换

一、特征工程概述

​ 在商业数据的分析挖掘当中,最常用的数据是结构化数据,其呈现为二维表的结构,数据可以用装载到二维数组当中,其中的每个数可以使用行与列进行索引。结构化数据中的每一行称为记录,也可称为样本或实例(视不同的学科而定),每一列则被称为字段,也可称为变量或特征(同样视学科领域而定),其中“特征(Feature)”这一叫法在机器学习及模式识别当中被广泛使用,在应用当中只要不引起歧义,可以不区分它们的叫法。

​ 特征(feature)是一个被观察到的现象的可测量的属性,结构化数据中,特征通常以列的形式出现,用于描述记录在某些方面的属性;非结构化数据同样如此,例如对于一个文档,短语或单词的计数就可以是其一个特征。

​ 特征是模型的输入,而不同的模型对输入有不同的要求。正因如此,原始数据往往需要通过一定的处理和转换才能在模型中使用,而为了提升模型的表现,又需要对所有可用的特征进行一定的筛选,既保证重要的特征进入模型,又要保证不会选择过多的特征。所有这些在建模前对数据进行处理、转换、筛选的工作被称为特征工程(Feature Engineering),其本质上是对原始数据的再加工,目的是产生进入模型的特征。“特征工程”这一名称在机器学习与模式识别领域被大量使用,在数据挖掘标准流程CRISP-DM当中,“数据准备”(Data Preparation)具有与特征工程相同的作用和类似的方法,因此在应用当中,无需严格区分,本章当中使用“特征工程”这一名称。

​ 特征工程分为数据预处理(Data Preprocessing)特征抽取(Feature Extraction)特征构造(Feature Construction)特征选择(Feature Selection) 等几个步骤,每个步骤间没有明显的顺序之分,往往需要根据需求反复执行,甚至也没有严格区分的概念边界,例如特征构造可能会与数据预处理使用同样的数据变换技术等等。

​ 特征工程在整个数据分析的流程当中占用最多的工作时间,而且具有重要的地位,可以认为,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

​ 此外,为了演示特征工程的案例,建议采用pandasscikit-learn进行数据的处理。因为商业数据通常是结构化的,pandas包可以很好地对这类数据进行读取、统计、汇总、变换,也可以进行一些简单的可视化,因此数据的预处理可以使用pandas中的函数和方法。同时scikit-learn包作为流行的机器学习框架,对机器学习的多种方法都有支持,包括了对数据预处理、特征选择等建模前步骤的方法支持。

二、特征选择

1.什么是特征选择

特征工程(Feature Selection),也叫做特征子集选择(Feature Subset Selection, FSS), 或者叫做属性选择(Attribute Selection)。是指从全部的数据特征中选取合适的特征,从而确保模型变得更好。

2.为什么要做特征选择

特征数量越多模型就越好吗?
不是,特征越多,意味这模型的计算维度越大,模型也会更复杂,从而训练模型的时间就会越长。这叫做“维度灾难”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a5O6vel6-1572934135126)(E:\CQUPT\AI\学习笔记\picture\特征选择.png)]
特征选择的意义便是,剔除掉一些不相关的特征,剔除掉一些重复的特征,在保证特征有效性的同时减少特征数量,从而提高模型精确度,减少模型复杂度,减少模型训练时间。另外,对模型做筛选会帮助模型变得更有可解释性和逻辑性。

3.特征选择的基本原则

特征与我们的目标是否具备发散性、相关性,我们要对相关性强的特征进行优先选择。

4.特征选择常用的四种方法

4.1 方差选择法

先计算各个特征的方差,根据阈值,选择方差大于阈值的特征。这个我想了很久,方差大的发散性就好,就适合做特征变量,方差低于阈值的,发散性就差,就不适合做特征变量。

大白话就是计算每个特征的方差。

from sklearn.feature_selection import VarianceThresholdvarianceThreshold = VarianceThreshold(threshold =1)
varianceThreshold.fit_transform([['累计票房','豆瓣评分']])
varianceThreshold.get_support()

输出哪些变量可以作为可用的特征,哪些不可以。

当阈值为1时,我们发现两个特征都可以作为特征的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BlBmgwgt-1572934135127)(E:\CQUPT\AI\学习笔记\picture\特征选择1.png)]

当阈值为3时,我们发现两个特征只有一个可以作为有效特征。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8SzrGxEA-1572934135127)(E:\CQUPT\AI\学习笔记\picture\特征选择2.png)]
不过这个方法可能在互联网行业适用,在有些精密领域,也许方差的大小很难确认,还是需要行业经验辅助。

4.2 相关系数法

计算各个特征值和目标值的相关系数,选取相关性强的特征。

from sklearn.feature_selection import SelectKBest
from skleasrn.feature_selection import f_regressionselectKBest = SelectKBest(f_regression, k=2)
feature = data[['月份','季度','广告费用','客流量']]
bestFeature = selectKBest.fit_transform(feature, data[['销售额']])
selectKBest.get_support()
4.3 递归特征消除法

使用一个基模型来进行多轮训练,训练多轮训练后,保留指定的特征数。
递归特征前提是选择一种模型,例如SVM或者逻辑回归,然后选择一定数目的特征,进行模型评估。接下来对审改的特征重复上述动作,直到所有特征都遍历。最后,选择出模型效果最好的特征。

递归特征消除法属于一种贪心算法。 优点在于想法很好,缺点是当数据量很大时,这种贪心算法会导致计算很慢。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegressionfeature = data[['月份','季度','广告费用','客流量']]
rfe = RFE(estimator = LinearRegression(), n_features_to_select=2)
sFeature = rfe.fit_transform(feature, data[['销售额']])
rfe.get_support()
4.4 模型选择法

把我们建好的模型对象传入选择器,然后会根据建好的模型,自动帮我们选择最好的特征值。该方法自动选择最佳的特征,特征数不需要我们定。

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LinearRegressionIrModel = LinearRegression()
selectFromModel = SelectFromModel(IrModel)
selectFromModel.fit_transform(feature, data[['销售额']])
feature.columns[selectFromModel.get_support()]

参考:

https://www.jianshu.com/p/ad71fcda7d09

三、特征构造

导读:数据科学从业者们更倾向于选择用著名的算法来解决给定的问题,但仅仅靠算法并不能提供一个最优的解决方案,通过精心设计和选择的特征所建造的模型能够提供更好的结果。

此篇作者总结了很多常见且有效的特征转化的方法,有些方法附有简单说明。具体的应用方法可以在网络上搜索公开信息。

“任何一个有智力的笨蛋都可以把事情搞得更大,更复杂,也更激烈。往相反的方向前进则需要一点天分,以及很大的勇气。” –阿尔伯特·爱因斯坦

复杂的模型不易解释,难以调整。简单的算法配合更好的特征或者更多的数据,比脆弱的假设配合复杂的算法会得到更好的结果。

1.什么是好?

好的特征代表了灵活性、更简单的模型和更好的结果,不相关的特征则会影响模型的泛化性。因此特征选择和特征工程并非是互相排斥的,而是相辅相成的。有效的特征工程能够帮助我们提炼数据的代表。接着问题就来了,什么才是好的代表?

代表的好坏取决于里面所包含信息的好坏。

熵(Entropy,熵值越高,数据中所包含的信息越多),方差(Variance,方差越大,数据中所包含的信息越多),更好的分离映射(Projection for better separation,最高的方差所对应的映射包含更多得信息),特征对类别的关联(feature to class association)等。所有这些都解释了数据中所包含的信息。

特征工程是建模过程中很重要的一个步骤,但也很难实现自动化,它需要专业知识和很多数据的探索性分析。

2.常见做法

  1. 单一变量的基础转换:x, x^2,sqrt x ,log x,缩放

  2. 如果变量的分布是长尾的,应用Box-Cox转换(用log转换虽然快但不一定是一个好的选择)

  3. 你也可以检查残差(Residuals)或是log-odds(针对线性模型),分析是否是强非线性。

  4. 对于基数比较大的数据,对于分类变量,创造一个表示每种类别发生频率的特征是很有用的。当然,也可以用占总量的比率或是百分比来表示这些类别。

  5. 对变量的每一个可能取值,估计目标变量的平均数,用结果当做创造的特征。

  6. 创造一个有目标变量比率的特征。

  7. 选出最重要的两个变量,并计算他们相互之间、以及与其它变量之间的二阶交叉作用并放入模型中,比较由此产生的模型结果与最初的线性模型的结果。

  8. 如果你想要的解决方案更平滑,你可以应用径向基函数核(Kadial Basis function kernel) 。这就相当应用一个平滑转换。

  9. 如果你觉得你需要协变量(Covariates ),你可以应用多项式核,或者明确添加它们的协变量。

  10. 高基数特征:在预处理阶段,通过out-of-fold平均转换成数值变量。

3.两个变量组合而成的特征转换

以下为一些常见的由两个变量组合而成的特征转换:

  1. 加法转换

  2. 相对于基数的差值

  3. 乘法转换:交互效果

  4. 除法转换:缩放/归一化

  5. 对数值型特征设定阈值以获取其布尔值

  6. 笛卡儿积变换

  7. 特征向量积:所有特征的向量积

试想一个特征A,它有两个可能的值:{ A1,A2 } 。假设B是一个具有两种可能性{ B1,B2 }的另一特征。

那么, A和B之间的向量积(我们称之为AB)将采取以下值之一:

{ (A1 , B1),(A1 , B2),(A2 , B1),(A2 , B2) }

你基本上可以赋予这些”组合”你喜欢的任何名称。但要记住,每个组合都表示一个由A和B的相应值包含的信息之间的协同作用。

  1. 归一化/数据标准化变换
  • 在机器学习算法中提出的隐含假设(对朴素贝叶斯而言,在某种程度上是显性假设)之一是:该特征服从正态分布。不过,有时我们可能会发现该特征不遵循正态分布,而是对数正态分布。那么在这种情况下常见的手段之一是取特征值的对数(即表现出对数正态分布的那些特征值),使得它展现出正态分布。如果在使用中的算法做出了正态分布的隐含/显性假设的话,则这种转化,即将一个服从对数正态分布的特征转化为正态分布,可以帮助改善该算法的性能。
  1. 分位数分级转换 (Quantile Binning Transformation)
  2. 白化数据 (Whitening the Data)
  3. 窗体压缩化 (Windowing)

如果所有的点都分布在时间轴上,那么在同一个窗口里的先前的点往往包含丰富的信息。

  1. 最小-最大归一化:不一定保留顺序
  2. S型/正切/对数转换 (Sigmoid / Tanh / Log Transformations)
  3. 用特殊方法处理0:对于计数特征有可能很重要
  4. 去相关性/转换变量
  5. 重构数量
  6. 将不频繁的分类变量划分到新的/独立的类别中。
  7. 按顺序应用一系列转换。
  8. 独特的编码方式
  9. 靶值率编码 (Target rate encoding)
  10. 哈希技巧 (Hash Trick)

4.常见的多个变量的特征转换

以下为一些常见的多个变量的特征转换:

  1. 主成分分析 (PCA)

  2. 模型集成

  3. 压缩感知 (Compressed Sensing)

  4. “猜平均值”或是“猜通过变量X分段后的平均值”

  5. 处理映射(hack projection):

  6. 执行聚类(clustering)并使用点和聚类中心的距离作为一个特征

  7. 主成分分析/奇异值分解 (PCA/SVD)

    这是用来分析变量之间的相互关系和在信息损失最小的情况下执行降维的有效技术。找到透过数据中,拥有最大方差的轴。在下一个正交轴上重复该步骤,直到你用完了数据或维度。每个轴都代表着一个新特征。

39.稀疏编码(sparse coding)

选择基元:基于你能如何用一个基元来重建输入值和它有多稀疏来评估该基元;采取一些梯度步骤,以改进该评估。

  • 有效的稀疏编码算法
  • 深度自编码

40.随机森林:训练一部分决策树:使用每个叶子作为一个特征

原文:https://www.linkedin.com/pulse/feature-engineering-data-scientists-secret-sauce-ashish-kumar


http://chatgpt.dhexx.cn/article/mlCWZPpW.shtml

相关文章

机器学习——特征工程(3分钟的超详细介绍)

目录 1 什么是特征工程?2 数据预处理和特征处理2.1 数据预处理2.2 特征处理 3 特征降维3.0 什么是特征降维?3.1 特征选择3.2 线性降维3.2.1 主成分分析法(PCA)3.2.2 线性判别分析法(LDA) 1 什么是特征工程&…

机器学习之特征工程详解

特征工程是指使用专业的背景知识和技巧处理数据,使得特征能在机器学习算法上发生更好的作用的过程。更好的特征意味着更强的灵活性,只需简单模型就能得到更好的结果,因此,特征工程在机器学习中占有相当重要的地位,可以…

【特征工程】呕心之作——深度了解特征工程

【博客地址】:https://blog.csdn.net/sunyaowu315 【博客大纲地址】:https://blog.csdn.net/sunyaowu315/article/details/82905347 对数据分析、机器学习、数据科学、金融风控等感兴趣的小伙伴,需要数据集、代码、行业报告等各类学习资料&am…

python右键idel消失问题

由于先安装的是的python2.7,后来改用python3.4出现了idel不见的问题: cmd:regedit SystemFileAssociations 新建项: ‘.py’右侧键值不管,‘shell’,edit的键值均为‘Edit with IDLE’即可 将’command‘的键值设置…

分析及解决:虚拟机无法连接虚拟设备idel 0:1 问题

虚拟机无法连接虚拟设备 问题背景解决过程一次性永久解决方式 问题背景 在学习大数据集群开发的时候,按照要求需要配置多个使用Ubuntu操作系统的虚拟机组合集群:master,slave1,slave2。但在我按照要求配置好三个虚拟机后&#xf…

python的使用方法图解_python开发之IDEL(Python GUI)的使用方法图文详解

本文讲述了python开发之IDEL(Python GUI)的使用方法。分享给大家供大家参考,具体如下: 在安装完Python后,我们希望能够运用python GUI来运行一些我们编写的程序,那么Python GUI怎样用呢? 看完这篇blog,也…

python、idel、pycharm的安装使用

python的安装 Python 3的安装 idle的使用 Python安装的过程中默认自动安装了idle,idl是python自带的集成开发环境。 交互环境 如何启动idle 第一种,开始菜单所有应用点击idle 第二种,在搜索栏当中直接输入idle 集成开发环境PyCham…

在anaconda设置Python的IDEL编辑器

在电脑中安装了anaconda(如果没有,可参考博客),anaconda会自动安装Python,可是想要用Python的IDEL编辑器还不知道怎么弄。百度了下终于查找到了具体的设置方法。主要分为两步。 1、修改注册表中信息,将.py…

idel部署的问题

war和war exploded的区别 转载地址:https://blog.csdn.net/xlgen157387/article/details/56498938 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: 是选择war还是war exploded 这里首先看一下他们两个的区别:…

python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐

在了解python中的tkinter模块的时候,你需要了解一些tkinter的相关知识 下面是python的API文档中的一个简单例子: 1 import tkinter as tk2 3 class Application(tk.Frame):4 def __init__(self, masterNone):5 tk.Frame.__init__(self, mast…

解决idel连接mysql数据库报错问题

使用idel来连接mysql数据库时出现: Server returns invalid timezone. Need to set ‘serverTimezone’ property报错信息。 查询相关资料后发现,我们本地使用的idel连接mysql时,使用的时区有问题而导致的报错。 解决方式: 修…

VUE与IDEL解决跨域问题

前言 跨域是浏览器对ajax请求的限制 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对js施加的安全限制。(ajax可以) 同源策略:是指协议,域名,端囗都要相同…

Python在IDLE中实现清屏和更改IDEL的shell的背景颜色

文章目录 更改IDEL的shell背景颜色在IDEL中实现清屏 今天才开始打算自学Python,刚装好的Python,使用IDEL的时候,发现白色的背景是在很闪眼睛,属实顶不住,然后就去问度娘,找到了以下的更改IDEL中的背景颜色&…

python的idel下添加清屏功能

第一步:下载文件ClearWindow.py (该文件可以在文章末尾网盘下载)第二步:找到目录 E:\python\Lib\idlelib (这个目录为python安装路径,比如我的安装路径为e:\python)第三步:将下载好的…

python 中设置IDEL快捷键清屏

1.通过下面这个链接下载到自己电脑的本地https://bugs.python.org/file14303/ClearWindow.py 将这个文本的后缀改为ClearWindow.py拷贝ClearWindow.py文件,放在Python安装目录Python XXX\Lib\idlelib下面(XXX为你的python版本)。记事本打开Py…

idel打开Run Dashboard

前言 在我用RabbitMQ整合SpringCloud的时候,要看运行效果时。发现没有了Run Dashboard。 这时候才想起之前弹过提示,也由于奈何是个英语傻瓜,就没注意,看着提示打眼就关了。害 如下提示弹框 打开直接选择第一个显示Run Dashboar…

idel安装lombok插件安装

1、点击file,选择setting 2、搜索安装插件 3、安装插件后使用lombok&#xff0c;引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>4、在实体类上加上Data注解&#xff0c;会自动…

STM32G707HAL库配置串口DMA和IDEL空闲中断接收不定字长数据

STM32G070串口DMA&IDEL配置 0、概述 在配置STM32G070RBT6进行串口通信功能时&#xff0c;如果尝试开启空闲中断进行不定长数据接收时&#xff0c;串口一旦接收到数据&#xff0c;就会一直卡在串口中断&#xff0c;无法进行其他操作。配置空闲中断的方法是按照F系列的HAL库…

Idel中maven全局配置

每次创建新项目&#xff0c;都要配置一遍maven&#xff0c;实在是麻烦。 所以&#xff0c;想到是否可以全局配置呢。 在File - Settings里没有找到相关内容。 方法&#xff1a; 关闭项目&#xff0c;在Idea的启动界面&#xff0c;右下角有个 【Configure】&#xff0c;进入【…

layers.Normalization

标准化&#xff0c;就是执行 特征标准化层&#xff0c; 第一种方式&#xff1a;通过数据计算出均值和方差&#xff1a; adapt_data np.array([[0., 7., 4.],[2., 9., 6.],[0., 7., 4.],[2., 9., 6.]], dtypefloat32) input_data np.array([[0., 7., 4.]], dtypefloat32) l…