首页 > 其他分享 >11.12机器学习_特征工程

11.12机器学习_特征工程

时间:2024-11-14 20:19:13浏览次数:3  
标签:机器 fit transfer 11.12 transform 学习 矩阵 new data

四 特征工程

1 特征工程概念

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

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

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

特征工程步骤为:

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

  • 无量纲化(预处理)

    • 归一化
    • 标准化
  • 降维

    • 底方差过滤特征选择

    • 主成分分析-PCA降维

2 特征工程API

  • 实例化转换器对象,转换器类有很多,都是Transformer的子类, 常用的子类有:

    DictVectorizer  	字典特征提取
    CountVectorizer 	文本特征提取
    TfidfVectorizer 	TF-IDF文本特征词的重要程度特征提取 
    MinMaxScaler 		归一化
    StandardScaler 		标准化
    VarianceThreshold 	底方差过滤降维
    PCA  				主成分分析降维
    
  • 转换器对象调用fit_transform()进行转换, 其中fit用于计算数据,transform进行最终转换

    fit_transform()可以使用fit()和transform()代替

    data_new = transfer.fit_transform(data)
    可写成
    transfer.fit(data)
    data_new = transfer.transform(data)
    

3 DictVectorizer 字典列表特征提取

稀疏矩阵

稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。在数学和计算机科学中,当一个矩阵的非零元素数量远小于总的元素数量,且非零元素分布没有明显的规律时,这样的矩阵就被认为是稀疏矩阵。例如,在一个1000 x 1000的矩阵中,如果只有1000个非零元素,那么这个矩阵就是稀疏的。

由于稀疏矩阵中零元素非常多,存储和处理稀疏矩阵时,通常会采用特殊的存储格式,以节省内存空间并提高计算效率。

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

(行,列) 数据

(0,0) 10

(0,1) 20

(2,0) 90

(2,20) 8

(8,0) 70

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

非稀疏矩阵(稠密矩阵)

非稀疏矩阵,或称稠密矩阵,是指矩阵中非零元素的数量与总元素数量相比接近或相等,也就是说矩阵中的大部分元素都是非零的。在这种情况下,矩阵的存储通常采用标准的二维数组形式,因为非零元素密集分布,不需要特殊的压缩或优化存储策略。

  • 存储:稀疏矩阵使用特定的存储格式来节省空间,而稠密矩阵使用常规的数组存储所有元素,无论其是否为零。
  • 计算:稀疏矩阵在进行计算时可以利用零元素的特性跳过不必要的计算,从而提高效率。而稠密矩阵在计算时需要处理所有元素,包括零元素。
  • 应用领域:稀疏矩阵常见于大规模数据分析、图形学、自然语言处理、机器学习等领域,而稠密矩阵在数学计算、线性代数等通用计算领域更为常见。

在实际应用中,选择使用稀疏矩阵还是稠密矩阵取决于具体的问题场景和数据特性。

(1) api

  • 创建转换器对象:

    sklearn.feature_extraction.DictVectorizer(sparse=True)

    参数:

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

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

  • 转换器对象:

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

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

(2)示例1 提取为稀疏矩阵对应的数组

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())
data_new:
 [[ 30.   0.   1.   0. 200.]
  [ 33.   0.   0.   1.  60.]
  [ 42.   1.   0.   0.  80.]]
特征名字:
 ['age' 'city=北京' 'city=成都' 'city=重庆' 'temperature']
import pandas
pandas.DataFrame(data_new, columns=transfer.get_feature_names_out())

在这里插入图片描述

(3)示例2 提取为稀疏矩阵

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=True)
data_new = transfer.fit_transform(data)
#data_new的类型为<class 'scipy.sparse._csr.csr_matrix'>
print("data_new:\n", data_new)
#得到特征 
print("特征名字:\n", transfer.get_feature_names_out())

其中(row,col)数据中的col表示特征, 本示例中0表示 ‘age’, 1表示‘city=北京’,……

data_new:
  (0, 0)	30.0
  (0, 2)	1.0
  (0, 4)	200.0
  (1, 0)	33.0
  (1, 3)	1.0
  (1, 4)	60.0
  (2, 0)	42.0
  (2, 1)	1.0
  (2, 4)	80.0
