日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


什么是特征提取呢?

1 特征提取

1.1 定义

将任意数据(如文本或图像)转换为可用于机器学习的数字特征

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

  • 特征提取分类:

    • 字典特征提取(特征离散化)
    • 文本特征提取
    • 图像特征提取(深度学习将介绍)

1.2 特征提取API

sklearn.feature_extraction

2 字典特征提取

作用:对字典数据进行特征值化

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…)

    • DictVectorizer.fit_transform(X)

      • X:字典或者包含字典的迭代器返回值
      • 返回sparse矩阵
    • DictVectorizer.get_feature_names() 返回类别名称

2.1 应用

我们对以下数据进行特征提取

[{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]

2.2 流程分析

  • 实例化类DictVectorizer
  • 调用fit_transform方法输入数据并转换(注意返回格式)
from sklearn.feature_extraction import DictVectorizerdef dict_demo():"""对字典类型的数据进行特征抽取:return: None"""data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]# 1、实例化一个转换器类transfer = DictVectorizer(sparse=False)# 2、调用fit_transformdata = transfer.fit_transform(data)print("返回的结果:\n", data)# 打印特征名字print("特征名字:\n", transfer.get_feature_names())return None

注意观察没有加上sparse=False参数的结果

返回的结果:(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']

这个结果并不是我们想要看到的,所以加上参数,得到想要的结果:

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

之前在学习pandas中的离散化的时候,也实现了类似的效果。我们把这个处理数据的技巧叫做”one-hot“编码

2.3 总结

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

3 文本特征提取

作用:对文本数据进行特征值化

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

    • 返回词频矩阵
    • CountVectorizer.fit_transform(X)
      • X:文本或者包含文本字符串的可迭代对象
      • 返回值:返回sparse矩阵
    • CountVectorizer.get_feature_names() 返回值:单词列表
  • sklearn.feature_extraction.text.TfidfVectorizer

3.1 应用

我们对以下数据进行特征提取

["life is short,i like python",
"life is too long,i dislike python"]

3.2 流程分析

  • 实例化类CountVectorizer
  • 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
from sklearn.feature_extraction.text import CountVectorizerdef text_count_demo():"""对文本进行特征抽取,countvetorizer:return: None"""data = ["life is short,i like like python", "life is too long,i dislike python"]# 1、实例化一个转换器类# transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数transfer = CountVectorizer()# 2、调用fit_transformdata = transfer.fit_transform(data)print("文本特征抽取的结果:\n", data.toarray())print("返回特征名字:\n", transfer.get_feature_names())return None

返回结果:

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

问题:如果我们将数据替换成中文?

"人生苦短,我喜欢Python","生活太长久,我不喜欢Python"

那么最终得到的结果是

为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。其实就达到了一个分词的效果,所以我们要对中文进行分词处理

3.3 jieba分词处理

  • jieba.cut()

    • 返回词语组成的生成器

需要安装下jieba库

pip3 install jieba

3.4 案例分析

对以下三句话进行特征值化

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

    • 准备句子,利用jieba.cut进行分词
    • 实例化CountVectorizer
    • 将分词结果变成字符串当作fit_transform的输入值

from sklearn.feature_extraction.text import CountVectorizer
import jiebadef cut_word(text):"""对中文进行分词"我爱北京天安门"————>"我 爱 北京 天安门":param text::return: text"""# 用结巴对中文字符串进行分词text = " ".join(list(jieba.cut(text)))return textdef text_chinese_count_demo2():"""对中文进行特征抽取:return: None"""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_transformdata = transfer.fit_transform(text_list)print("文本特征抽取的结果:\n", data.toarray())print("返回特征名字:\n", transfer.get_feature_names())return None

返回结果:

Building prefix dict from the default dictionary ...
Dumping model to file cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
Loading model cost 1.032 seconds.
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
Prefix dict has been built succesfully.
文本特征抽取的结果:[[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]]
返回特征名字:['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

但如果把这样的词语特征用于分类,会出现什么问题?

请看问题:

该如何处理某个词或短语在多篇文章中出现的次数高这种情况

3.5 Tf-idf文本特征提取

  • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

3.5.1 公式

  • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
  • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

最终得出结果可以理解为重要程度。

举例:
假如一篇文章的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。
而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。
所以,如果"非常"一词在1,0000份文件出现过,而文件总数是10,000,000份的话,
其逆向文件频率就是lg(10,000,000 / 1,0000)=3。
最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15

3.5.2 案例

from sklearn.feature_extraction.text import TfidfVectorizer
import jiebadef cut_word(text):"""对中文进行分词"我爱北京天安门"————>"我 爱 北京 天安门":param text::return: text"""# 用结巴对中文字符串进行分词text = " ".join(list(jieba.cut(text)))return textdef text_chinese_tfidf_demo():"""对中文进行特征抽取:return: None"""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_transformdata = transfer.fit_transform(text_list)print("文本特征抽取的结果:\n", data.toarray())print("返回特征名字:\n", transfer.get_feature_names())return None

返回结果:

Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
Loading model cost 0.856 seconds.
Prefix dict has been built succesfully.
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
文本特征抽取的结果:[[ 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.436435780.          0.21821789  0.          0.43643578  0.21821789  0.          0.0.          0.21821789  0.21821789  0.          0.          0.218217890.        ][ 0.2410822   0.          0.          0.          0.2410822   0.24108220.2410822   0.          0.          0.          0.          0.          0.0.          0.2410822   0.55004769  0.          0.          0.          0.0.2410822   0.          0.          0.          0.          0.482164410.          0.          0.          0.          0.          0.24108220.          0.2410822 ][ 0.          0.644003    0.48300225  0.          0.          0.          0.0.16100075  0.16100075  0.          0.16100075  0.          0.161000750.16100075  0.          0.12244522  0.          0.          0.161000750.          0.          0.          0.16100075  0.          0.          0.0.3220015   0.16100075  0.          0.          0.16100075  0.          0.0.        ]]
返回特征名字:['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

3.6 Tf-idf的重要性

分类机器学习算法进行文章分类中前期数据处理方式


4 小结

  • 特征提取【了解】

    • 将任意数据(如文本或图像)转换为可用于机器学习的数字特征
  • 特征提取分类:【了解】
    • 字典特征提取(特征离散化)
    • 文本特征提取
    • 图像特征提取
  • 字典特征提取【知道】
    • 字典特征提取就是对类别型数据进行转换
    • api:sklearn.feature_extraction.DictVectorizer(sparse=True,…)
      • aparse矩阵

        • 1.节省内容
        • 2.提高读取效率
      • 注意:
        • 对于特征当中存在类别信息的我们都会做one-hot编码处理
  • 文本特征提取(英文)【知道】
    • api:sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

      • stop_words -- 停用词
      • 注意:没有sparse这个参数
      • 单个字母,标点符号不做统计
  • 文本特征提取(中文)【知道】
    • 注意:

      • 1.在中文文本特征提取之前,需要对句子(文章)进行分词(jieba)
      • 2.里面依旧可以使用停用词,进行词语的限制
  • tfidf【知道】
    • 主要思想:

      • 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的
      • 类别区分能力,适合用来分类
    • tfidf
      • tf -- 词频
      • idf -- 逆向文档频率
    • api:sklearn.feature_extraction.text.TfidfVectorizer
    • 注意:
      • 分类机器学习算法进行文章分类中前期数据处理方式

feature_extraction_demo.py 

# coding:utf-8from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jiebadef dict_demo():"""字典特征提取:return: None"""# 1.获取数据data = [{'city': '北京', 'temperature': 100},{'city': '上海', 'temperature': 60},{'city': '深圳', 'temperature': 30}]# 2.字典特征提取# 2.1 实例化transfer = DictVectorizer(sparse=True)# 2.2 转换new_data = transfer.fit_transform(data)print(new_data)# 2.3 获取具体属性名names = transfer.get_feature_names()print("属性名字是:\n", names)def english_count_demo():"""文本特征提取-英文:return: None"""# 获取数据data = ["life is is short,i like python","life is too long,i dislike python"]# 文本特征转换# transfer = CountVectorizer(sparse=True)  # 注意:没有sparse这个参数transfer = CountVectorizer(stop_words=["dislike"])new_data = transfer.fit_transform(data)# 查看特征名字names = transfer.get_feature_names()print("特征名字是:\n", names)print(new_data.toarray())print(new_data)def chinese_count_demo1():"""文本特征提取-中文:return: None"""# 获取数据data = ["人生 苦短,我 喜欢 Python", "生活 太长久,我 不喜欢 Python"]# 文本特征转换transfer = CountVectorizer()new_data = transfer.fit_transform(data)# 查看特征名字names = transfer.get_feature_names()print("特征名字是:\n", names)print(new_data.toarray())print(new_data)def cut_word(text):"""中文分词:param text::return:"""# ret = " ".join(list(jieba.cut(text)))# print(ret)return " ".join(list(jieba.cut(text)))def chinese_count_demo2():"""文本特征提取-中文:return: None"""# 1.获取数据data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]# 2.文章分割list = []for temp in data:list.append(cut_word(temp))print(list)# 3.文本特征转换# 3.1 实例化+转化transfer = CountVectorizer(stop_words=["一种", "今天"])new_data = transfer.fit_transform(list)# 3.2 查看特征名字names = transfer.get_feature_names()print("特征名字是:\n", names)print(new_data.toarray())print(new_data)def tfidf_demo():"""文本特征提取-中文:return: None"""# 1.获取数据data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]# 2.文章分割list = []for temp in data:list.append(cut_word(temp))print(list)# 3.文本特征转换# 3.1 实例化+转化transfer = TfidfVectorizer()new_data = transfer.fit_transform(list)# 3.2 查看特征名字names = transfer.get_feature_names()print("特征名字是:\n", names)print(new_data.toarray())print(new_data)if __name__ == '__main__':dict_demo()english_count_demo()chinese_count_demo1()cut_word("我爱你python, 人生苦读,我用python")chinese_count_demo2()tfidf_demo()

特征工程-特征提取:字典特征提取、文本特征提取、jieba分词处理、Tf-idf文本特征提取相关推荐

  1. 使用lingpipe自然语言处理包进行文本分类/** * 使用 lingpipe的tf/idf分类器训练语料 * * @author laigood */ public class trai

    /**  * 使用 lingpipe的tf/idf分类器训练语料  *   * @author laigood  */ public class traintclassifier { //训练语料文件 ...

  2. 机器学习 笔记05——特征工程之特征处理:字典特征提取、文本特征提取

    目录 1.类别型特征的处理-特征编码 1.1 处理少量特征 1.2 处理大量的类别特征 1.3 字典特征提取(特征离散化) ⭐ 1.4   文本特征提取(英文+中文)⭐ 1.4.1 英文数据演示 1. ...

  3. Python机器学习入门笔记(1)—— Scikit-learn与特征工程

    目录 机器学习算法分类 数据集工具 Scikit-learn Scikit-learn的安装 scikit-learn数据集API介绍 bunch对象 datasets模块 数据集的划分 train_ ...

  4. 机器学习笔记(二)——特征工程

    文章目录 前言 一.数据集 概念 可用数据集 Kaggle UCI Scikit-learn 鸢尾花案例 数据集的划分 程序数据集下载 二.特征抽取 介绍 字典的特征提取 文本特征提取(英文) 中文文 ...

  5. 从零开始学习机器学习五:决策树算法特征工程

    决策树&特征工程 目标 1 简介 1.1 认识决策树 2 分类原理 2.1 熵 2.2 决策树的划分依据一-信息增益 2.3 决策树的划分依据二-信息增益率 2.4 决策树的划分依据三-基尼值 ...

  6. 数据预处理与特征工程—12.常见的数据预处理与特征工程手段总结

    文章目录 引言 1.数据预处理 1.1 数据清洗 1.1.1 异常值处理 1.1.2 缺失值处理 1.2 特征预处理 1.2.1 数值型特征无量纲化 1.2.2 连续数值型特征分箱 1.2.2.1 无 ...

  7. 【特征工程】(未完成)特征选择

    [特征工程](未完成)特征选择 特征选择 特征选择是特征工程中的重要问题(另一个重要的问题是特征提取),坊间常说:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.由此可见,特征工程尤 ...

  8. 特征工程--特征离散化的意义

    连续特征的离散化:在什么情况下将连续的特征离散化之后可以获得更好的效果? Q:CTR预估,发现CTR预估一般都是用LR,而且特征都是离散的.为什么一定要用离散特征呢?这样做的好处在哪里? A: 在工业 ...

  9. 机器学习之恶意流量检测的特征工程

    背景 传统的机器学习除了使用Tfidf-ngram的方式外还有其他做特征工程方式,还可以通过定义不同维度的特征来做特征工程,这种特征工程方式需要安全工程师对每一种攻击有良好特征提取能力.这种方法举个例 ...

  10. 03_机器学习流程_特征工程

    二.特征工程(特征处理) 特征工程是将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测的准确性. 1.环境配置 安装scikit-learn步骤:(前提需要Numpy ...

最新文章

  1. 串结构练习——字符串匹配 解题报告
  2. 2021高考成绩查询时间 新闻,教育资讯:2021高考成绩一般公布时间 多久出成绩...
  3. java设置图书管理系统界面设计_java 图书管理系统 界面漂亮 绝对好用
  4. Java字符类isUpperCase()方法与示例
  5. mysql存储过程执行update_MySQL存储过程实现动态执行SQL
  6. Denoise 方法汇总
  7. RocketMQ核心概念(翻译)
  8. iframe 父级元素查找
  9. 「SDOI2017」树点涂色 解题报告
  10. Window应急响应(五):ARP病毒
  11. QML QtLocation地图应用学习-4:行政区划
  12. idea全局搜索替换快捷键
  13. Linpack的安装与测试(Mpi+Goto+hpl)
  14. FreeRTOS 任务调度算法
  15. [548]OpenCV之cv2函数
  16. 《性能之巅—洞悉系统、企业与云计算》读书笔记---第二章
  17. mye连接mysql数据库_myeclipse连接数据库
  18. ERROR 1197 (HY000)问题原因及解决方法
  19. 不要把5G压力都留给运营商,华为自动驾驶网络是个聪明的方法
  20. ARFoundation之路-环境配置(iOS)之二

热门文章

  1. 数独九宫格专家级解题思路
  2. 浏览器字体变大|变小怎么办,浏览器字体大小设置方法
  3. Linux完美学习笔记
  4. NLP 的巨人肩膀(下):从 CoVe 到 BERT
  5. 怎样在线生成ICO 图标?图片怎么转ICO图标?
  6. 蒙特卡罗方法C语言求定积分,蒙特卡罗方法计算定积分
  7. 新浪微博开放平台开发步骤简介(适合新手看)
  8. 如何将mac中的资料拷贝到U盘,移动硬盘(实用!!!)
  9. Dhtmlx Gantt中lightbox如何自定义name值
  10. 第七周 项目4 - 队列数组