机器学习 - 特征提取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/apollo_miracle/article/details/88793421

学习目标

  1. 应用DictVectorizer实现对类别特征进行数值化、离散化

  2. 应用CountVectorizer实现对文本特征进行数值化

  3. 应用TfidfVectorizer实现对文本特征进行数值化

  4. 说出两种文本特征提取的方式区别

1 特征提取

1.1 定义

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

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

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

1.2 特征提取API

sklearn.feature_extraction

2 字典特征提取

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

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

2.1 应用

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

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

2.2 流程分析

  • 实例化类DictVectorizer
  • 调用fit_transform方法输入数据并转换(注意返回格式)
def dictvec():
    # 实例化dict
    dict = DictVectorizer(sparse=False)
    my_dict_list = [{'city': '北京', 'temperature': 100},
                    {'city': '上海', 'temperature': 60},
                    {'city': '深圳', 'temperature': 30}]
    # 调用 fit_transform方法输入数据并转换(注意返回格式)
    data = dict.fit_transform(my_dict_list)
    # 打印每一个列的名称
    print(dict.get_feature_names())
    print(data)

    return None

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

这个结果并不是我们想要看到的,所以加上参数,得到想要的结果,在这里我们把这个处理数据的技巧用专业的称呼"one-hot"编码。

2.3 总结

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

3 文本特征提取

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

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

    • 返回词频矩阵
  • CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
  • CountVectorizer.inverse_transform(X) X:array数组或者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数组)
def countvec():
    # 实例化conunt
    count = CountVectorizer()
    data = count.fit_transform(["life is is short,i like python", "life is too long,i dislike python"])
    # 内容
    print(count.get_feature_names())
    # 利用toarray()进行sparse矩阵转换array数组
    print(data.toarray())

    return None

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

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

那么最终得到的结果是

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

3.3 jieba分词处理

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

需要安装下jieba库

pip install jieba

3.4 案例分析

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

今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。

我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。

如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
  • 分析
    • 准备句子,利用jieba.cut进行分词
    • 实例化CountVectorizer
    • 将分词结果变成字符串当作fit_transform的输入值

def cutword():
    # 将三个句子用jieba.cut处理
    contetn1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
    contetn2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
    contetn3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
    # 先将着三个转换成列表
    c1 = ' '.join(list(contetn1))
    c2 = ' '.join(list(contetn2))
    c3 = ' '.join(list(contetn3))

    return c1, c2, c3


def chvec():
    # 实例化conunt
    count = CountVectorizer(stop_words=['不要', '我们', '所以'])
    # 定义一个分词的函数
    c1, c2, c3 = cutword()
    data = count.fit_transform([c1, c2, c3])
    # 内容
    print(count.get_feature_names())
    print(data.toarray())

    return None

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

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,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15

3.5.2 案例

def tfidfvec():

    # 实例化conunt
    tfidf = TfidfVectorizer()
    # 定义一个分词的函数
    c1, c2, c3 = cutword()
    data = tfidf.fit_transform([c1, c2, c3])
    # 内容
    print(tfidf.get_feature_names())
    print(data.toarray())

    return None

3.6 Tf-idf的重要性

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

猜你喜欢

转载自blog.csdn.net/apollo_miracle/article/details/88793421