特征名字:
 ['age' 'city=北京' 'city=成都' 'city=重庆' 'temperature']

(4)稀疏矩阵转为数组

稀疏矩阵对象调用toarray()函数, 得到类型为ndarray的二维稀疏矩阵

4 CountVectorizer 文本特征提取

(1)API

sklearn.feature_extraction.text.CountVectorizer

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

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

(2) 英文文本提取

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
data=["stu is well, stu is great", "You like stu"]
#创建转换器对象, you和is不提取
transfer = CountVectorizer(stop_words=["you","is"])
#进行提取,得到稀疏矩阵
data_new = transfer.fit_transform(data)
print(data_new)

import pandas
pandas.DataFrame(data_new.toarray(), 
                 index=["第一个句子","第二个句子"],
                 columns=transfer.get_feature_names_out())

(3) 中文文本提取

a.中文文本不像英文文本,中文文本文字之间没有空格,所以要先分词,一般使用jieba分词.

b.下载jieba组件, (不要使用conda)

在这里插入图片描述

c.jieba的基础

import jieba
data = "在如今的互联网世界,正能量正成为澎湃时代的大流量"
data = jieba.cut(data)
data = list(data)
print(data) #['在', '如今', '的', '互联网', '世界', ',', '正', '能量', '正', '成为', '澎湃', '时代', '的', '大', '流量']
data = " ".join(data)
print(data) #"在 如今 的 互联网 世界 , 正 能量 正 成为 澎湃 时代 的 大 流量"

使用jieba封装一个函数,功能是把汉语字符串中进行分词(会忽略长度小于等于1的词语,因为它们往往缺乏语义信息,不能很好地表达文本的特征)

import jieba
def cut(text):
    return " ".join(list(jieba.cut(text)))
    
data = "在如今的互联网世界,正能量正成为澎湃时代的大流量"
data = cut(data)
print(data) #"在 如今 的 互联网 世界 , 正 能量 正 成为 澎湃 时代 的 大 流量"

完整终合示例

import jieba
from sklearn.feature_extraction.text import CountVectorizer

def cut(text):
    return " ".join(list(jieba.cut(text)))

data = ["教育学会会长期间坚定支持民办教育事业!","热忱关心、扶持民办学校发展","事业做出重大贡献!"]
data_new = [cut(v) for v in data]

transfer = CountVectorizer(stop_words=['期间', '做出']) 
data_final = transfer.fit_transform(data_new)

print(data_final.toarray())#把非稀疏矩阵转变为稀疏矩阵
print(transfer.get_feature_names_out())#

import pandas as pd
pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())

在这里插入图片描述

import pandas
mylist = []
for i in range(len(data)):
    print("第"+str(i)+"名")
    mylist.append("第"+str(i)+"句")
  
pandas.DataFrame(data_final.toarray(), index=mylist, columns=transfer.get_feature_names_out())

在这里插入图片描述

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

(1) 算法

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

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

在这里插入图片描述

(2) API

sklearn.feature_extraction.text.TfidfVectorizer()

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

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

(3) 示例

代码与CountVectorizer的示例基本相同,仅仅把CountVectorizer改为TfidfVectorizer即可

示例中data是一个字符串list, list中的第一个元素就代表一篇文章.

import jieba
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

def cut_words(text):
    return " ".join(list(jieba.cut(text)))

data = ["教育学会会长期间,坚定支持民办教育事业!",  "扶持民办,学校发展事业","事业做出重大贡献!"]
data_new = [cut_words(v) for v in data]

transfer = TfidfVectorizer(stop_words=['期间', '做出',"重大贡献"]) 
data_final = transfer.fit_transform(data_new)

pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())

在这里插入图片描述

from sklearn.feature_extraction.text import CountVectorizer

transfer = CountVectorizer(stop_words=['期间', '做出',"重大贡献"]) 
data_final = transfer.fit_transform(data_new)

pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())

在这里插入图片描述

6 无量纲化-预处理

无量纲,即没有单位的数据

无量纲化包括"归一化"和"标准化", 为什么要进行无量纲化呢?

这是一个男士的数据表:

编号id身高 h收入 s体重 w
11.75(米)15000(元)120(斤)
21.5(米)16000(元)140(斤)
31.6(米)20000(元)100(斤)

