按照上小节,我们安装好scikit-learn,scikit-learn是比较齐全的如:
以上大家如果看不懂没关系,后续会为大家进行讲解。
特征工程第一个就是特征抽取(接着上小节)。
4、数据的特征抽取
主要讲解以下内容:
1、特征抽取实例演示
2、sklearn特征抽取API
3、字典特征抽取
4、文本特征抽取
什么是特城抽取,如前面的例子,把一篇文章转化为数字数据,就是文本特城抽取,字典特征抽取,就是把一个字典转化数字数据。
其就是把文本,字符串等数据,转化为数字形状。如下面是一个案例:
# 特征抽取
#
# 导入包
from sklearn.feature_extraction.text import CountVectorizer
#
# # 实例化CountVectorizer
vector = CountVectorizer()
# # 调用fit_transform输入并转换数据
res = vector.fit_transform(["life is short,i like python","life is too long,i dislike python"])
# 打印结果
print(vector.get_feature_names())
print(res.toarray())
我们输入的是两篇文章,当然这里吗,每篇文章都是一个比较短的句子:“life is short,i like python"与"life is too long,i dislike python”,其经过特城抽取运行之后,输出结果如下:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
我们暂时不管其是怎么转换的,其上第2行[0 1 1 1 0 1 1 0]就是第一篇文章转换之后获得的数字, [1 1 1 0 1 1 0 1]就是第二篇转换之后获得的数字。我们把这些输入到机器学习之中,通过算法,他们就知道这两篇文章有什么区别了。则就是特征抽取的一个现象。
经过演示,我们知道特征抽取对文本等数据进行特征值化(注:特征值化是为了计算机更好的去理解数据)。
下面我们看看sklearn特征抽取的API:sklearn.feature_extraction(特城抽取的AIP都包含在里面)
我们先看看sklearn.feature_extraction.DictVectorizer类,其实对字典数据进行特征值化。其中的Vectorizer就是数字化的意思。下面是DictVectorizer的语法:
DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X)
X:字典或者包含字典的迭代器
返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换
下面是使用的流程:
1.实例化类DictVectorizer
2.调用fit_transform方法输入数据并转换 注意返回格式
编写如下代码:
from sklearn.feature_extraction import DictVectorizer
def dictvec():
"""
字典数据抽取
:return: None
"""
#实例化
dict = DictVectorizer()
# 调用fit_transform,把数据进行数据化,data就是转化后的数据
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
# print(dict.feature_names_)
# print(dict.inverse_transform(data))
print(data)
return None
if __name__ == '__main__':
countvec()
运行之后我们可以看到如下信息:
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
这个数据我们看起来,十分的不清楚,不明显,前面提到过,默认的返回格式为sparse矩阵格式,在numpy中有一个步骤叫scipy,进行简单的封装,他里面的格式就是sparse矩阵格式(后续会为大家进行讲解:其就是通过去寻找矩阵坐标,填写对应的值)。他提供这个默认的scipy工具,是为了节约内存,方便读取处理。sparse矩阵格式就是数组的缩影。
下面我们对之前的代码进行修改:
- dict = DictVectorizer()
- dict = DictVectorizer(sparse=False)
其sparse默认为True,我们改成False,运行代码:
可以看到如下:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
通过对比,我们可以知道,sparse格式的数据就是标记二维数组中,每个位置的值。如果值为0,则sparse格式会进行省略。我们称二维数组为ndarray。
那么气转化为ndarray格式的目的是什么,我们去掉 # print(dict.feature_names_)的注释,打开该函数,执行代码,打印如下:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
如其中city=上海,如果是,则为1,不是则为0,最后是温度,temperature温度,本来就是数字,所以其没有进行转换。
下面我们进行一些总结,把字典中一些类别的数据,分别转换为特征。如,通过转化之后的样本,我们可以知道那个城市的,其温度是多少。
我们在拿到数据的时候,其最初不是字典格式,所以我们需要先把他转化为字典,然后才能进行字典特抽取(后续会进行讲解)。如下面的例子:
代码中的inverse_transform方法没有为大家讲解,大家打开注释:
- # print(dict.inverse_transform(data))
+ print(dict.inverse_transform(data))
然后运行程序可以看到如下:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
其中的[{‘city=北京’: 1.0, ‘temperature’: 100.0}, {‘city=上海’: 1.0, ‘temperature’: 60.0}, {‘city=深圳’: 1.0, ‘temperature’: 30.0}]就是print(dict.inverse_transform(data))的输出,其就是把特征变成了某个组,该内容了解即可。