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

举报
我是小白呀iamarookie 发表于 2021/09/09 23:33:10 2021/09/09
【摘要】 Scikit-learn 库 概述安装特征抽取sklearn 特征抽取 API字典特征抽取DictVectorizer 语法流程 文本特征抽取CountVectorizer 语法流程 ...

概述

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)

  • 按照原先的标准转换

流程

  1. 实例化类 DictVectorizer
  2. 调用 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()
  • 返回值: 单词列表

流程

  1. 实例化类 CountVectorizer
  2. 调用 fit_transform 方法输入数据并转换 (注意返回格式)
  3. 注意返回格式, 利用 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

案例

对三段话进行特征值化

  1. 今天很残酷, 明天更残酷, 后天很美好. 但绝大部分是死在明天晚上, 所以每个人不要放弃今天
  2. 我们看到的从很远星系来的光是在几百万年之前发出去的. 这样当我们看到宇宙时, 我们是在看它的过去
  3. 如果只用一种方式了解某样事物, 你就不会真正了解它. 了解事物真正含义的秘密取决于如何将其我们所了解的事物相联系
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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。