机器学习-特征工程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 字典特征提取

稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。
三元组表 (Coordinate List, COO) :三元组表就是一种稀疏矩阵类型数据 ,
存储非零元素的行索引、列索引和值:
例如:(行,列)数据
(8,6)57

表示除了列出的有值, 其余全是0
非稀疏矩阵(稠密矩阵)
非稀疏矩阵,或称稠密矩阵,是指矩阵中非零元素的数量与总元素数量相比接近或相等,也就是说矩阵中的大部分元素都是非零的。
API
sklearn.feature_extraction.DictVectorizer(sparse=True)
sparse=True 返回类型为 csr_matrix 的稀疏矩阵
sparse=False表示返回的是数组 , 数组可以调用 .toarray() 方法将稀疏矩阵转换为数组
转换器对象调用 fit_transform(data) 函数,参数 data 为一维字典数组或一维字典列表 , 返回转化后的
矩阵或数组
转换器对象 get_feature_names_out() 方法获取特征名

提取为稀疏矩阵对应的数组
python 复制代码
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())

import pandas
pandas.DataFrame(data_new, columns=transfer.get_feature_names_out())

运行结果:

提取为稀疏矩阵
python 复制代码
from sklearn.feature_extraction import DictVectorizer
data = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33,
'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]

transfer=DictVectorizer(sparse=True)
data_new=transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names_out())

CountVectorizer 文本特征提取

API
sklearn.feature_extraction.text.CountVectorizer
构造函数关键字参数 stop_words ,值为 list ,表示词的黑名单
fit_transform 函数的返回值为稀疏矩阵

英文文本提取
python 复制代码
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
data=["csdn is good,csdn is well","i like csdn"]

transfer=CountVectorizer(stop_words=["is","i"]) #is i不提取

data_new=transfer.fit_transform(data)
print(data_new)

import  pandas
pandas.DataFrame(data_new.toarray(),index=["第一句","第二句"],columns=transfer.get_feature_names_out())
中文文本提取

中文文本不像英文文本,中文文本文字之间没有空格,所以要先分词,一般使用 jieba 分词 .
使用 jieba 封装一个函数,功能是把汉语字符串中进行分词

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

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

词频 (Term Frequency, TF), 表示一个词在当前篇文章中的重要性
逆文档频率 (Inverse Document Frequency, IDF), 反映了词在整个文档集合中的稀有程度

API
sklearn.feature_extraction.text.TfidfVectorizer()
构造函数关键字参数 stop_words ,表示词特征黑名单
fit_transform 函数的返回值为稀疏矩阵

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

无量纲化**-**预处理

无量纲化,也称为数据的标准化规范化,是指不同指标之间由于量纲不同导致的不具有可比性,所以需要先进行无量纲化处理。

MinMaxScaler 归一化
让数据压缩在[0,1]范围内,适用于进行多指标综合评价 的时候,不涉及距离度 量、协方差计算、数 据不符合正态分布的时候。
API

sklearn.preprocessing.MinMaxScaler(feature_range)
参数 :feature_range=(0,1) 归一化后的值域 , 可以自己设定
fit_transform 函数归一化的原始数据类型可以是 list 、 DataFrame 和 ndarray, 不可以是稀疏矩阵
fit_transform 函数的返回值为 ndarray

示例
python 复制代码
from sklearn.preprocessing import MinMaxScaler

#原始数据为list
data1=[[1,2,3,4,5,6,7,8,9]]
data2=[[1,2,3],[4,5,6],[7,8,9]]

transfer=MinMaxScaler(feature_range=(0,1))

data1_new=transfer.fit_transform(data1)
data2_new=transfer.fit_transform(data2)
print(data1_new)
print(data2_new)
print("------------------")


#原始数据类型为DataFrame
import pandas as pd
data=pd.DataFrame(data=data2,index=["one","two","three"],columns=["第一列","第二列","第三列"])
transfer=MinMaxScaler(feature_range=(0,1))
data_new=transfer.fit_transform(data)
print(data_new)
print("------------------")


#原始数据为ndarray
from sklearn.feature_extraction import DictVectorizer
data3 = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33,
'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]

transfer=DictVectorizer(sparse=False)
data3_new=transfer.fit_transform(data3)
print(data3_new)

transfer=MinMaxScaler(feature_range=(0,1))

data4_new=transfer.fit_transform(data3_new)
print(data4_new)
StandardScaler 标准化

让数据的平均值为0,标准差为1,适用于聚类、因子分析的时候。

x'是转换后的数值,x是原始数据的值,μ是该特征的均值,σ是该特征的标准差

API

