当前位置: 首页 > news >正文

16day-人工智学习-机器学习-特征工程

一、特征工程

特征工程:就是对特征进行相关的处理

一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程

特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。

1.1 特征工程步骤

  • 特征提取, 如果不是像dataframe那样的数据,要进行特征提取,比如字典特征提取,文本特征提取

  • 无量纲化(预处理)

    • 归一化

    • 标准化

  • 降维

    • 底方差过滤特征选择

    • 主成分分析-PCA降维

1.2 特征工程API

讲api前,先认识一下

稀疏矩阵:稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。由于稀疏矩阵中零元素非常多,存储和处理稀疏矩阵时,通常会采用特殊的存储格式,以节省内存空间并提高计算效率。

三元组表 :三元组表就是一种稀疏矩阵类型数据,存储非零元素的行索引、列索引和值:

(行,列) 数据

(0,0) 10

(0,1) 20

(2,0) 90

(2,20) 8

(8,0) 70

表示除了列出的有值, 其余全是0。

非稀疏矩阵(稠密矩阵):

非稀疏矩阵,或称稠密矩阵,是指矩阵中非零元素的数量与总元素数量相比接近或相等,也就是说矩阵中的大部分元素都是非零的。

1.2.1 DictVectorizer 字典列表特征提取

from sklearn.feature_extraction import DictVectorizer
data = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33, 'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]
#创建DictVectorizer对象
transfer = DictVectorizer(sparse=False)
data_new = transfer.fit_transform(data)
# data_new的类型为ndarray
#特征数据
print("data_new:\n", data_new)
#特征名字 
print("特征名字:\n", transfer.get_feature_names_out())

1.2.2 CountVectorizer 文本特征提取

from sklearn.feature_extraction.text import CountVectorizer
data=["stu is well, stu is great", "You like stu"]
#创建转换器对象, you和is不提取
transfer = CountVectorizer(stop_words=["you","is"])
#进行提取,得到稀疏矩阵
data_new = transfer.fit_transform(data).toarray()
print(data_new)
# [[1 0 2 1]
#  [0 1 1 0]]
print(transfer.get_feature_names_out())
# ['great' 'like' 'stu' 'well']
# 怎么看呢?下面的是提取的单词,上面的数组表示的是:
# 第一行第一列是great单词在这个句子里面出现了几次,后面的同理

1.2.3 TfidfVectorizer TF-IDF文本特征词的重要程度特征提取

TF:词频,就是在文中出现的次数

IDF:逆文档频率, 反映了词在整个文档集合中的稀有程度

首先就是为什么这两个参数能够反映对文章分类的重要,TF越大是不是越能说明,这个词对文章的重要程度,但是并不是所有的都能反映,比如的和我,他这种是是不是出现的频率很高,但是它并不能反映,所以就有了IDF,越是普遍的词,分母是不是越大,然后IDF就越小,两个一乘是不是就起到了约束作用。

1.3 无量纲化-预处理

无量纲就是没有单位的数据,我们为什么要处理数据的单位呢?

先看看下面的数据:

是不是通过算他们的距离就能看出他们的差别了,

这里的身高影响很小,但这显然是不可能的,比如我将收入的单位换成万元,这又有了很大的影响,我不可能每次都去换算一下合适单位涩,有没有什么方式能统一数据的。

1.3.1 MInMaxScaler 归一化

通过对原始数据进行变换把数据映射到指定区间(默认为0-1)

x为最大值的时候是不是为1,x为最小值的时候是不是就为0了,所以就将范围缩小到了0-1

 这么归一化后的数据是不是就能反映他们的差距了。

from sklearn.preprocessing import MinMaxScaler
data=[[12,22,4],[22,23,1],[11,23,9]]
#feature_range=(0, 1)表示归一化后的值域,可以自己设定
transfer = MinMaxScaler(feature_range=(0, 1))
#data_new的类型为<class 'numpy.ndarray'>
data_new = transfer.fit_transform(data)
print(data_new)

但是归一化有个缺点,就是当有那种极值出现时,会影响到数据,比如假如统计一些人的钱的时候,里面有老马的数据,这谁可以比,通过归一化的数据,我们的钱可能都要接近0了,所以鲁棒性较差。所以常使用标准化的无量钢化。

1.3.2 normalize 归一化

from sklearn.preprocessing import normalize
normalize(data, norm='l2', axis=1)
#data是要归一化的数据
#norm是使用那种归一化:"l1"  "l2"  "max
#axis=0是列  axis=1是行
<1> L1归一化

绝对值相加作为分母,特征值作为分子

<2> L2归一化

平方相加作为分母,特征值作为分子

<3> max归一化

max作为分母,特征值作为分子

1.3.3 StandardScaler 标准化

它的目的是将不同特征的数值范围缩放到统一的标准范围,以便更好地适应一些机器学习算法,特别是那些对输入数据的尺度敏感的算法。

z就是标准化后的数据,u就是所有单个特征的数据的平均值,σ是该特征的标准差。

