本文主要是介绍【机器学习】特征提取 特征降维,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
特征工程
特征工程是将原始数据转化为可以用于机器学习的数字特征,比如字典的特征提取,文档的特征提取等。
字典特征提取
把字典的每个唯一的键作为数据集特征的一个维度,有这个维度的就为1,没有就是0。其他相同的键,该维度的值就是其键值。
这样的操作把字典样本的每一条数据转化为了矩阵,但是矩阵中含有大量的0(因为数据中的键和值有很多不同),所以称之为稀疏矩阵
为了保存数据的高效,一般使用三元组表存储。保存非零数据的索引和值。
DictVectorizer
接收参数是字典列表
返回值默认是三元组的稀疏矩阵表示
sparse=False表示返回的是数组
sparse=True表示返回的是三元组 (默认值)
三元组可以通过toarray()
转化为稀疏矩阵
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())
获得特征名,也就是词
- 英文文本特征提取
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']
'''
- 中文文本特征提取
和英文不同之处在于,需要进行分词,因为中文并不是一个字就代表一个含义
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 词频和逆文档频率的积
# 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
缩放 范围元组
import sklearn.preprocessingdata = 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-μ)/σ
μ是均值,σ是标准差
# 标准化
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]]
'''
特征降维
数据集中的特征并都是有用的,有的特征可以通过其他特征表示,也就是两个特征有相关性。同时,一些相同的数据特征,方差较小,不能区别出不同类型的样本,这样的特征是冗余的。
对这些特征进行降维,去除特征,可以提高计算效率
-
特征选择
- 低方差特征过滤
# 低方差过滤 import sklearn.feature_selectiondata = [[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]]) '''
- 相关系数特征选择
# 相关系数特征选择 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 参数是整数,保留多少特征,小数,保存多少比例的信息import sklearn.decomposition import numpy as npnp.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.224796650.19806286 0.76053071 0.16911084 0.08833981][0.68535982 0.95339335 0.00394827 0.51219226 0.81262096 0.612526070.72175532 0.29187607 0.91777412 0.71457578][0.54254437 0.14217005 0.37334076 0.67413362 0.44183317 0.434013990.61776698 0.51313824 0.65039718 0.60103895][0.8052232 0.52164715 0.90864888 0.31923609 0.09045935 0.300700060.11398436 0.82868133 0.04689632 0.62628715][0.54758616 0.819287 0.19894754 0.8568503 0.35165264 0.754647690.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]] '''
这篇关于【机器学习】特征提取 特征降维的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!