机器学习 --- 特征工程(一)
机器学习 — 特征工程(一)
文章目录
- 机器学习 --- 特征工程(一)
- 一,特征工程概念
- 二,特征工程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]]