和前面的api用法很相似。

from sklearn.preprocessing import StandardScaler
transfer = StandardScaler()
data_new = transfer.fit_transform(data) #data_new的类型为ndarray

1.4 特征降维

实际数据中,有时候特征很多,会增加计算量,降维就是去掉一些特征,或者转化多个特征为少量个特征

特征降维其目的:是减少数据集的维度,同时尽可能保留数据的重要信息。

特征降维的好处:

减少计算成本:在高维空间中处理数据可能非常耗时且计算密集。降维可以简化模型,降低训练时间和资源需求。

去除噪声:高维数据可能包含许多无关或冗余特征,这些特征可能引入噪声并导致过拟合。降维可以帮助去除这些不必要的特征。

特征降维的方式:

  • 特征选择

    • 从原始特征集中挑选出最相关的特征

  • 主成份分析(PCA)

    • 主成分分析就是把之前的特征通过一系列数学计算,形成新的特征,新的特征数量会小于之前特征数量

1.4.1 特征选择

(a) VarianceThreshold 低方差过滤特征选择

求特征的方差。然后小于自己设置的阈值的就去掉

  • 如果一个特征的方差很小,说明这个特征的值在样本中几乎相同或变化不大,包含的信息量很少,模型很难通过该特征区分不同的对象,比如区分甜瓜子和咸瓜子还是蒜香瓜子,如果有一个特征是长度,这个特征相差不大可以去掉。
    • 过滤特征:移除所有方差低于设定阈值的特征

    • 设定阈值:选择一个方差阈值,任何低于这个阈值的特征都将被视为低方差特征。

    • 计算方差:对于每个特征,计算其在训练集中的方差(每个样本值与均值之差的平方,在求平均)。


from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris# 获取数据
x,y = load_iris(return_X_y=True)
print(x)
# 创建对象,准备把方差为等于小于2的去掉,threshold的缺省值为2.0
variance = VarianceThreshold(threshold=2.0)
# 把x中低方差特征去掉, x的类型可以是DataFrame、ndarray和list
x = variance.fit_transform(x)
# fit_transform函数的返回值为ndarray
print(x)
(b) 根据相关系数的特征选择

<1>理论

正相关性(Positive Correlation)是指两个变量之间的一种统计关系,其中一个变量的增加通常伴随着另一个变量的增加,反之亦然。在正相关的关系中,两个变量的变化趋势是同向的。当我们说两个变量正相关时,意味着:

  • 如果第一个变量增加,第二个变量也有很大的概率会增加。

  • 同样,如果第一个变量减少,第二个变量也很可能会减少。

正相关性并不意味着一个变量的变化直接引起了另一个变量的变化,它仅仅指出了两个变量之间存在的一种统计上的关联性。这种关联性可以是因果关系,也可以是由第三个未观察到的变量引起的,或者是纯属巧合。

在数学上,正相关性通常用正值的相关系数来表示,这个值介于0和1之间。当相关系数等于1时,表示两个变量之间存在完美的正相关关系,即一个变量的值可以完全由另一个变量的值预测。

举个例子,假设我们观察到在一定范围内,一个人的身高与其体重呈正相关,这意味着在一般情况下,身高较高的人体重也会较重。但这并不意味着身高直接导致体重增加,而是可能由于营养、遗传、生活方式等因素共同作用的结果。

负相关性(Negative Correlation)与正相关性刚好相反,但是也说明相关,比如运动频率和BMI体重指数程负相关

不相关指两者的相关性很小,一个变量变化不会引起另外的变量变化,只是没有线性关系. 比如饭量和智商

皮尔逊相关系数(Pearson correlation coefficient)是一种度量两个变量之间线性相关性的统计量。它提供了两个变量间关系的方向(正相关或负相关)和强度的信息。皮尔逊相关系数的取值范围是 [−1,1],其中:

  • \rho=1 表示完全正相关,即随着一个变量的增加,另一个变量也线性增加。

  • \rho=-1 表示完全负相关,即随着一个变量的增加,另一个变量线性减少。

  • \rho=0 表示两个变量之间不存在线性关系。

相关系数\rho的绝对值为0-1之间,绝对值越大,表示越相关,当两特征完全相关时,两特征的值表示的向量是

在同一条直线上,当两特征的相关系数绝对值很小时,两特征值表示的向量接近在同一条直线上。当相关系值为负数时,表示负相关

<2>皮尔逊相关系数:pearsonr相关系数计算公式, 该公式出自于概率论

对于两组数据 𝑋={𝑥1,𝑥2,...,𝑥𝑛} 和 𝑌={𝑦1,𝑦2,...,𝑦𝑛},皮尔逊相关系数可以用以下公式计算:

\rho=\frac{\operatorname{Cos}(x, y)}{\sqrt{D x} \cdot \sqrt{D y}}=\frac{E[(x_-E x)(y-E y)]}{\sqrt{D x} \cdot \sqrt{D y}}=\frac{\sum_{i=1}^{n}(x-\tilde{x})(y-\bar{y}) /(n-1)}{\sqrt{\sum_{i=1}^{n}(x-\bar{x})^{2} /(n-1)} \cdot \sqrt{\sum_{i=1}^{n}(y-\bar{y})^{2} /(n-1)}}

