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

机器学习 --- 特征工程(一)

机器学习 — 特征工程(一)


文章目录

  • 机器学习 --- 特征工程(一)
  • 一,特征工程概念
  • 二,特征工程API
  • 三,DictVectorizer 字典列表特征提取
  • 四,CountVectorizer 文本特征提取
    • 4.1 API
    • 4.2 英文文本提取
    • 4.3 中文文本提取
  • 五, TfidfVectorizer TF-IDF文本特征词的重要程度特征提取
    • 5.1 算法
    • 5.2 API
    • 5.3 TF-IDF特征提取
      • 5.3.1 TF-IDF特征提取使用
      • 5.3.2 手动实现TF-IDF


一,特征工程概念

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

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

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

特征工程步骤为:

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

  • 无量纲化(预处理)

    • 归一化
    • 标准化
  • 降维

    • 底方差过滤特征选择

    • 主成分分析-PCA降维

二,特征工程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)

三,DictVectorizer 字典列表特征提取

稀疏矩阵

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

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

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

(行,列) 数据

(0,0) 10

(0,1) 20

(2,0) 90

(2,20) 8

(8,0) 70

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

非稀疏矩阵(稠密矩阵)

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

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

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

  • api

  • 创建转换器对象:

  sklearn.feature_extraction.DictVectorizer(sparse=True)
# 字典列表特征提取
from sklearn.feature_extraction import DictVectorizer
data =  [{'city': '北京', 'temperature': 19}, {'city': '上海', 'temperature': 20}, {'city': '深圳', 'temperature': 30},{'city': '深圳', 'temperature': 25}]tool = DictVectorizer(sparse=True)#true表示返回稀疏矩阵,false表示返回矩阵data =tool.fit_transform(data) 
print(data)
print(data.toarray())#三元组表转数组
print(tool.get_feature_names_out())
  (0, 1)	1.0(0, 3)	19.0(1, 0)	1.0(1, 3)	20.0(2, 2)	1.0(2, 3)	30.0(3, 2)	1.0(3, 3)	25.0
[[ 0.  1.  0. 19.][ 1.  0.  0. 20.][ 0.  0.  1. 30.][ 0.  0.  1. 25.]]
['city=上海' 'city=北京' 'city=深圳' 'temperature']

四,CountVectorizer 文本特征提取

4.1 API

klearn.feature_extraction.text.CountVectorizer

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

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

4.2 英文文本提取

# 英文词频特征提取
from sklearn.feature_extraction.text import CountVectorizer
data = ['UNC played Duke in basketball','Duke lost the basketball game'
]cv=CountVectorizer()# 创建一个词频特征提取器
data = cv.fit_transform(data)#特征提取转换
print(data.toarray())#三元组表转数组
print(cv.get_feature_names_out()) #查看每一个特征的特征名
[[1 1 0 1 0 1 0 1][1 1 1 0 1 0 1 0]]
['basketball' 'duke' 'game' 'in' 'lost' 'played' 'the' 'unc']

4.3 中文文本提取

中文文本提取使用组件jieba分词

pip install jieba
# 中文词频特征提取
import jieba
from sklearn.feature_extraction.text import CountVectorizerdef fenci(text):return " ".join(jieba.cut(text))# 中文词频特征提取(中文必须有空格来分词 否则会把一句话当做一个特征)
data = ["科技公司推出新一代人工智能产品","人工智能技术在医疗领域的应用","人工智能助力教育行业的发展","人工智能在金融领域的创新应用","人工智能技术推动自动驾驶的发展"]
data = [fenci(el) for el in data]
print("分词后的数据:")
print(data)# 创建词频特征提取器
cv = CountVectorizer(stop_words=["做出", "会长"])  # 指定停用词
data_transformed = cv.fit_transform(data)  # 特征提取(转换)# 打印词频矩阵
print("词频矩阵:")
print(data_transformed.toarray())  # 三元组表转数组# 查看每一个特征的特征名
print("特征名称:")
print(cv.get_feature_names_out())
分词后的数据:
['科技 公司 推出 新一代 人工智能 产品', '人工智能 技术 在 医疗 领域 的 应用', '人工智能 助力 教育 行业 的 发展', '人工智能 在 金融 领域 的 创新 应用', '人工智能 技术 推动 自动 驾驶 的 发展']
词频矩阵:
[[1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0][0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0][0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0][0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0][0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1]]
特征名称:
['产品' '人工智能' '公司' '创新' '助力' '医疗' '发展' '应用' '技术' '推出' '推动' '教育' '新一代' '科技''自动' '行业' '金融' '领域' '驾驶']

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

5.1 算法

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

逆文档频率(Inverse Document Frequency, IDF), 反映了词在整个文档集合中的稀有程度
在这里插入图片描述

5.2 API

sklearn.feature_extraction.text.TfidfVectorizer()

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

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

5.3 TF-IDF特征提取

5.3.1 TF-IDF特征提取使用

