关于机器学习的三个阶段
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小时内删除侵权内容。