机器学习进阶 第一节 第二课

网友投稿 711 2022-05-30

Scikit-learn 库

概述

安装

特征抽取

sklearn 特征抽取 API

字典特征抽取

DictVectorizer 语法

流程

文本特征抽取

CountVectorizer 语法

流程

案例

TF-IDF

Tf

Idf

公式

TfidfVectorizer 语法

流程

概述

Scikit-learn 库是 Python 语言的机器学习工具, 包括许多知名的机器学习算法的实现. Scikit-learn 文档完善, 容易上手, 有丰富的 API, 使其在学术界颇受欢迎. 目前稳定版本 0.23.

安装

创建一个机遇 Python3 的虚拟环境: (可以在你自己已有的虚拟环境中)

mkvirtualenv -p /user/bin/python3.5 ml3

1

然后通过导入命令查看是否可以使用:

import sklearn

1

注: 安装 scikit-learn 需要 Numpy, pandas 等库.

特征抽取

# 导入包 from sklearn.feature_extraction.text import CountVectorizer # 实例化CountVectorizer() vector = CountVectorizer() # 调用fit_transform输入并转换数据 txt = ["life is short, I like Pyhton","life is too long, I dislike python"] res = vector.fit_transform(txt) # 调试输出 print(vector.get_feature_names()) print(res.toarray()) 输出结果: ['dislike', 'is', 'life', 'like', 'long', 'pyhton', 'python', 'short', 'too'] [[0 1 1 1 0 1 0 1 0] [1 1 1 0 1 0 1 0 1]]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

通过上述代码, 我们可以得出结论: 特征抽取对文本等数据进行特征值化.

注: 特征值化是为了计算机更好的去理解数据.

sklearn 特征抽取 API

sklearn.feature_extraction

字典特征抽取

字典特征抽取: 对字典数据进行特征值化.

类: sklearn.feature_extraction.DictVectorizer

DictVectorizer 语法

DictVectorizer(sparse=True,...)

1

DictVectorizer.fit_transform(X)

X: 字典或包含字典的迭代器

返回值: 返回 sparse 矩阵

DicVectorizer.inverse_transform(X)

X: array 数组或者 sparse 矩阵

返回值: 转换之前数据格式

DictVectorizer.get_future_names()

返回类别名称

DictVectorizer.transform(X)

按照原先的标准转换

流程

实例化类 DictVectorizer

调用 fit_transform 方法输入数据并转换 (注意返回格式)

from sklearn.feature_extraction import DictVectorizer def dictvec(): """ 字典数据抽取 :return: None """ # 实例化 dict = DictVectorizer() # 调用fit_transform txt = [{"city":"北京","temperature":100},{"city":"上海","temperature":60},{"city":"深圳","temperature":30}] data = dict.fit_transform(txt) # 调试输出 print(data) return None if __name__ == "__main__": dictvec() 输出结果: (0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0

1

2

3

4

5

6

7

8

机器学习进阶 第一节 第二课

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

设置 sparse=Flase

# 实例化 dict = DictVectorizer(sparse=False)

1

2

输出结果:

[[ 0. 1. 0. 100.] [ 1. 0. 0. 60.] [ 0. 0. 1. 30.]]

1

2

3

特征抽取:

from sklearn.feature_extraction import DictVectorizer def dictvec(): """ 字典数据抽取 :return: None """ # 实例化 dict = DictVectorizer() # 调用fit_transform txt = [{"city":"北京","temperature":100},{"city":"上海","temperature":60},{"city":"深圳","temperature":30}] data = dict.fit_transform(txt) # 调试输出 print(dict.get_feature_names()) print(data) return None if __name__ == "__main__": dictvec() 输出结果: ['city=上海', 'city=北京', 'city=深圳', 'temperature'] (0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

文本特征抽取

文本特征抽取: 对文本数据进行特征值化.

类: sklearn.feature_extraction.text.CountVectorizer

CountVectorizer 语法

CountVectorizer(): 返回词频矩阵

1

CountVectorizer.fit_transform(X)

X: 文本或者包含文本字符串的可迭代对象

返回值: 返回 sparse 矩阵

CountVectorizer.inverse_reansform(X)

X: array 数组或者 sparse 矩阵

返回值: 转换之前数据格式

CountVectorizer.get_future_names()

返回值: 单词列表

流程

实例化类 CountVectorizer

调用 fit_transform 方法输入数据并转换 (注意返回格式)

注意返回格式, 利用 toarray() 进行 sparse 矩阵转换 array 数组

from sklearn.feature_extraction.text import CountVectorizer def countvec(): """ 对文本进行特征值化 :return: None """ # 实例化 cv = CountVectorizer() txt = ["life is short, I like Pyhton", "life is too long, I dislike python"] data = cv.fit_transform(txt) # 调试输出 print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": countvec() 输出结果: ['dislike', 'is', 'life', 'like', 'long', 'pyhton', 'python', 'short', 'too'] [[0 1 1 1 0 1 0 1 0] [1 1 1 0 1 0 1 0 1]]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

案例

对三段话进行特征值化

