特征工程之特征抽取

特征抽取简介

将任意数据(如文本或图像)转换为可用于机器学习的数字特征,具体如下几个方面:
1、字典特征提取(特征离散化)
2、文本特征提取
3、图像特征提取(深度学习部分,本文介绍机器学习部分)

特征抽取API:

sklearn.feature_extraction

字典数据特征抽取

API介绍:

sklearn.feature_extraction.DictVectorizer(sparse=True,…)
* DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse(稀疏)矩阵
* DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
* DictVectorizer.get_feature_names() 返回类别名称

注:在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律是,则称该矩阵为稀疏矩阵。

one-hot编码
对于特征当中存在类别信息的我们都会做one-hot编码处理
原字典

{'city':'北京','temperature':100},{'city':'上海','temperature':20},{'city':'杭州','temperature':90}

one-hot编码后

{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 20.0}, {'city=杭州': 1.0, 'temperature': 90.0}

sklearn转化为数组:
在这里插入图片描述

编程案例:

#特征提取(字典数据)
from sklearn.feature_extraction import DictVectorizer

def dict_demo():
    """
    对字典类型的数据进行特征提取
    """
    data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
    #1、实例化一个转换器类
    transfer =DictVectorizer(sparse=False)
    #2、调用fit_transform
    data = transfer.fit_transform(data)
    print("返回结果:\n",data)
    #3、打印特征名字
    print("特征名字:\n",transfer.get_feature_names())
    
    return None

"""
返回结果:sparse=False
[[  0.   1.   0. 100.]
[  1.   0.   0.  60.]
[  0.   0.   1.  30.]]
特征名字:
['city=上海', 'city=北京', 'city=深圳', 'temperature']

返回结果:sparse=True
   (0, 1)       1.0
  (0, 3)        100.0
  (1, 0)        1.0
  (1, 3)        60.0
  (2, 2)        1.0
  (2, 3)        30.0
特征名字:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
"""

文本特征提取

API介绍:

* sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
    * 返回词频矩阵
* CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
* CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
* CountVectorizer.get_feature_names() 返回值:单词列表

流程分析:

实例化类CountVectorizer
调用fit_transform方法输入数据并转换(注意返回格式,利用toarray()进行sparse矩阵转换array数组)

编程案例:

#文本数据特征抽取
from sklearn.feature_extraction.text import CountVectorizer

def text_count_demo():
    """
    对文本进行特征抽取
    """
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    #1、实例化一个转换器类
#     transfer = CountVectorizer(sparse=False)
    transfer = CountVectorizer()
    #2、调用fit_transform
    data = transfer.fit_transform(data)
    print("文本抽取的结果:\n",data.toarray())
#     print("文本抽取的结果:\n",data)
    print("返回特征名字:\n",transfer.get_feature_names())

"""
文本抽取的结果:
[[0 1 1 2 0 1 1 0]
[1 1 1 0 1 1 0 1]]
返回特征名字:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
"""

jieba分词

API介绍:

jieba.cut()   #返回词语组成的生成器

编程案例:

"""
步骤:
>准备句子,利用jieba.cut进行分词
>实例化CountVectorizer
>将分词结果变成字符串当做fit_transform的输入值
"""
#jieba分词案例
from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_word(text):
    """
    中文分词
    """
    #jieba分词
    text = " ".join(list(jieba.cut(text)))
    
    return text

def text_chinese_count_demo():
    """
    中文特征抽取
    """
    data =["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
           "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
           "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    
    #将原始数据转换成分好词的形式
    text_list = []
    for sent in data:
        text_list.append(cut_word(sent))
    print(text_list)
    
    #1、实例化一个转换器类
#     transfer = CountVectorizer(sparse=False)
    transfer = CountVectorizer()

    #2、调用fit_transform
    data = transfer.fit_transform(text_list)
    print("文本抽取的结果:\n",data.toarray())
    print("返回特征名字:\n",transfer.get_feature_names())

"""
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
文本抽取的结果:
[[2 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 1
  0]
[0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 0
  1]
[1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0
  0]]
返回特征名字:
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
"""

Tf-idf文本特征提取

TF-IDF主要思想:

若某个词汇或者短语在一篇文章中出现的概率高,并且在其他文章中很少出现,可认为该词或短语具有很好的类别区分能力,可用于文章分类。

TF-IDF作用:

用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度,是分类机器学习算法进行文章分类中前期数据处理方式。

TF-IDF计算公式:
在这里插入图片描述

tf:词频(term frequency)指某一个指定的词语在该文件中出现的频率
idf:逆向文档频率(inverse document frequency)指一个词语普遍重要性的度量。

API介绍:

sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])

编程案例:

#TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def cut_word(text):
    """
    中文分词
    """
    #jieba分词
    text = " ".join(list(jieba.cut(text)))
    
    return text

def text_chinese_count_demo():
    """
    中文特征抽取
    """
    data =["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
           "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
           "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    
    #将原始数据转换成分好词的形式
    text_list = []
    for sent in data:
        text_list.append(cut_word(sent))
    print(text_list)
    
    #1、实例化一个转换器类
#     transfer = CountVectorizer(sparse=False)
    transfer = TfidfVectorizer(stop_words=['一种','不会','不要'])

    #2、调用fit_transform
    data = transfer.fit_transform(text_list)
    print("文本抽取的结果:\n",data.toarray())
    print("返回特征名字:\n",transfer.get_feature_names())

"""
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
文本抽取的结果:
[[0.         0.         0.         0.43643578 0.         0.
  0.         0.         0.         0.21821789 0.         0.21821789
  0.         0.         0.         0.         0.21821789 0.21821789
  0.         0.43643578 0.         0.21821789 0.         0.43643578
  0.21821789 0.         0.         0.         0.21821789 0.21821789
  0.         0.         0.21821789 0.        ]
[0.2410822  0.         0.         0.         0.2410822  0.2410822
  0.2410822  0.         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.         0.2410822 ]
[0.         0.644003   0.48300225 0.         0.         0.
  0.         0.16100075 0.16100075 0.         0.16100075 0.
  0.16100075 0.16100075 0.         0.12244522 0.         0.
  0.16100075 0.         0.         0.         0.16100075 0.
  0.         0.         0.3220015  0.16100075 0.         0.
  0.16100075 0.         0.         0.        ]]
返回特征名字:
['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
"""
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值