【机器学习】特征提取 特征降维

特征工程

特征工程是将原始数据转化为可以用于机器学习的数字特征,比如字典的特征提取,文档的特征提取等。

字典特征提取

把字典的每个唯一的键作为数据集特征的一个维度,有这个维度的就为1,没有就是0。其他相同的键,该维度的值就是其键值。

这样的操作把字典样本的每一条数据转化为了矩阵,但是矩阵中含有大量的0(因为数据中的键和值有很多不同),所以称之为稀疏矩阵

为了保存数据的高效,一般使用三元组表存储。保存非零数据的索引和值。

DictVectorizer 接收参数是字典列表

返回值默认是三元组的稀疏矩阵表示

sparse=False表示返回的是数组

sparse=True表示返回的是三元组 (默认值)

三元组可以通过toarray()转化为稀疏矩阵

python 复制代码
from sklearn.feature_extraction import DictVectorizer
dit = [
    {'name':'Tom','h':180,'age':40,'p':'a'},
    {'name':'Jerry','h':30,'age':30,'p':'b'},
    {'name':'Speicher','h':220,'age':50,'p':'c'}
]

transf = DictVectorizer(sparse=True) # sparse稀疏 坐标(索引) 值的形式提取,更节省内存   默认是稀疏矩阵  可以设置为数组  
arr = transf.fit_transform(dit)
print(arr)
print(arr.toarray()) # 转换为矩阵
'''
  (0, 0)	40.0
  (0, 1)	180.0
  (0, 4)	1.0
  (0, 5)	1.0
  (1, 0)	30.0
  (1, 1)	30.0
  (1, 2)	1.0
  (1, 6)	1.0
  (2, 0)	50.0
  (2, 1)	220.0
  (2, 3)	1.0
  (2, 7)	1.0
[[ 40. 180.   0.   0.   1.   1.   0.   0.]
 [ 30.  30.   1.   0.   0.   0.   1.   0.]
 [ 50. 220.   0.   1.   0.   0.   0.   1.]]
'''

文本特征提取

把文本中的词作为一个文本的特征,词在文本中的数量就是对应特征的值

CountVectorizer

stop_words 表示词的黑名单,不提取这些词 是一个列表

print(transf.get_feature_names_out()) 获得特征名,也就是词

  • 英文文本特征提取
python 复制代码
from sklearn.feature_extraction.text import CountVectorizer
text_ls_E = ['cat and rat','cat is Tom','rat is Jerry']
transf = CountVectorizer(stop_words=['is','and'])  # 词黑名单  不提取的词  需要对句子进行分词
arr = transf.fit_transform(text_ls_E)
print(arr)
print(arr.toarray())
print(transf.get_feature_names_out())  # 
'''
 (0, 0)	1
  (0, 2)	1
  (1, 0)	1
  (1, 3)	1
  (2, 2)	1
  (2, 1)	1
[[1 0 1 0]
 [1 0 0 1]
 [0 1 1 0]]
['cat' 'jerry' 'rat' 'tom']
'''
  • 中文文本特征提取

和英文不同之处在于,需要进行分词,因为中文并不是一个字就代表一个含义

python 复制代码
import jieba
text_ls_c = ['猫和老鼠','猫是汤姆','老鼠是杰瑞']  # 中文需要进行分词
transf_C = sklearn.feature_extraction.text.CountVectorizer(stop_words=['是'])

text_cut = []
for seq in text_ls_c:
    seq = jieba.lcut(seq)
    seq = ' '.join(seq)
    text_cut.append(seq)
# print(text_cut)
data = transf_C.fit_transform(text_cut)
print('中文',data)
print(data.toarray())
print(transf_C.get_feature_names_out())

'''
中文   (0, 2)	1
  (1, 1)	1
  (2, 3)	1
  (2, 0)	1
[[0 0 1 0]
 [0 1 0 0]
 [1 0 0 1]]
['杰瑞' '汤姆' '猫和老鼠' '老鼠']
'''

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

TF 词频 文本中词出现次数/文本中词的数量 词在文档中的重要程度

IDF 逆文档频率 ln(文档的数量/文档中出该词的文档数) 词在整个文档集合中的重要程度

TF-IDF 词频和逆文档频率的积

python 复制代码
# TF-IDF  文本特征词重要程度特征提取
from sklearn.feature_extraction.text import TfidfVectorizer,CountVectorizer
texts = [
    'this is a cat',
    'this is a dog',
    'this is a rat',
]
data=['世界 你好 我 是 华清 远见 的 张 三', '你好 世界 我 是 李四 世界', '华清 远见 666']

# counter = CountVectorizer(stop_words=['is'])
# data_counter = counter.fit_transform(texts)
tfidfer = TfidfVectorizer()
data_tfidf = tfidfer.fit_transform(texts)
print(data_tfidf)
print(data_tfidf.toarray())
print(tfidfer.get_feature_names_out())
'''
  (0, 0)	0.7674945674619879
  (0, 2)	0.4532946552278861
  (0, 4)	0.4532946552278861
  (1, 1)	0.7674945674619879
  (1, 2)	0.4532946552278861
  (1, 4)	0.4532946552278861
  (2, 3)	0.7674945674619879
  (2, 2)	0.4532946552278861
  (2, 4)	0.4532946552278861
[[0.76749457 0.         0.45329466 0.         0.45329466]
 [0.         0.76749457 0.45329466 0.         0.45329466]
 [0.         0.         0.45329466 0.76749457 0.45329466]]
['cat' 'dog' 'is' 'rat' 'this']
'''

无量纲化

去掉数据的单位,把数据的只用数值来表示,转化为没有单位的量。

无量纲化之后可以使得不同的物理量,可以在一个范围内进行比较或者运算

