特征抽取(Feature extraction):特征抽取则是将任意数据格式(例如文本和图像)转换为机器学习的数字特征。
- 特征抽取在python scikit-learn中的API是:sklearn.feature_extraction
1. 分类特征提取变量
说明:DictVectorizer的处理对象是符号化(非数字化)的但是具有一定结构的特征数据,如字典等,将符号转成数字0/1表示
# 定义一组字典列表,用来表示多个数据样本(每个字典代表一个数据样本)
instance = [{'city':'beijin','temperature':30},{'city':'shenzhen','temperature':40},{'city':'guangzhou','temperature':50}]
# 从sklearn.feature_extraction导入DictVectorizer
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
# 输出转化后的特征矩阵
print(vec.fit_transform(instance).toarray())
# 输出各个维度的特征含义
print(vec.get_feature_names())
输出结果:
[[ 1. 0. 0. 30.]
[ 0. 0. 1. 40.]
[ 0. 1. 0. 50.]]
['city=beijin', 'city=guangzhou', 'city=shenzhen', 'temperature']
DictVectorizer对非数字化的处理方式是,借助原特征的名称,组合成新的特征,并采用0/1的方式进行量化,而数值型的特征转化比较方便,一般情况维持原值即可。
我们在字典结构中再增加一个特征"country",结果如下:
# 定义一组字典列表,用来表示多个数据样本(每个字典代表一个数据样本)
instance = [{'city':'beijin','country':'CN','temperature':30},{'city':'shenzhen','country':'MA','temperature':40},{'city':'guangzhou','country':'EG','temperature':50}]
# 从sklearn.feature_extraction导入DictVectorizer
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
# 输出转化后的特征矩阵
print(vec.fit_transform(instance).toarray())
# 输出各个维度的特征含义
print(vec.get_feature_names())
输出结果:
[[ 1. 0. 0. 1. 0. 0. 30.]
[ 0. 0. 1. 0. 0. 1. 40.]
[ 0. 1. 0. 0. 1. 0. 50.]]
['city=beijin', 'city=guangzhou', 'city=shenzhen', 'country=CN', 'country=EG', 'country=MA', 'temperature']
2. 文本特征处理(只限英文)
词频统计的API是CountVectorizer,对于每一个训练文本,它只考虑每种词汇在该训练文本中出现的频率,注意单个字符不进行统计,因为没有分类意义。
from sklearn.feature_extraction.text import CountVectorizer
# 构建文章【英文】
content = ['This is the first document.', 'This is the second second document.', 'And the third one.', 'Is this the first document? i x y']
#构建实例
con_vet = CountVectorizer()
#进行提取词语
x = con_vet.fit_transform(content)
print(x) # (0, 1) 1 (文章下标,分词下标) 词在文章中出现的次数 sparse矩阵
print(x.toarray()) # 将 sparse矩阵 转化为 数组
# 使用 get_feature_names 获取全部的特征值,即所有文本的关键字
names = con_vet.get_feature_names()
print(names) # 提取到的词
输出结果:
(0, 8) 1
(0, 3) 1
(0, 6) 1
(0, 2) 1
(0, 1) 1
(1, 8) 1
(1, 3) 1
(1, 6) 1
(1, 1) 1
(1, 5) 2
(2, 6) 1
(2, 0) 1
(2, 7) 1
(2, 4) 1
(3, 8) 1
(3, 3) 1
(3, 6) 1
(3, 2) 1
(3, 1) 1
[[0 1 1 1 0 0 1 0 1]
[0 1 0 1 0 2 1 0 1]
[1 0 0 0 1 0 1 1 0]
[0 1 1 1 0 0 1 0 1]]
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
处理中文,我们可以使用jieba分词,进行分词之后,进行处理
# pip install jieba
import jieba
from sklearn.feature_extraction.text import CountVectorizer
# 构建文章【中文】
content = ["今天阳光真好","我要去看北京天安门","逛完天安门之后我要去王府井","吃烤蝎子与烤蜈蚣","晚上去后海蹦个迪"]
content_list = []
for tmp in content:
# jieba分词返回的是一个生成器
res = jieba.cut(tmp)
res_str = ','.join(res)
content_list.append(res_str)
#构建实例
con_vet = CountVectorizer()
#进行提取词语
x = con_vet.fit_transform(content_list)
print(x) # (0, 1) 1 (文章下标,分词下标) 词在文章中出现的次数 sparse矩阵
print(x.toarray()) # 将 sparse矩阵 转化为 数组
# 获取提取到词语
names = con_vet.get_feature_names()
print(names) # 提取到的词
输出结果:
(0, 1) 1
(0, 10) 1
(1, 4) 1
(1, 2) 1
(1, 3) 1
(2, 4) 1
(2, 3) 1
(2, 0) 1
(2, 7) 1
(3, 9) 1
(3, 8) 1
(4, 5) 1
(4, 6) 1
[[0 1 0 0 0 0 0 0 0 0 1]
[0 0 1 1 1 0 0 0 0 0 0]
[1 0 0 1 1 0 0 1 0 0 0]
[0 0 0 0 0 0 0 0 1 1 0]
[0 0 0 0 0 1 1 0 0 0 0]]
['之后', '今天', '北京', '天安门', '我要', '晚上', '海蹦个', '王府井', '蜈蚣', '蝎子', '阳光']