\bar{x}和 \bar{y} 分别是𝑋和𝑌的平均值

|ρ|<0.4为低度相关; 0.4<=|ρ|<0.7为显著相关; 0.7<=|ρ|<1为高度相关

<3>api:

scipy.stats.personr(x, y) 计算两特征之间的相关性

返回对象有两个属性:

statistic皮尔逊相关系数[-1,1]

pvalue零假设(了解),统计上评估两个变量之间的相关性,越小越相关

开发中一般不使用求相关系数的方法,一般使用主成分分析,因为主成分分样过程中就包括了求相关系数了。

2.主成份分析(PCA)

几个特征就是几维的,然后pca的原理是,将每一个维度分成一个主成分,然后每一个样本就是一个方向,将这个方向的值,分解到每一个主成分上,然后求出每一个主成分上的方差,越大的越好,比如二维的分为x,y然后每个点对应着坐标轴是有投影的。

PCA的核心目标是从原始特征空间中找到一个新的坐标系统,使得数据在新坐标轴上的投影能够最大程度地保留数据的方差,同时减少数据的维度。

特征1-X1特征2-X2
-1-2
-10
00
21
01

降维后新的数据为

特征3-X0
-3/√2
-1/√2
0
3/√2
-1/√2
api
  • from sklearn.decomposition import PCA

  • PCA(n_components=None)

    • 主成分分析

    • n_components:

      • 实参为小数时:表示降维后保留百分之多少的信息

        • 选择排名靠前的主成分,使得这些主成分的标准差(或方差)之和占所有主成分总标准差(或方差)之和的比例达到 80% 以上

      • 实参为整数时:表示减少到多少特征

        • 排名靠前的

(3)示例-n_components为小数
from sklearn.decomposition import PCA
def pca_demo():data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]# 1、实例化一个转换器类, 降维后还要保留原始数据0.95%的信息, 最后的结果中发现由4个特征降维成2个特征了transfer = PCA(n_components=0.95)# 2、调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return None
pca_demo()
data_new:[[-3.13587302e-16  3.82970843e+00][-5.74456265e+00 -1.91485422e+00][ 5.74456265e+00 -1.91485422e+00]]
(4)示例-n_components为整数
from sklearn.decomposition import PCA
def pca_demo():data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]# 1、实例化一个转换器类, 降维到只有3个特征transfer = PCA(n_components=3)# 2、调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return None
pca_demo()
data_new:[[-3.13587302e-16  3.82970843e+00  4.59544715e-16][-5.74456265e+00 -1.91485422e+00  4.59544715e-16][ 5.74456265e+00 -1.91485422e+00  4.59544715e-16]]

http://www.dtcms.com/a/315345.html

相关文章:

  • 【世纪龙科技】虚拟技术助力职教汽车自动变速器拆装虚拟实训软件
  • RFID技术在汽车倍速链中的应用:驱动智能制造的隐形引擎
  • Windows/Linux入侵排查
  • CPP学习之多态
  • Python高频元素分析技术:高效找出序列中出现次数最多的元素
  • 【Unity3D实例-功能-镜头】第三人称视觉
  • FeiQ飞秋安装教程:FeiQ.1060559168 详细安装步骤(附注意事项)​
  • 【QT】常⽤控件详解(三)常用按钮控件PushButton RadioButton CheckButton Tool Button
  • 茗鹤工业低代码可视化技术开发平台
  • 网络相关命令
  • 全国计算机二级C语言二级考试通关笔记
  • 风光储并网协同运行simulink仿真模型实现
  • [找出字符串中第一个匹配项的下标]
  • MiDSS复现
  • Codeforces Round 1010 (Div. 2, Unrated)
  • 8.4IO进程线程——进程
  • MySQL 基本操作入门指南
  • 代码随想录day55图论5
  • 通往L4之路:构建自我进化的智能驾驶决策大脑
  • Dubbo 3.x源码(32)—Dubbo Provider处理服务调用请求源码
  • CSS 安卓应用卸载碎片化动画效果
  • pyqt5-tools/pyqt6-tools 安装失败,解决办法
  • 【秋招笔试】2025.08.03虾皮秋招笔试-第三题
  • 7.2 I/O接口 (答案见原书 P305)
  • 大模型部署、nvidia-smi、token数
  • Java项目:基于SSM框架实现的商铺租赁管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告+任务书+远程部署】
  • pytorch 学习笔记3-利用框架内网络训练糖尿病数据集
  • Linux 使用 firewalld :开放端口与常用操作指南
  • Endpoint(端点)详解
  • ROS2机器人编程新书推荐-2025-精通ROS 2机器人编程:使用ROS 2进行复杂机器人的设计、构建、仿真与原型开发(第四版)