机器学习day2-特征工程

四.特征工程

1.概念

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

将任意数据(文本或图像等)转换为数字特征,对特征进行相关的处理

步骤:1.特征提取;2.无量纲化(预处理):归一化、标准化;3.降维:底方差过滤特征选择,主成分分析-PCA降维

2.特征工程API

①.实例化转换器对象

DictVectorizer      字典特征提取
CountVectorizer     文本特征提取
TfidfVectorizer     TF-IDF文本特征词的重要程度特征提取 
MinMaxScaler        归一化
StandardScaler      标准化
VarianceThreshold   底方差过滤降维
PCA                 主成分分析降维

②.fit,transform和fit_transform

fit:用于计算数据的统计信息,比如均值和标准差(在StandardScaler的情况下),这些统计信息随后会被用于预测出来的数据

transform:使用已经通过fit方法计算出的统计信息来转换数据。

fit_transform:两者结合,更高效

一旦scaler对象在X_train上被fit,它就已经知道了如何将数据标准化。

先fit_transform(x_train)然后再transform(x_text)

fit只用一次

# fit 和 transform 和fittransform 区别
from sklearn.preprocessing import StandardScaler,MinMaxScaler
import numpy as np
transfer=StandardScaler()
x=np.random.randint(100,size=(3,4))
print(x)
transfer.fit(x)#计算出均值和标准差
x=transfer.transform(x)
# x=transfer.fit_transform(x)
print(x)
x2=np.array([[10,20,30,40]])
x2=transfer.transform(x2)
​
print(x2)

3.DictVectorizer 字典列表特征提取

1.稀疏矩阵

一个矩阵中大部分元素为0,常见于大规模数据分析、图形学、自然语言处理、机器学习等领域

常用存储方式:①.三元组表 (Coordinate List, COO):三元组表就是一种稀疏矩阵类型数据,存储非零元素的行索引、列索引和值:

(行,列) 数据

(0,0) 10

(0,1) 20

(2,0) 90

(2,20) 8

(8,0) 70

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

②.压缩稀疏行 (CSR - Compressed Sparse Row):

  • CSR 格式将稀疏矩阵中的非零元素按行优先的方式存储。它使用了三个数组:

    • data:存储非零元素的值。

    • indices:存储data中每个元素的列索引。

    • indptr:存储每一行在dataindices数组中的起始位置。

  • CSR 格式非常适合快速地进行行访问和矩阵向量乘法。

③.压缩稀疏列 (CSC - Compressed Sparse Column):

  • CSC 格式类似于 CSR,但它是按列优先的方式来存储稀疏矩阵。同样也使用了三个数组:

    • data:存储非零元素的值。

    • indices:存储data中每个元素的行索引。

    • indptr:存储每一列在dataindices数组中的起始位置。

  • CSC 格式对于快速地进行列访问和某些类型的矩阵运算很有帮助。

④.字典 (Dictionary of Keys - DOK):

DOK 格式使用一个字典来存储非零元素,其中键是元素的位置(通常是元组 (row, column)),值是非零元素本身。

  • 这种格式适合于动态地增加或修改矩阵中的非零元素。

⑤.链表 (List of Lists - LIL):

  • LIL 格式使用两个列表来表示稀疏矩阵。其中一个列表包含每一行的非零元素,另一个列表包含了这些非零元素的列索引。

  • LIL 格式适合于构建稀疏矩阵,特别是当矩阵的结构在构建过程中发生变化时。

⑥.块稀疏行 (BSR - Block Sparse Row):

  • BSR 格式类似于 CSR,但它不是处理单个非零元素,而是处理固定大小的非零元素块。

  • 这种格式适用于那些非零元素倾向于形成小的密集子矩阵的情况。

2.非稀疏矩阵(稠密矩阵)

矩阵中的大部分元素都是非0的,矩阵的存储通常采用标准的二维数组形式。在数学计算、线性代数等通用计算领域更为常见。

3.API

创建转换器对象:

sklearn.feature_extraction.DictVectorizer(sparse=True)