from sklearn.feature_extraction.text import TfidfVectorizer
import jiebadef fenci(text):return " ".join(jieba.cut(text))# 文本数据
data = ["科技公司推出新一代人工智能产品","人工智能技术在医疗领域的应用","人工智能助力教育行业的发展","人工智能在金融领域的创新应用","人工智能技术推动自动驾驶的发展"]# 对文本数据进行分词
data = [fenci(el) for el in data]
print("分词后的数据:")
print(data)# 使用TfidfVectorizer进行特征提取
tool = TfidfVectorizer()
tf_idf = tool.fit_transform(data)# 打印TF-IDF矩阵
print("TF-IDF矩阵:")
print(tf_idf.toarray())# 打印特征名称
print("特征名称:")
print(tool.get_feature_names_out())
分词后的数据:
['科技 公司 推出 新一代 人工智能 产品', '人工智能 技术 在 医疗 领域 的 应用', '人工智能 助力 教育 行业 的 发展', '人工智能 在 金融 领域 的 创新 应用', '人工智能 技术 推动 自动 驾驶 的 发展']
TF-IDF矩阵:
[[0.43739254 0.20841989 0.43739254 0.         0.         0.0.         0.         0.         0.43739254 0.         0.0.43739254 0.43739254 0.         0.         0.         0.0.        ][0.         0.2672191  0.         0.         0.         0.56078930.         0.45244127 0.45244127 0.         0.         0.0.         0.         0.         0.         0.         0.452441270.        ][0.         0.24197214 0.         0.         0.50780572 0.0.40969445 0.         0.         0.         0.         0.507805720.         0.         0.         0.50780572 0.         0.0.        ][0.         0.25365811 0.         0.53233003 0.         0.0.         0.42948052 0.         0.         0.         0.0.         0.         0.         0.         0.53233003 0.429480520.        ][0.         0.22390919 0.         0.         0.         0.0.37911122 0.         0.37911122 0.         0.46989858 0.0.         0.         0.46989858 0.         0.         0.0.46989858]]
特征名称:
['产品' '人工智能' '公司' '创新' '助力' '医疗' '发展' '应用' '技术' '推出' '推动' '教育' '新一代' '科技''自动' '行业' '金融' '领域' '驾驶']

5.3.2 手动实现TF-IDF

# 手动实现tf-idf
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
import jieba
from sklearn.preprocessing import normalizedef fenci(str):return " ".join(list(jieba.cut(str)))
data = ["科技公司推出新一代人工智能产品","人工智能技术在医疗领域的应用","人工智能助力教育行业的发展","人工智能在金融领域的创新应用","人工智能技术推动自动驾驶的发展"]
data = [fenci(str) for str in data]
#print(data)def if_idf(x):cv = CountVectorizer()tf = cv.fit_transform(x).toarray()print(tf)idf = np.log((len(tf)+1) / (np.sum(tf!=0, axis=0)+1))+1print(idf)tf_idf = tf * idfprint(tf_idf)tf_idf = normalize(tf_idf)print(tf_idf)if_idf(data)
[[1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0][0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0][0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0][0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0][0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1]]
[2.09861229 1.         2.09861229 2.09861229 2.09861229 2.098612291.69314718 1.69314718 1.69314718 2.09861229 2.09861229 2.098612292.09861229 2.09861229 2.09861229 2.09861229 2.09861229 1.693147182.09861229]
[[2.09861229 1.         2.09861229 0.         0.         0.0.         0.         0.         2.09861229 0.         0.2.09861229 2.09861229 0.         0.         0.         0.0.        ][0.         1.         0.         0.         0.         2.098612290.         1.69314718 1.69314718 0.         0.         0.0.         0.         0.         0.         0.         1.693147180.        ][0.         1.         0.         0.         2.09861229 0.1.69314718 0.         0.         0.         0.         2.098612290.         0.         0.         2.09861229 0.         0.0.        ][0.         1.         0.         2.09861229 0.         0.0.         1.69314718 0.         0.         0.         0.0.         0.         0.         0.         2.09861229 1.693147180.        ]
...[0.         0.22390919 0.         0.         0.         0.0.37911122 0.         0.37911122 0.         0.46989858 0.0.         0.         0.46989858 0.         0.         0.0.46989858]]

相关文章:

  • redis数据结构-09 (ZADD、ZRANGE、ZRANK)
  • 线代第二章矩阵第八节逆矩阵、解矩阵方程
  • 脑机接口技术:开启人类与机器融合的新时代
  • Gatsby知识框架
  • 软考架构师考试-UML图总结
  • eward hacking 问题 强化学习钻空子
  • 科研领域开源情报应用:从全球信息网络到创新决策
  • SpringBoot与Eventuate Tram整合 - 实现转账最终一致性系统
  • 替换 FastJSON:推荐 Jackson 及详细用法指南(含工具类 + 替换方案)
  • Shell脚本实践(修改文件,修改配置文件,执行jar包)
  • 2025年中期大语言模型实力深度剖析
  • 如何使用远程桌面控制电脑
  • 【计算机视觉】OpenCV实战项目:基于OpenCV与face_recognition的实时人脸识别系统深度解析
  • 力扣hot100——347.前K个高频元素(cpp手撕堆)
  • 霍夫圆变换全面解析(OpenCV)
  • 在scala中使用sparkSQL连接MySQL并添加新数据
  • 需求跟踪矩阵准确性的5大策略
  • java使用 FreeMarker 模板生成包含图片的 `.doc` 文件
  • 《数据库原理》部分习题解析
  • MySQL——八、SQL优化
  • 甘肃发布外卖食品安全违法行为典型案例:一商家用鸭肉冒充牛肉被罚
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 支持企业增强战略敏捷更好发展,上海市领导密集走访外贸外资企业
  • 警方通报:某博主遭勒索后自杀系自导自演,已立案调查
  • 牧原股份子公司与养殖户种猪买卖纠纷案一审胜诉
  • 朝着解决问题的正确方向迈进——中美经贸高层会谈牵动世界目光