人工智能学习(22 机器学习:02-特征工程和文本特征提取:05_字典特征数据抽取)

按照上小节,我们安装好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))的输出,其就是把特征变成了某个组,该内容了解即可。

猜你喜欢

转载自blog.csdn.net/weixin_43013761/article/details/89542688
今日推荐