DictVectorizer:字典向量化工具

参数:

sparse=True返回类型为csr_matrix的稀疏矩阵

sparse=False表示返回的是数组,数组可以调用.toarray()方法将稀疏矩阵转换为数组

转换器对象:

转换器对象调用fit_transform(data)函数,参数data为一维字典数组或一维字典列表,返回转化后的矩阵或数组

转换器对象get_feature_names_out()方法获取特征名

eg1.提取为稀疏矩阵对应的数组
# 字典列表特征提取
from sklearn.feature_extraction import DictVectorizer
import pandas   as pd
data=[{'city':'北京','money':38,"age":20},{'city':'上海','money':60,"age":29},{'city':'深圳','money':30,"age":32},{'city':'深圳','money':40,"age":49}]
# 初始化工具(字典变成向量的工具器)
model=DictVectorizer(sparse=False)#sparse是否转换成三元组形式
data=model.fit_transform(data)
# print(data,type(data))
# print(model.get_feature_names_out())#获取所有的特征名称
ddata=pd.DataFrame(data=data,columns=model.get_feature_names_out())
# print(ddata)
ddata
eg2.提取为稀疏矩阵
# 字典列表特征提取
from sklearn.feature_extraction import DictVectorizer
import pandas   as pd
data=[{'city':'北京','money':38,"age":20},{'city':'上海','money':60,"age":29},{'city':'深圳','money':30,"age":32},{'city':'深圳','money':40,"age":49}]
# 初始化工具(字典变成向量的工具器)
model=DictVectorizer(sparse=True)#sparse是否转换成三元组形式
data=model.fit_transform(data)
print(data,type(data))
arr=data.toarray()#把三元组(稀疏矩阵)转化为数组
print(arr)

4.CountVectorizer 文本特征提取

1.API

sklearn.feature_extraction.text.CountVectorizer

构造函数关键字参数stop_words,值为list,表示词的黑名单(不提取的词)

fit_transform函数的返回值为稀疏矩阵

eg3.英文文本提取
# CountVectorizer 文本特征提取
from sklearn.feature_extraction.text import CountVectorizer
corpus = ['I love machine learning. Its awesome.', 'Its a book amazon book', 'Amazon is book a great company']
# 创建一个词频提取对象
vectorizer = CountVectorizer(stop_words=[])
# 提取词频
x=vectorizer.fit_transform(corpus)
print(x)
print(x.toarray())
print(vectorizer.get_feature_names_out())
eg4.中文文本提取
! pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba
# CountVectorizer 中文本特征提取
from sklearn.feature_extraction.text import CountVectorizer
import jieba
import pandas as pd
# arr=list(jieba.cut("我爱北京天安门"))
# print(arr)
# str1=" ".join(arr)
# print(str1)
#传入的文本(没有断词的字符串) 用jieba分词工具转化为数据容器,然后再把数据容器中元素用空格连接成字符串
def my_cut(text):return " ".join(jieba.cut(text))
​
​
corpus = ["教育学会会长期间,坚定支持民办教育事业!",  "扶持民办,学校发展事业","事业做出重大贡献!"]
# # 创建一个词频提取对象
vectorizer = CountVectorizer(stop_words=[])
# 提取词频
data=[my_cut(el) for el in corpus]
print(data)
x=vectorizer.fit_transform(data)
print(x)
print(x.toarray())
print(vectorizer.get_feature_names_out())
​
ddata=pd.DataFrame(x.toarray(),columns=vectorizer.get_feature_names_out())
ddata

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

1.算法

词频(Term Frequency, TF), 表示一个词在当前篇文章中的重要性,是对词数的归一化

TF=某个词在文章中的出现次数/文章的总词数

逆文档频率(Inverse Document Frequency, IDF), 反映了词在整个文档集合中的稀有程度

IDF=lg((语料库的文档总数+1)/(包含该词的文档数+1))

TF-IDF=词频(TF)×逆文档频率(IDF)

2.API

sklearn.feature_extraction.text.TfidfVectorizer()

构造函数关键字参数stop_words,表示词特征黑名单

