机器学习进阶 第一节 第二课
概述
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
文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。
原文链接:iamarookie.blog.csdn.net/article/details/110730421
- 点赞
- 收藏
- 关注作者
评论(0)