现实中的数据单位不同,导致不同类型的数据之间的差异,影响对样本特征的处理

  • 归一化MinMaxScaler

把原始数据变换到指定的范围,默认0-1 (比例尺的缩放)

x = (x-x_min)/(x_max-x_min) 得到的x就是0-1范围的值

如果需要在其他范围的映射(a,b)得到0-1的x在进行运算

x_scaled = (b-a)x+a

sklearn.preprocessing.MinMaxScaler 缩放 范围元组

python 复制代码
import sklearn.preprocessing

data = np.random.randint(0,46,(3,3))
transf = sklearn.preprocessing.MinMaxScaler((0,1))
trans_data = transf.fit_transform(data)
print('data',data)
print('transf_data',trans_data)

'''
data [[42 12 20]
 [24 24 43]
 [28 12 28]]
transf_data [[1.         0.         0.        ]
 [0.         1.         1.        ]
 [0.22222222 0.         0.34782609]]
'''
  • 标准化StandardScaler

根据数据的均值和方差,把数据转化为均值为0,标准差为1 的分布

x = (x-μ)/σ

μ是均值,σ是标准差

python 复制代码
# 标准化
data = np.random.randint(0,1000,(3,3))
transf = sklearn.preprocessing.StandardScaler()
trans_data = transf.fit_transform(data)
print('data',data)
print('transf_data',trans_data)

'''
data [[592 750 354]
 [870 844 989]
 [217 480 371]]
transf_data [[ 0.12084303  0.38025112 -0.73568456]
 [ 1.15984392  0.98951711  1.41382324]
 [-1.28068695 -1.36976822 -0.67813868]]
'''

特征降维

数据集中的特征并都是有用的,有的特征可以通过其他特征表示,也就是两个特征有相关性。同时,一些相同的数据特征,方差较小,不能区别出不同类型的样本,这样的特征是冗余的。

对这些特征进行降维,去除特征,可以提高计算效率

  • 特征选择

    • 低方差特征过滤
    python 复制代码
    # 低方差过滤  
    import sklearn.feature_selection
    
    
    data = [
        [10,1],
        [10,2],
        [10,3],
        [10,4],
        [10,5],
        [10,6],
        [10,7],
    ]
    select = sklearn.feature_selection.VarianceThreshold(1)
    new_data = select.fit_transform(data)
    new_data
    
    '''
    array([[1],
           [2],
           [3],
           [4],
           [5],
           [6],
           [7]])
    '''
    • 相关系数特征选择
    python 复制代码
    # 相关系数特征选择
    from scipy.stats import pearsonr
    data = np.array([[i,i*10] for i in range(10)])
    r = pearsonr(data[:,0],data[:,1])
    print(r)
    print(r.statistic) # 相关性
    print(r.pvalue) #  皮尔逊系数的p值 相关性显著水平 
    '''
    PearsonRResult(statistic=1.0, pvalue=0.0)
    1.0
    0.0
    '''
  • 主成分分析

    • PCA

    通过矩阵线性变换,保留样本方差最大的特征值,得到新的特征,每个新的特征就是一个主成分

    PCA n_components 参数是整数,保留多少特征,小数,保存多少比例的信息

    python 复制代码
    import sklearn.decomposition
    import numpy as np
    
    np.random.seed(10) # 随机种子
    data = np.random.random_sample((5,10))
    transf = sklearn.decomposition.PCA(n_components=0.7)  # 保留70%的方差
    new_data = transf.fit_transform(data)
    print(data)
    print(new_data)
    
    '''
    [[0.77132064 0.02075195 0.63364823 0.74880388 0.49850701 0.22479665
      0.19806286 0.76053071 0.16911084 0.08833981]
     [0.68535982 0.95339335 0.00394827 0.51219226 0.81262096 0.61252607
      0.72175532 0.29187607 0.91777412 0.71457578]
     [0.54254437 0.14217005 0.37334076 0.67413362 0.44183317 0.43401399
      0.61776698 0.51313824 0.65039718 0.60103895]
     [0.8052232  0.52164715 0.90864888 0.31923609 0.09045935 0.30070006
      0.11398436 0.82868133 0.04689632 0.62628715]
     [0.54758616 0.819287   0.19894754 0.8568503  0.35165264 0.75464769
      0.29596171 0.88393648 0.32551164 0.1650159 ]]
    
    [[-0.6061961  -0.19193152]
     [ 1.03258766 -0.05359811]
     [ 0.16724648 -0.43674706]
     [-0.67480645  0.0573277 ]
     [ 0.08116841  0.62494898]]
    '''
相关推荐
珠海西格电力科技34 分钟前
微电网控制策略基础:集中式、分布式与混合式控制逻辑
网络·人工智能·分布式·物联网·智慧城市·能源
Java后端的Ai之路1 小时前
【RAG技术】- RAG系统调优手段之高效召回(通俗易懂附案例)
人工智能·rag·rag系统·召回·rag调优
草莓熊Lotso1 小时前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器·c语言·数据库·c++·人工智能
Cx330❀2 小时前
从零实现Shell命令行解释器:原理与实战(附源码)
大数据·linux·数据库·人工智能·科技·elasticsearch·搜索引擎
Niuguangshuo8 小时前
深入解析Stable Diffusion基石——潜在扩散模型(LDMs)
人工智能·计算机视觉·stable diffusion
迈火8 小时前
SD - Latent - Interposer:解锁Stable Diffusion潜在空间的创意工具
人工智能·gpt·计算机视觉·stable diffusion·aigc·语音识别·midjourney
wfeqhfxz25887828 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
芝士爱知识a8 小时前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
Li emily9 小时前
解决港股实时行情数据 API 接入难题
人工智能·python·fastapi
Aaron15889 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理