fit_transform函数的返回值为稀疏矩阵

eg5
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
import pandas as pd
def my_cut(text):return " ".join(jieba.cut(text))
data=["教育学会会长期间,坚定支持民办教育事业!",  "扶持民办,学校发展事业","事业做出重大贡献!"]
data=[my_cut(i) for i in data]
print(data)
transfer=TfidfVectorizer(stop_words=[])
res=transfer.fit_transform(data)
print(transfer.get_feature_names_out())
print(res.toarray())
ddata=pd.DataFrame(res.toarray(),columns=transfer.get_feature_names_out())
ddata

6.无量纲化-预处理

1.MinMaxScaler 归一化

2.归一化API

sklearn.preprocessing.MinMaxScaler(feature_range)

参数:feature_range=(0,1) 归一化后的值域,可以自己设定

fit_transform函数归一化的原始数据类型可以是list、DataFrame和ndarray, 不可以是稀疏矩阵

fit_transform函数的返回值为ndarray

eg6.归一化
from sklearn.preprocessing import MinMaxScaler
import pandas as   pd
scaler=MinMaxScaler(feature_range=(0,1))
data=pd.read_excel("./src/test2.xlsx")
print(data.values)
# arr=scaler.fit_transform(data.values)
arr=scaler.fit_transform(data)
print(arr)

鲁棒性较差

# 字典列表特征提取后的结果归一化
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing  import MinMaxScaler
import pandas   as pd
data=[{'city':'北京','money':38,"age":20},{'city':'上海','money':60,"age":29},{'city':'深圳','money':30,"age":32},{'city':'深圳','money':40,"age":49}]
# 初始化工具(字典变成向量的工具器)
model=DictVectorizer(sparse=True)#sparse是否转换成三元组形式
data=model.fit_transform(data)
# print(data,type(data))
arr=data.toarray()#把三元组(稀疏矩阵)转化为数组
print(arr)
arr_1=MinMaxScaler().fit_transform(arr)
arr_1

3.StandardScaler 标准化

4.标准化API

sklearn.preprocessing.StandardScale

与MinMaxScaler一样,原始数据类型可以是list、DataFrame和ndarray

fit_transform函数的返回值为ndarray, 归一化后得到的数据类型都是ndarray

eg7.标准化
from sklearn.preprocessing import StandardScaler
import numpy as np
# 初始化标准化工具
scaler = StandardScaler()
np.random.seed(7)
data=np.array([[1,2,3,4],[2,2,3,4],[3,2,3,4],[4,2,3,4]])
#np.random.randint(0,100,(30,4))
# print(data)
# 把data进行标准化
x=scaler.fit_transform(data)
print(x)

7.特征降维

降维:去掉一些特征或者将多个特征转化为少量个特征

在尽可能保留数据的重要信息上减少数据集维度,可以减少计算成本、去除噪声

方式:特征选择、主成份分析(PCA)

1.特征选择
①.VarianceThreshold 低方差过滤特征选择

计算方差-设定阈值-过滤特征

eg8
# 低方差过滤
from sklearn.feature_selection import VarianceThreshold
transfer=VarianceThreshold(threshold=0.01)
x=[[0,2,0,3],[0,1,4,3],[0,1,1,3]]
x=transfer.fit_transform(x)
print(x)

②.根据相关系数的特征选择

正相关性:一个变量增加通常伴随着另一个变量的增加。ρ=1,完全正相关

负相关性:一个变量减少通常伴随着另一个变量的减少。ρ=-1,完全负相关

不相关:两者的相关性很小,一个变量变化不会引起另外的变量变化。ρ=0,不存在线性关系

! pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scipy

皮尔逊相关系数(Pearson correlation coefficient)是一种度量两个变量之间线性相关性的统计量。它提供了两个变量间关系的方向(正相关或负相关)和强度的信息,取值范围是 [−1,1]。绝对值越大,表示越相关,当两特征完全相关时,两特征的值表示的向量是在同一条直线上,当两特征的相关系数绝对值很小时,两特征值表示的向量接近在同一条直线上。当相关系值为负数时,表示负相关

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

