零基础学python--机器学习:特征提取(代码片段)

是Dream呀 是Dream呀     2022-12-02     525

关键词:

@TOC

特征提取

学习目标

  • 应用DictVectorizer实现对类别特征进行数值化、离散化
  • 应用CountVectorizer实现对文本特征进行数值化
  • 应用TfidfVectorizer实现对文本特征进行数值化
  • 说出两种文本特征提取的方式区别

什么是特征提取呢?

1.特征提取

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

注:特征值化是为了计算机更好的去理解数据
  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取(深度学习将介绍)

特征提取API

sklearn.feature_extraction

2.字典特征提取

作用:对字典数据进行特征值化 -类别->one-hot编码
sklearn.feature_extraction.DictVectorizer(sparse=True,…)

  • DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
  • DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
  • DictVectorizer.get_feature_names() 返回类别名称

vector:向量

  • 矩阵 matrix 二维数组
  • 向量 学习投入 一维数组

父类:转换器类

  • 返回sparse矩阵
  • sparse稀疏
    • 将非零值 按位置表示出
    • 节省内存 - 提高加载效率

2.1 应用

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

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

2.2流程分析

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

[city: 北京,temperature:100
city: 上海,temperature:60
city: 深圳,temperature:30]
  1. 实例化类DictVectorizer
  2. 调用fit_transform方法输入数据并转换(注意返回格式)

    没有加上sparse=False

    DictVectorizer():默认sparse=True

    
    from sklearn.feature_extraction import DictVectorizer

def dict_demo():
"""
对字典类型的数据进行特征抽取
:return: None
"""
data = [city: 北京,temperature:100, city: 上海,temperature:60, city: 深圳,temperature:30]

1、实例化一个转换器类

transfer = DictVectorizer()
# 2、调用fit_transform
data = transfer.fit_transform(data)
print("返回的结果:\\n", data)
# 打印特征名字
print("特征名字:\\n", transfer.get_feature_names())

return None

