中恒建设职业技术培训学校网站,网站开发前端课程,哪家网络营销好,榆林市中小企业融资服务平台四 特征工程
1 特征工程概念
特征工程:就是对特征进行相关的处理
一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程
特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 …四 特征工程
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(sparseTrue) 参数: sparseTrue返回类型为csr_matrix的稀疏矩阵 sparseFalse表示返回的是数组,数组可以调用.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(sparseFalse)
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, columnstransfer.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(sparseTrue)
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[第一个句子,第二个句子],columnstransfer.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 CountVectorizerdef 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(), columnstransfer.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(), indexmylist, columnstransfer.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 TfidfVectorizerdef 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(), columnstransfer.get_feature_names_out())from sklearn.feature_extraction.text import CountVectorizertransfer CountVectorizer(stop_words[期间, 做出,重大贡献])
data_final transfer.fit_transform(data_new)pd.DataFrame(data_final.toarray(), columnstransfer.get_feature_names_out())6 无量纲化-预处理
无量纲即没有单位的数据
无量纲化包括归一化和标准化, 为什么要进行无量纲化呢?
这是一个男士的数据表:
编号id身高 h收入 s体重 w11.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归一化公式: 这里的 min 和 max 分别是每种特征中的最小值和最大值而 是当前特征值scaled 是归一化后的特征值。
若要缩放到其他区间可以使用公式xx*(max-min)min;
比如 [-1, 1]的公式为:
手算过程: 2归一化API
sklearn.preprocessing.MinMaxScaler(feature_range)
参数:feature_range(0,1) 归一化后的值域,可以自己设定
fit_transform函数归一化的原始数据类型可以是list、DataFrame和ndarray, 不可以是稀疏矩阵
fit_transform函数的返回值为ndarray
3归一化示例
示例1原始数据类型为list
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.09090909 0. 0.375 ][1. 1. 0. ][0. 1. 1. ]]示例2原始数据类型为DataFrame
from sklearn.preprocessing import MinMaxScaler
import pandas as pd;
data[[12,22,4],[22,23,1],[11,23,9]]
data pd.DataFrame(datadata, index[一,二,三], columns[一列,二列,三列])
transfer MinMaxScaler(feature_range(0, 1))
data_new transfer.fit_transform(data)
print(data_new)示例3原始数据类型为 ndarray
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import MinMaxScalerdata [{city:成都, age:30, temperature:200}, {city:重庆,age:33, temperature:60}, {city:北京, age:42, temperature:80}]
transfer DictVectorizer(sparseFalse)
data transfer.fit_transform(data) #data类型为ndarray
print(data)transfer MinMaxScaler(feature_range(0, 1))
data transfer.fit_transform(data)
print(data)4缺点
最大值和最小值容易受到异常点影响所以鲁棒性较差。所以常使用标准化的无量钢化
(2)StandardScaler 标准化
在机器学习中标准化是一种数据预处理技术也称为数据归一化或特征缩放。它的目的是将不同特征的数值范围缩放到统一的标准范围以便更好地适应一些机器学习算法特别是那些对输入数据的尺度敏感的算法。
1标准化公式
最常见的标准化方法是Z-score标准化也称为零均值标准化。它通过对每个特征的值减去其均值再除以其标准差将数据转换为均值为0标准差为1的分布。这可以通过以下公式计算: 其中z是转换后的数值x是原始数据的值μ是该特征的均值σ是该特征的标准差
2 标准化 API
sklearn.preprocessing.StandardScale
与MinMaxScaler一样原始数据类型可以是list、DataFrame和ndarray
fit_transform函数的返回值为ndarray, 归一化后得到的数据类型都是ndarray
from sklearn.preprocessing import StandardScale
#不能加参数feature_range(0, 1)
transfer StandardScaler()
data_new transfer.fit_transform(data) #data_new的类型为ndarray3标准化示例
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
# 1、获取数据
df_data pd.read_csv(src/dating.txt)
print(type(df_data)) #class pandas.core.frame.DataFrame
print(df_data.shape) #(1000, 4)# 2、实例化一个转换器类
transfer StandardScaler()# 3、调用fit_transform
new_data transfer.fit_transform(df_data) #把DateFrame数据进行归一化
print(DateFrame数据被归一化后:\n, new_data[0:5])nd_data df_data.values #把DateFrame转为ndarray
new_data transfer.fit_transform(nd_data) #把ndarray数据进行归一化
print(ndarray数据被归一化后:\n, new_data[0:5])nd_data df_data.values.tolist() #把DateFrame转为list
new_data transfer.fit_transform(nd_data) #把ndarray数据进行归一化
print(list数据被归一化后:\n, new_data[0:5])class pandas.core.frame.DataFrame
(1000, 4)
DateFrame数据被归一化后:[[ 0.33193158 0.41660188 0.24523407 1.24115502][-0.87247784 0.13992897 1.69385734 0.01834219][-0.34554872 -1.20667094 -0.05422437 -1.20447063][ 1.89102937 1.55309196 -0.81110001 -1.20447063][ 0.2145527 -1.15293589 -1.40400471 -1.20447063]]
ndarray数据被归一化后:[[ 0.33193158 0.41660188 0.24523407 1.24115502][-0.87247784 0.13992897 1.69385734 0.01834219][-0.34554872 -1.20667094 -0.05422437 -1.20447063][ 1.89102937 1.55309196 -0.81110001 -1.20447063][ 0.2145527 -1.15293589 -1.40400471 -1.20447063]]
list数据被归一化后:[[ 0.33193158 0.41660188 0.24523407 1.24115502][-0.87247784 0.13992897 1.69385734 0.01834219][-0.34554872 -1.20667094 -0.05422437 -1.20447063][ 1.89102937 1.55309196 -0.81110001 -1.20447063][ 0.2145527 -1.15293589 -1.40400471 -1.20447063]]自己实现标准化来测试
#数据
datanp.array([[5],[20],[40],[80],[100]])
#API实现标准化
data_newsscaler.fit_transform(data)
print(API实现:\n,data_news)#标准化自己实现
munp.mean(data)
sum0
for i in data:sum((i[0]-mu)**2)
dnp.sqrt(sum/(len(data)))
print(自己实现:\n,(data[3]-mu)/d)4 注意点
在数据预处理中特别是使用如StandardScaler这样的数据转换器时fit、fit_transform和transform这三个方法的使用是至关重要的它们各自有不同的作用
fit: 这个方法用来计算数据的统计信息比如均值和标准差在StandardScaler的情况下。这些统计信息随后会被用于数据的标准化。你应当仅在训练集上使用fit方法。 fit_transform: 这个方法相当于先调用fit再调用transform但是它在内部执行得更高效。它同样应当仅在训练集上使用它会计算训练集的统计信息并立即应用到该训练集上。 transform: 这个方法使用已经通过fit方法计算出的统计信息来转换数据。它可以应用于任何数据集包括训练集、验证集或测试集但是应用时使用的统计信息必须来自于训练集。
当你在预处理数据时首先需要在训练集X_train上使用fit_transform这样做可以一次性完成统计信息的计算和数据的标准化。这是因为我们需要确保模型是基于训练数据的统计信息进行学习的而不是整个数据集的统计信息。
**一旦scaler对象在X_train上被fit它就已经知道了如何将数据标准化。**这时对于测试集X_test我们只需要使用transform方法因为我们不希望在测试集上重新计算任何统计信息也不希望测试集的信息影响到训练过程。如果我们对X_test也使用fit_transform测试集的信息就可能会影响到训练过程。
总结来说:我们常常是先fit_transform(x_train)然后再transform(x_text)