假设算法中需要求它们之间的欧式距离, 这里以编号1和编号2为示例:

L = ( 1.75 − 1.5 ) 2 + ( 15000 − 16000 ) 2 + ( 120 − 140 ) 2 L = \sqrt{(1.75-1.5)^2+(15000-16000)^2+(120-140)^2} L=(1.75−1.5)2+(15000−16000)2+(120−140)2

从计算上来看, 发现身高对计算结果没有什么影响, 基本主要由收入来决定了,但是现实生活中,身高是比较重要的判断标准. 所以需要无量纲化.

(1) MinMaxScaler 归一化

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

<1>归一化公式:

这里的

标签:机器,fit,transfer,11.12,transform,学习,矩阵,new,data
From: https://blog.csdn.net/gs1we1/article/details/143723290

相关文章

  • Vue学习记录04
    计算属性模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象:constauthor=reactive({name:'JohnDoe',books:['Vue2-AdvancedGuide','Vue3-BasicGuide'......
  • 轻松掌握Spring:快速入门指南 (免费学习!!!)
    目录一、Spring简单介绍二、Java反射机制三、SpringIOC机制3.1使用构造器来实例化Bean3.2使用静态工厂实例化Bean3.3使用实例工厂来实例化Bean3.4SpringIOC实现原理3.5SpringBean的作用域四、SpringAOP机制4.1相关概念4.2利用proxy实现AOP功能4.3利用......
  • 动手学深度学习70 BERT微调
    1.BERT微调2.自然语言推理数据集3.BERT微调代码4.QA910,一般不固定,固定参数可以使训练速度加快,可以尝试11应该能12本身很快+技术细节–>精度高13bert一般可以用工具转成c++开销大。考虑怎么提升bert性能。14设备性能不高,可以用蒸馏bert。模型中有......
  • 自学习python之字符串2
    字符串:格式化format()方法1.位置参数(字段)2.关键字参数(相当于变量赋值)如果位置参数和关键字参数结合使用时,位置参数必须在关键字参数前面,否则报错打印花括号 格式化符号1.字符串格式化符号含义2.格式化操作符辅助命令m.n:主要是.n,m一般没用3.字......
  • 用两行命令快速搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),包含完整的
    深度学习环境的配置过于繁琐,所以我制作了两个基础的镜像,希望可以帮助大家节省时间,你可以选择其中一种进行安装,版本说明:base版本基于pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel,默认python版本为3.11.10,可以通过condainstallpython==版本号直接修改版本。dl版......
  • 前端技术中对表格元素的学习
    表格元素目录表格元素rowspan(行合并)colspan(列合并)注意事项在HTML中,<table>表格元素允许你通过特定的属性来合并单元格。这通常用于创建更复杂的表格布局,比如跨越多行或多列的标题或数据。合并单元格可以通过rowspan和colspan属性来实现。rowspan(行合并)rowspan属性用于合并垂......
  • 自动化测试学习之接口测试
    在我们学习接口测试之前首先需要知道两点,什么是接口?HTTP协议的请求过程和请求方法?一、什么是接口?接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你......
  • java学习记录06
    正则表达式匹配规则对于正则表达式来说,它只能精确匹配字符串。例如:正则表达式“abc",只能匹配”abc",不能匹配“ab","Abc","abcd"等其他字符串。如果想匹配非ASCII字符,例如中文,那么就用\u####的十六进制表示,例如:a\u548cc匹配的是字符串"a和c",中文字符和的Unicode编码是548c......
  • java学习记录05
    Object类通用方法Object类是所有类的超类。如果在类声明中没有使用extends关键字明确指定超类,那么默认的超类就是Object类。这就意味着所有的对象(包括数组)都实现了该类的方法。Object的所有方法native表示这个方法的实现是由其他语言(例如C或C++)编写的,它并不在Java源代码中......
  • Vue学习记录03
    响应式基础声明响应式状态ref()在组合式API中,推荐使用ref()函数来声明响应式状态:import{ref}from'vue'constcount=ref(0)ref()接收参数,并将其包裹在一个带有.value属性的ref对象中返回:constcount=ref(0)console.log(count)//{value:0}console.log(......