![在这里插入图片描述](https://s2.51cto.com/images/blog/202208/28181016_630b3f083fa9a92807.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
这个结果并不是我们想要看到的,所以加上参数,得到想要的结果:
#### 加上sparse=False

![在这里插入图片描述](https://s2.51cto.com/images/blog/202208/28181016_630b3f085e7bd97769.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
我们可以看这两个有什么关系:
第一个其实是sparse稀疏矩阵,就是**把第二个中的非零元素用坐标表示出来啦**
1. 将非零值 按位置表示出来
 2. 节省内存 - 提高加载效率

我们把这个处理数据的技巧叫做”one-hot“编码。
![在这里插入图片描述](https://s2.51cto.com/images/blog/202208/28181016_630b3f0850e3d25584.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
转化为:
![在这里插入图片描述](https://s2.51cto.com/images/blog/202208/28181016_630b3f088025358778.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### 2.3总结
**应用场景:**
                            **1)pclass, sex 数据集当中类别特征比较多**
 -  1、将数据集的特征-》字典类型
 - 2、DictVectorizer转换

 **2)本身拿到的数据就是字典类型**
**对于特征当中存在类别信息的我们都会做one-hot编码处理**
## 3.文本特征提取
**作用:对文本数据进行特征值化**
 单词 作为 特征
             句子、短语、单词、字母
                 特征:特征词
#### 方法1:CountVectorizer
**sklearn.feature_extraction.text.CountVectorizer(stop_words=[])**
返回词频矩阵,**stop_words停用的**
- CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
- CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
- CountVectorizer.get_feature_names() 返回值:单词列表
####  方法2:TfidfVectorizer
TF-IDF - 重要程度
                            两个词 “经济”,“非常”
                            **看4.Tf-idf文本特征提取**
### 3.1应用
我们对以下数据进行特征提取

```python
["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 CountVectorizer

def 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)
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data = transfer.fit_transform(data)
    print("文本特征抽取的结果:\\n", data.toarray())
    print("返回特征名字:\\n", transfer.get_feature_names())

    return None

返回结果:
统计每个样本特征词出现的个数

关键词消除

stop_words 消除不需要的关键词

def count_demo():
    """
    文本特征抽取:CountVecotrizer
    :return:
    """
    data = ["life is short,i like python", "life is too long,i dislike python"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=[is,too])

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\\n", data_new.toarray())
    print("特征名字:\\n", transfer.get_feature_names())

    return None

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

"我爱北京天安门", "天安门上太阳升"
def count_chinese_demo():
    """
    中文文本特征抽取:CountVecotrizer
    :return:
    """
    data = ["我爱北京天安门", "天安门上太阳升"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\\n", data_new.toarray())
    print("特征名字:\\n", transfer.get_feature_names())
    return None

那么最终得到的结果是:

只是因为它不会把中文分开,只是按照‘,’将字符串分开,我们此时用空格把这句话分一下,看看会出现啥结果:

"我 爱 北京 天安门", "天安门 上 太阳 升"


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

3.jieba分词处理

jieba.cut()

  • 返回词语组成的生成器

需要安装下jieba库

pip3 install jieba

我爱北京天安门进行分析:

def cut_word(text):
    """
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return:
    """
    return " ".join(list(jieba.cut(text)))

得到如下结果:

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

分析

  1. 准备句子,利用jieba.cut进行分词
  2. 实例化CountVectorizer
  3. 将分词结果变成字符串当作fit_transform的输入值
from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_word(text):
    """
    对中文进行分词
    "我爱北京天安门"————>"我 爱 北京 天安门"
    :param text:
    :return: text
    """
    # 用结巴对中文字符串进行分词
    text = " ".join(list(jieba.cut(text)))

    return text

def 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_transform
    data = transfer.fit_transform(text_list)
    print("文本特征抽取的结果:\\n", data.toarray())
    print("返回特征名字:\\n", transfer.get_feature_names())

    return None

得到我们需要的结果:

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

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

4.Tf-idf文本特征提取

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

4.1公式

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

    最终得出结果可以理解为重要程度。
    TF-IDF - 重要程度
    两个词 “经济”,“非常”,1000篇文章-语料库,100篇文章 - "非常",10篇文章 ,“经济”两篇文章
    文章A(100词) : 10次“经济”
  • TF-IDF:0.2
  • tf:10/100 = 0.1
  • idf:lg 1000/10 = 2
    文章B(100词) : 10次“非常” TF-IDF:0.1
  • tf:10/100 = 0.1
  • idf: log 10 1000/100 = 1

TF - 词频(term frequency,tf)
IDF - 逆向文档频率

def cut_word(text):
"""
对中文进行分词
"我爱北京天安门"————>"我 爱 北京 天安门"
:param text:
:return: text
"""

用结巴对中文字符串进行分词

text = " ".join(list(jieba.cut(text)))

return text

def 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_transform
data = transfer.fit_transform(text_list)
print("文本特征抽取的结果:\\n", data.toarray())
print("返回特征名字:\\n", transfer.get_feature_names())

return None

**结果:**
![在这里插入图片描述](https://s2.51cto.com/images/blog/202208/28181016_630b3f0872cd882191.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
**结果大的便可以体现出这个词比较重要。**

**Tf-idf的重要性**:
分类机器学习算法进行文章分类中前期数据处理方式

零基础学python--机器学习:数据集及特征工程介绍(代码片段)

@TOC一、数据集1.可用数据集公司内部百度数据接口花钱学习阶段可用的数据集:1.sklearn,2.kaggle,3.UCIKaggle网址:https://www.kaggle.com/datasetsUCI数据集网址:http://archive.ics.uci.edu/ml/scikit-learn网址:http://scikit-learn.org/stable/datasets/ind 查看详情

零基础学python--机器学习:机器学习算法和开发

@TOC一、机器学习算法分类1.分析1.2中的例子分类问题特征值:猫/狗的图片;目标值:猫/狗-类别分类问题↑回归问题特征值:房屋的各个属性信息;回归问题无监督学习特征值:人物的各个属性信息;目标值:无无监督学习2.总... 查看详情

黄佳《零基础学机器学习》chap1笔记(代码片段)

黄佳《零基础学机器学习》chap1笔记这本书实在是让我眼前一亮!!!感觉写的真的太棒了!文章目录黄佳《零基础学机器学习》chap1笔记第1课机器学习快速上手路径——唯有实战1.1机器学习族谱1.2云环境入门实... 查看详情

零基础学python--机器学习:人工智能与机器学习概述

@TOC一、机器学习与人工智能、深度学习了解机器学习定义以及应用场景说明机器学习算法监督学习与无监督学习的区别说明监督学习中的分类、回归特点说明机器学习算法目标值的两种数据类型说明机器学习(数据挖掘)的开发流... 查看详情

python机器学习从零开始数据准备(代码片段)

...解和专业知识的掌握。在机器学习的应用开发中,最基础的是特征工程。——吴恩达 1.数据预处理数据预处理需要根据数据本身的特性进行,有缺失的要填补 查看详情

黄佳《零基础学机器学习》chap3笔记(代码片段)

黄佳《零基础学机器学习》chap3笔记第3课线性回归——预测网店的销售额文章目录黄佳《零基础学机器学习》chap3笔记第3课线性回归——预测网店的销售额3.1问题定义:小冰的网店广告该如何投放3.2数据的收集和预处理3.2.1... 查看详情

转行零基础该如何学python?

对于python的入门首先会学习python基础语法,面向对象编程与程序设计模式的理解、python数据分析基础、python网络编程、python并发与高效编程等等。通过前期python学习来了解和掌握常量变量的使用,运算符的使用、流程控制的使用... 查看详情

机器学习之数据清洗与特征提取

...技术实践干货哦~作者:汪毅雄导语:本文详细的解释了机器学习中,经常会用到数据清洗与特征提取的方法PCA,从理论、数据、代码三个层次予以分析。 机器学习,这个名词大家都耳熟能详。虽然这个概念很早就被人提出... 查看详情

sklearn机器学习基础(day01基本数据处理)(代码片段)

文章目录环境数据集特征提取字典特征提取文本特征提取One-Hot编码中文文本处理TF-IDF处理运算规则代码数据预处理归一化标准化降维特征选择Filter过滤方式低方差过滤相关系数主成分分析PCA小结环境python3.7sklearnn... 查看详情

文本特征提取专题_以python为工具python机器学习系列(代码片段)

文章目录1.字典文本特征提取DictVectorizer()1.1one-hot编码1.2字典数据转sparse矩阵2.英文文本特征提取3.中文文本特征提取4.TF-IDF文本特征提取TfidfVectorizer()      ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡... 查看详情

火炉炼ai机器学习050-提取图像的star特征(代码片段)

...火炉炼AI】机器学习050-提取图像的Star特征(本文所使用的Python库和版本号:Python3.6,Numpy1.14,scikit-learn0.19,matplotlib2.2)对于图像的特征点,前面我们讨论过边缘检测方法,Harris角点检测算法等,这些检测算法检测的都是图像的轮廓边缘... 查看详情

机器学习算法:特征工程-特征提取(代码片段)

....1定义将任意数据(如文本或图像)转换为可用于机器学习的数字特征注:特征值化是为了计算机更好的去理解数据特征提取分类:字典特征提取(特征离散化)文本特征提取图像特征提取(深度学习将介绍) 查看详情

机器学习基础教程笔记---特征工程(代码片段)

目录特征工程2.1数据集2.1.1可用数据集2.1.2sklearn数据集2.1.3数据集的划分2.2特征工程介绍学习目标2.2.1为什么需要特征工程(FeatureEngineering)2.2.2什么是特征工程2.2.3特征工程的位置与数据处理的比较​2.3特征提取学习目标2.3.1特征提... 查看详情

零基础学pythonday13python函数(代码片段)

...起学习了Python循环语句,没学的兄弟姐妹们看这里零基础学Python,今天让我们开始学习Python函数吧。需注意的是,【零基础学Python】此系列都使用Python3。函数Python中的函数类似于其它编程语言中的方法,主要为了... 查看详情

零基础学pythonday13python函数(代码片段)

...起学习了Python循环语句,没学的兄弟姐妹们看这里零基础学Python,今天让我们开始学习Python函数吧。需注意的是,【零基础学Python】此系列都使用Python3。函数Python中的函数类似于其它编程语言中的方法,主要为了... 查看详情

零基础学pythonday11python条件控制(代码片段)

...一起学习了Python解释器,没学的兄弟姐妹们看这里零基础学Python,今天让我们开始学习Python条件控制吧。需注意的是,【零基础学Python】此系列都使用Python3。条件控制Python条件控制是指通过一条或多条语句的执行结... 查看详情

机器学习特征工程->特征提取(代码片段)

特征工程:特征提取前言1.特征提取1.1定义1.2特征提取API2.字典特征提取2.1应用2.2流程分析2.3总结3.文本特征提取3.1应用3.2流程分析3.3jieba分词处理3.4案例分析3.5Tf-idf文本特征提取3.5.1公式3.5.2案例3.6Tf-idf的重要性4.小结前言学... 查看详情

零基础学pythonday10python解释器(代码片段)

...一起学习了Python推导式,没学的兄弟姐妹们看这里零基础学Python,今天让我们开始学习Python解释器吧。需注意的是,【零基础学Python】此系列都使用Python3。解释器Python解释器有多种,像CPython、IPython、Jython、PyPy、... 查看详情