今天很残酷, 明天更残酷, 后天很美好. 但绝大部分是死在明天晚上, 所以每个人不要放弃今天

我们看到的从很远星系来的光是在几百万年之前发出去的. 这样当我们看到宇宙时, 我们是在看它的过去

如果只用一种方式了解某样事物, 你就不会真正了解它. 了解事物真正含义的秘密取决于如何将其我们所了解的事物相联系

from sklearn.feature_extraction.text import CountVectorizer import jieba def cutword(): text1 = "今天很残酷, 明天更残酷, 后天很美好. 但绝大部分是死在明天晚上, 所以每个人不要放弃今天." text2 = "我们看到的从很远星系来的光是在几百万年之前发出去的. 这样当我们看到宇宙时, 我们是在看它的过去." text3 = "如果只用一种方式了解某样事物, 你就不会真正了解它. 了解事物真正含义的秘密取决于如何将其我们所了解的事物相联系." con1 = jieba.cut(text1) con2 = jieba.cut(text2) con3 = jieba.cut(text3) # 转换成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表转换成字符串 c1 = " ".join(content1) c2 = " ".join(content2) c3 = " ".join(content3) return c1, c2, c3 def hanzivec(): """ 中文特征值化 :return: None """ # 分词 c1, c2, c3 = cutword() # 实例化 cv = CountVectorizer() txt = [c1, c2, c3] data = cv.fit_transform(txt) # 调试输出 print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": hanzivec() 输出结果: ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝大部分', '美好', '联系', '过去', '这样'] [[0 0 1 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0] [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1] [1 1 0 0 4 3 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

TF-IDF

TF-IDF 的主要思想是: 如果某个词或短语在一篇文章中出现的概率高, 并且在其他文章中很少出现, 则认为此次或者短语具有很好的类别区分能力, 适合用来分类.

TF-IDF 作用: 用以评估一词对于一个文件集或一个语料库中的其中一份文件的重要程度.

类: sklearn.feature_extraction.text.TfidfVectorizer

Tf

Tf: term frequency (词的频率)

Idf

Idf: inverse document frequency (逆文档频率)

公式

log(总文档数量 / 该词出现的文档数量)

TfidfVectorizer 语法

TfidfVectorizer(stop_word=None,...) 返回词的权重矩阵

1

TfidVectorizer.fit_transform(X)

X: 文本返回或者包含文本字符串的可迭代对象

返回值: 返回 spare 矩阵

TfidVectorizer.inverse_transfrom(X)

X: array 数组或者 sparse 矩阵

返回值: 装换之前数据格式

TfidfVectorizer.get_feature_names()

返回值: 单词列表

流程

为什么需要 TfidVectorizer ?

分类机器学习算法的重要依据

代码展示:

from sklearn.feature_extraction.text import TfidfVectorizer import jieba def cutword(): text1 = "今天很残酷, 明天更残酷, 后天很美好. 但绝大部分是死在明天晚上, 所以每个人不要放弃今天." text2 = "我们看到的从很远星系来的光是在几百万年之前发出去的. 这样当我们看到宇宙时, 我们是在看它的过去." text3 = "如果只用一种方式了解某样事物, 你就不会真正了解它. 了解事物真正含义的秘密取决于如何将其我们所了解的事物相联系." con1 = jieba.cut(text1) con2 = jieba.cut(text2) con3 = jieba.cut(text3) # 转换成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表转换成字符串 c1 = " ".join(content1) c2 = " ".join(content2) c3 = " ".join(content3) return c1, c2, c3 def hanzivec(): """ 中文特征值化 :return: None """ # 分词 c1, c2, c3 = cutword() # 实例化 tv = TfidfVectorizer() txt = [c1, c2, c3] data = tv.fit_transform(txt) # 调试输出 print(tv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": hanzivec() 输出结果: ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝大部分', '美好', '联系', '过去', '这样'] [[0. 0. 0.2236068 0. 0. 0. 0.4472136 0. 0. 0. 0. 0. 0.2236068 0. 0. 0. 0. 0. 0.2236068 0.2236068 0. 0.4472136 0. 0.2236068 0. 0.4472136 0.2236068 0. 0. 0. 0.2236068 0.2236068 0. 0. 0. ] [0. 0. 0. 0.2410822 0. 0. 0. 0.2410822 0.2410822 0.2410822 0. 0. 0. 0. 0. 0. 0.2410822 0.55004769 0. 0. 0. 0. 0.2410822 0. 0. 0. 0. 0.48216441 0. 0. 0. 0. 0. 0.2410822 0.2410822 ] [0.15698297 0.15698297 0. 0. 0.62793188 0.47094891 0. 0. 0. 0. 0.15698297 0.15698297 0. 0.15698297 0.15698297 0.15698297 0. 0.1193896 0. 0. 0.15698297 0. 0. 0. 0.15698297 0. 0. 0. 0.31396594 0.15698297 0. 0. 0.15698297 0. 0. ]]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

机器学习

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:CSS浮动
下一篇:100 个基本 Python 面试问题第二部分(21-40)
相关文章