API:

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

返回对象有两个属性:

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

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

from scipy.stats import pearsonr
import numpy as np
x1=[1,2,3,4,5]
y=[2,4,6,8,10]
r=pearsonr(x1,y)
print(r.statistic,r.pvalue)

2.主成份分析(PCA)

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

保留信息/丢失信息=信息保留的比例

步骤:得到矩阵-用矩阵P对原始数据进行线性变换,得到新的数据矩阵Z-根据主成分的方差等,确定最终保留的主成分个数,留下方差大的

API

from sklearn.decomposition import PCA

PCA(n_components=None)

n_components:

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

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

    eg9
#特征降维 减少到多少特征
from sklearn.decomposition import PCA
data=[[2,8,4,5],[6,3,0,8],[5,4,9,1]]
pca=PCA(n_components=2)
data=pca.fit_transform(data)
print(data)

#特征降维
from sklearn.decomposition import PCA
import numpy as np
data=np.random.rand(5,100)#5条数据,100个特征量
#print(data)
pca=PCA(n_components=0.8)
data=pca.fit_transform(data)
print(data.shape,data)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/59779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 - 为 Jupyter Notebook 安装新的 Kernel

https://ipython.readthedocs.io/en/latest/install/kernel_install.html 当使用jupyter-notebook --no-browser 启动一个 notebook 时&#xff0c;默认使用了该 jupyter module 所在的 Python 环境作为 kernel&#xff0c;比如 C:\devel\Python\Python311。 如果&#xff0c…

w038基于SpringBoot的网上租赁系统设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

【AI图像生成网站Golang】JWT认证与令牌桶算法

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 三、JWT认证与令牌桶算法 在现代后端开发中&#xff0c;用户认证和接口限流是确保系统安全性和性能的两大关键要素…

【PS】蒙版与通道

内容1&#xff1a; 、选择蓝色通道并复制&#xff0c;对复制的蓝色通道ctrli进行反向选择&#xff0c;然后ctrll调整色阶。 、选择载入选区&#xff0c;然后点击rgb。 、点击蒙版 、点击云彩图层调整位置 、点击色相/饱和度&#xff0c;适当调整 、最后使用滤镜等功能添加光圈…

树莓派4B Qt+FFMPEG 多线程录制USB相机mjpeg数据流“h264_omx“硬件编码的MP4文件

文章目录 1 前言2 一些问题说明2.0 树莓派4b系统版本2.1 Qt2.2 FFMPEG2.3 图像格式 3 核心代码3.0 代码逻辑3.1 pro文件3.2 avframequeue.cpp3.3 decodethread.cpp 4 资源下载 1 前言 本项目为在树莓派4B开发板上&#xff0c;通过QtFFMPEG以多线程分别解码、编码USB摄像头视频数…

i春秋-Hash(__wakeup沉默、序列化)

练习平台地址 竞赛中心 题目描述 题目内容 啥也没有就一个标签跳转 点击后的确发生了跳转 观察到url中有key和hash两个值&#xff0c;猜测hash是key的hash 查看源代码发现确实是 $hashmd5($sign.$key);the length of $sign is 8 解密得到$sign应该为kkkkkk01 构造122的hash i…

【C语言指南】C语言内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 引言 C语言是一种强大而灵活的编程语言&#xff0c;为程序员提供了对内存的直接控制能力。这种对内存…

解决vue3+ts打包项目时会生成map文件

在正常未配置的情况下使用npm run build 命令打包&#xff0c;会生成很多的js和map文件,map文件是为了方便我们在生产环境进行更友好的代码调试&#xff0c;但是这样就存一个安全问题&#xff1b;容易被攻击&#xff1b; 解决方法&#xff1a;在package.json文件&#xff0c;重…

MySQL:表设计

表的设计 从需求中获得类&#xff0c;类对应到数据库中的实体&#xff0c;实体在数据库中表现为一张一张的表&#xff0c;类中的属性就对应着表中的字段&#xff08;也就是表中的列&#xff09; 表设计的三大范式&#xff1a; 在数据库设计中&#xff0c;三大范式&#xff0…

