python基础学习之特征工程

  

一、特征提取

  

字典加载特征:DictVectorizer

  

文本特征提取:词频向量(CountVectorizer) TF-IDF向量(TfidfVectorizer FfidfTransformer)   特征哈希向量(HashingVectorizer)

  

图像特征的提取:提取像素矩阵边缘和兴趣点

  

1.1,字典加载特征

  

用python中的字典存储特征是一种常用的做法,其优点是容易理解,但是sklearn的输入特征必须是numpy或Scipy的数组。可以用DictVectorizer从字典加载特征转化成numpy,并且对分类特征会采用独热编码。

  

我=(   

{& # 39;城市# 39;:& # 39;迪拜# 39;,& # 39;温度# 39;:33。},

  

{& # 39;城市# 39;:& # 39;伦敦# 39;,& # 39;温度# 39;:12。},

  

{& # 39;城市# 39;:& # 39;圣弗朗西斯科# 39;,& # 39;温度# 39;:18。}

  

)   从sklearn

。feature_extraction进口DictVectorizer

  vec=

DictVectorizer ()

  

打印(vec.fit_transform(我).toarray ())

  

vec.get_feature_names ()   

[[1。0. 0. 33。)

  

[0。1. 0. 12。)

  

[0。0. 1. 18岁。]]

  

1.2,字频向量

  

词库模型(Bag-of-words模型)是文字模型化最常用的方法,它为每个单词设值一个特征值,依据是用类似单词的文章意思也差不多

  

CountVectorizer类会将文档全部转化成小写,然后把句子分割成块或有意义的字母序列,并统计他们出现的次数

  

可以使用stop_words选项排除一些常用的但没有意义的助词。

  从sklearn.feature_extraction

。文本导入CountVectorizer

  

有限公司=(   

& # 39; UNC在篮球# 39;杜克,

  

& # 39;杜克大学失去了篮球比赛,比赛在# 39;,

  

& # 39;我吃了三明治# 39;

  

)   vec=

CountVectorizer (stop_words=& # 39;英语# 39;)

  

打印(vec.fit_transform (co) .todense ())

  

打印(vec.vocabulary_)

  

#三行数据

  

[[0 1 1 0 0 1 0 1]

  

[0 1 1 2 1 0 0 0]

  

[1 0 0 0 0 0 1 0]]

  

{& # 39; unc # 39;: 7日& # 39;玩# 39;:5 & # 39;杜克# 39;:2 & # 39;篮球# 39;:1 & # 39;失去# 39;:4日& # 39;游戏# 39;:3,   & # 39;吃# 39;:0,& # 39;三明治# 39;:6}

  进口jieba

  从sklearn.feature_extraction

。文本导入CountVectorizer

  

语料库=(   

& # 39;朋友,小红是我的& # 39;,

  

& # 39;小明对小红说:“小红,我们还是不是朋友”& # 39;,

  

& # 39;小明与小红是朋友& # 39;

  

)   

cutcorpus=[“/? join (jieba.cut (x)) x在语料库)

  vec==

CountVectorizer (stop_words=[& # 39;好的& # 39;,& # 39;是的& # 39;])

  

数量=vec.fit_transform (cutcorpus) .todense ()

  

打印(计数)

  

#查看映射字典

  

打印(vec.vocabulary_)

  

可以用词频向量的欧式距离(L2范数)来衡量两个文档之间的距离(距离越小越相似)

  从sklearn.feature_extraction

。文本导入CountVectorizer

  

#计算欧式距离

  从sklearn.metrics

。成对进口euclidean_distances

  

vectorizer=CountVectorizer ()

  

x, y [[0, 1], [0, 2], [1、2]]:

  

dist=euclidean_distances(计数[x], [y])计数

  

打印(& # 39;文档{}与文档{}的距离{}& # 39;.format (x, y, dist))

  

1.3, Tf-idf权重向量

  从sklearn.feature_extraction

。文本导入TfidfTransformer

  

变压器=TfidfTransformer (smooth_idf=False)

  

数量=[[3,0,1],

  

(2, 0, 0),

  

(3, 0, 0),

  

(4, 0, 0),

  

[3 2 0],

  

[3 0 2]]

  

tfidf=transformer.fit_transform(计数)

  

tfidf.toarray ()   

阵列([[0.81940995,0。

0.57320793),   

[1。, 0。, 0。),

  

[1。, 0。, 0。),

  

[1。, 0。, 0。),

  

(0.47330339, 0.88089948, 0。),

  

0.58149261, 0。,0.81355169]])

  从sklearn.feature_extraction

。文本导入TfidfVectorizer

  

vectorizer=TfidfVectorizer ()

  

vectorizer.fit_transform (cutcorpus) .toarray ()

  

vectorizer.vocabulary_   

{& # 39;小明& # 39;:0,& # 39;小红& # 39;:1 & # 39;我们& # 39;:2 & # 39;是不是& # 39;:3 & # 39;朋友& # 39;:4}

  

1.4,特征哈希值

  

词袋模型的方法很好用,也很直接,但在有些场景下很难使用,比如分词后的词汇字典表非常大,   达到100年万+,此时如果直接使用词频向量或Tf-idf权重向量的方法,将对应的样本对应特征矩阵载入内存,有可能将内存撑爆,在这种情况下我们该怎么办呢?

python基础学习之特征工程