sklearn.preprocessing.StandardScale
与 MinMaxScaler 一样,原始数据类型可以是 list 、 DataFrame 和 ndarray
fit_transform 函数的返回值为 ndarray, 归一化后得到的数据类型都是 ndarray

特征降维

实际数据中 , 有时候特征很多 , 会增加计算量 , 降维就是去掉一些特征 , 或者转化多个特征为少量个特征
特征降维其目的 : 是减少数据集的维度,同时尽可能保留数据的重要信息。
特征降维的好处 :
减少计算成本:在高维空间中处理数据可能非常耗时且计算密集。降维可以简化模型,降低训练时间和资源需求。
去除噪声:高维数据可能包含许多无关或冗余特征,这些特征可能引入噪声并导致过拟合。降维可以帮助去除这些不必要的特征。
特征降维的方式 :
特征选择 :从原始特征集中挑选出最相关的特征
主成份分析 (PCA) :就是把之前的特征通过一系列数学计算,形成新的特征,新的特征数量会小于之前特征数量

1.特征选择

特征选择特征工程里的一个重要问题,其目标是寻找最优特征子集 。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的

之所以要考虑特征选择,是因为机器学习经常面临过拟合的问题。过拟合 的表现是模型参数太贴合训练集数据,模型在训练集上效果很好而在测试集上表现不好,也就是在高方差。简言之模型的泛化能力差。过拟合的原因是模型对于训练集数据来说太复杂,要解决过拟合问题,一般考虑如下方法:

  1. 通过正则化引入对复杂度的惩罚

  2. 对数据降维

VarianceThreshold****低方差过滤特征选择

先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。
(1) 计算方差 :对于每个特征,计算其在训练集中的方差 ( 每个样本值与均值之差的平方 , 在求
平均 ) 。
(2)设定阈值 :选择一个方差阈值,任何低于这个阈值的特征都将被视为低方差特征。
(3) 过滤特征 :移除所有方差低于设定阈值的特征

API
创建对象,准备把方差为等于小于 2 的去掉, threshold 的缺省值为 2.0
sklearn.feature_selection.VarianceThreshold(threshold=2.0)
把 x 中低方差特征去掉 , x 的类型可以是 DataFrame 、 ndarray 和 list
VananceThreshold.fit_transform(x)
fit_transform 函数的返回值为 ndarray

python 复制代码
from sklearn.feature_selection import VarianceThreshold
X = [[0,0,1],[0,1,0],[1,0,0],[0,1,1],[0,1,0],[0,1,1]]
# 返回值为特征选择后的数据
# 参数threshold为方差的阈值
data=VarianceThreshold(threshold=(.8*(1-.8)))
print(data.fit_transform(X))
根据相关系数的特征选择

Pearson相关系数

皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,衡量的是变量之间的线性相关性,结果的取值区间为**[-1,1]** , -1 表示完全的负相关(这个变量下降,那个就会上升), +1 表示完全的正相关, 0 表示没有线性相关性。Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的pearsonr方法能够同时计算相关系数和p-value

缺点:

作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近 0 。

python 复制代码
import numpy as np
from scipy.stats import pearsonr

np.random.seed(0)
size=100
x=np.random.normal(0,1,size)
print("lower:\n",pearsonr(x,x+np.random.normal(0,1,size)))
print("higher:\n",pearsonr(x,x+np.random.normal(0,5,size)))
2.PCA 主成分分析降维

是一种线性无监督的降维方法。

**主要思想:**是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。

通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

API
from sklearn.decomposition import PCA
PCA(n_components=None)
主成分分析
n_components:
实参为小数时:表示降维后保留百分之多少的信息
实参为整数时:表示减少到多少特征

python 复制代码
#当n_components为小数,整数时
from sklearn.decomposition import PCA
def pca_demo():
    data=[[2,3,4,5],[3,4,5,6],[6,7,8,9]]
    transfer1=PCA(n_components=0.95)
    transfer2=PCA(n_components=2)
    data1_new=transfer1.fit_transform(data)
    data2_new=transfer2.fit_transform(data)
    print(data1_new)
    print(data2_new)
    return None
pca_demo()
相关推荐
边缘计算社区13 分钟前
首个!艾灵参编的工业边缘计算国家标准正式发布
大数据·人工智能·边缘计算
游客52024 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
一位小说男主24 分钟前
编码器与解码器:从‘乱码’到‘通话’
人工智能·深度学习
深圳南柯电子41 分钟前
深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
人工智能
Kai HVZ41 分钟前
《OpenCV计算机视觉》--介绍及基础操作
人工智能·opencv·计算机视觉
biter00881 小时前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
吃个糖糖1 小时前
35 Opencv 亚像素角点检测
人工智能·opencv·计算机视觉
qq_529025291 小时前
Torch.gather
python·深度学习·机器学习