使用 Azure OpenAI 服务对数据进行联合 SharePoint 搜索

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 Azure OpenAI 服务处理你的数据&#xff0c;并使用 Elastic 作为向量数据库。 在本文中&#xff0c;我们将探索 Azure OpenAI 服务 “On Your Data”&#xff0c;使用 Elasticsearch 作为数据源。我们将使用 Elastic Shar…

chat2db调用ollama实现数据库的操作。

只试了mysql的调用。 其它的我也不用&#xff0c;本来想充钱算了。最后一看单位是美刀。就放弃了这分心。于是折腾了一下。 本地运行chat2db 及chat2db ui https://gitee.com/ooooinfo/Chat2DB clone 后运行起来 chat2db的java端&#xff0c;我现在搞不清这一个项目是有没有…

【搜狐简单AI-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

微服务day09

DSL查询 快速入门 GET /items/_search {"query": {"match_all": {}} } 叶子查询 GET /items/_search {"query": {"match_all": {}} }GET /items/_search {"query": {"multi_match": {"query": "脱…

Linux驱动开发第2步_“物理内存”和“虚拟内存”的映射

“新字符设备的GPIO驱动”和“设备树下的GPIO驱动”都要用到寄存器地址&#xff0c;使用“物理内存”和“虚拟内存”映射时&#xff0c;非常不方便&#xff0c;而pinctrl和gpio子系统的GPIO驱动&#xff0c;非常简化。因此&#xff0c;要重点学习pinctrl和gpio子系统下的GPIO驱…

force stop和pm clear的区别

前言&#xff1a;因为工作中遇到force stop和pm clear进程后&#xff0c;进程不能再次挂起&#xff0c;谷歌系统共性问题&#xff0c;服务类应用经清缓存后当下服务就会挂掉&#xff0c;需要系统重启才能恢复。为了更好的“丢锅”&#xff0c;需要进一步学习force stop和pm cle…

【大数据学习 | flume】flume Sink Processors与拦截器Interceptor

1. Failover Sink Processor 故障转移处理器可以同时指定多个sink输出&#xff0c;按照优先级高低进行数据的分发&#xff0c;并具有故障转移能力。 需要修改第一台服务器agent a1.sourcesr1 a1.sinksk1 k2 a1.channelsc1 a1.sources.r1.typenetcat a1.sources.r1.bindworker…

如何从头开始构建神经网络?(附教程)

随着流行的深度学习框架的出现&#xff0c;如 TensorFlow、Keras、PyTorch 以及其他类似库&#xff0c;学习神经网络对于新手来说变得更加便捷。虽然这些框架可以让你在几分钟内解决最复杂的计算任务&#xff0c;但它们并不要求你理解背后所有需求的核心概念和直觉。如果你知道…

Conda安装与使用中的若干问题记录

Conda安装与使用中的若干问题记录 1.Anaconda 安装失败1.1.问题复述1.2.问题解决&#xff08;安装建议&#xff09; 2.虚拟环境pip install未安装至本虚拟环境2.1.问题复述2.2.问题解决 3.待补充 最近由于工作上的原因&#xff0c;要使用到Conda进行虚拟环境的管理&#xff0c;…

『OpenCV-Python』视频的读取和保存

点赞 + 关注 + 收藏 = 学会了 推荐关注 《OpenCV-Python专栏》 上一讲介绍了 OpenCV 的读取图片的方法,这一讲简单聊聊 OpenCV 读取和保存视频。 视频的来源主要有2种,一种是本地视频文件,另一种是实时视频流,比如手机和电脑的摄像头。 要读取这两种视频的方法都是一样的…

字节青训-字符串字符类型排序问题、小C点菜问题

目录 一、字符串字符类型排序问题 题目 样例 输入&#xff1a; 输出&#xff1a; 输入&#xff1a; 输出&#xff1a; 输入&#xff1a; 输出&#xff1a; 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; ​…