scikit-learn特征抽取

为什么需要特征工程

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已

什么是特征工程

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程

意义:会直接影响机器学习的效果

特征工程的位置与数据处理的比较

  • pandas:一个数据读取非常方便以及基本的处理格式的工具
  • sklearn:对于特征的处理提供了强大的接口

特征工程包含内容:

  • 特征抽取
  • 特征提取
  • 特征预处理
  • 特征降维

什么是特征提取

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

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

字典特征提取(特征离散化)

文本特征提取

图像特征提取(深度学习再介绍)

特征提取API

bash 复制代码
sklearn.feature_extraction

CountVectorizer_字典特征提取

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

bash 复制代码
sklearn.feature_extraction.DictVectorizer(sparse=True, ...)

DictVectorizer.fit_transform(X), X:字典或者包含字典的迭代器返回值,返回sparse矩阵

DictVectorizer.inverse_transform(X), X:array数组或者sparse矩阵 返回值:转换之前数据格式

DictVectorizer.get_feature_names():返回类别名称

bash 复制代码
from sklearn.feature_extraction import DictVectorizer


def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city':'北京', 'temperature':100},
            {'city':'上海', 'temperature':60},
            {'city':'深圳', 'temperature':30}]
    # 1、实例化一个转换器类
    #transfer = DictVectorizer() # 返回sparse矩阵
    transfer = DictVectorizer(sparse=False)
    #print(transfer)
    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)   # 转化后的
    print("特征名字:\n",transfer.feature_names_)

    return None


if __name__ == "__main__":
    dict_demo()

CountVectorizer_文本特征提取

单词作为特征

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

  • 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_英文文本分词

bash 复制代码
from sklearn.feature_extraction.text import CountVectorizer


def count_demo():
    """
    文本特征抽取:CountVectorizer
    :return:
    """
    # todo 准备数据集
    data = ['life is short,i like python',
            'life is too long,i dislike python']
    # 1、实例化一个转换器类
    """
    标点符号和字符api设置默认不计算在统计数据中
    """
    # todo 统计特征词的个数,实例化方法 CountVectorizer()
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  # toarray转换为二维数组
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


if __name__ == "__main__":
    count_demo()

CountVectorizer_停用词:stop_words=[]

在文本处理中,因为出现频率过高或者并没有实际意义,而被忽略不计的词汇

  • todo 忽略 is 和 too 两个词不统计
bash 复制代码
stop_words=['is', 'too']
bash 复制代码
from sklearn.feature_extraction.text import CountVectorizer


def count_demo():

    """
    文本特征抽取:CountVectorizer
    :return:
    """

    data = ['life is short,i like like python',
            'life is too long,i dislike python']

    # 1、实例化一个转换器类
    # todo 忽略 is 和 too 两个词不统计
    transfer = CountVectorizer(stop_words=['is', 'too'])
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  # toarray转换为二维数组
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


if __name__ == "__main__":
    count_demo()

CountVectorizer_中文文本分词

注意:不支持单个中文词!

这个方法是计算特征词出现的个数的

bash 复制代码
from sklearn.feature_extraction.text import CountVectorizer


def count_demo():
    """
    文本特征抽取:CountVectorizer
    :return:
    """
    data = ['我 爱 北京 天安门',
            '天安门 上 太阳 升']
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  # toarray转换为二维数组
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


if __name__ == "__main__":
    count_demo()


英文是默认按照空格进行分词的,那么中文就得手动进行空格分词,要想自动化就需要使用分词器

bash 复制代码
from sklearn.feature_extraction.text import CountVectorizer
import jieba


def count_chinese_demo2():
    """
    中文文本特征抽取,自动分词
    :return:
    """
    data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
            '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
            '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)

    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())

    return None


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

    return ' '.join(jieba.cut(text))


if __name__ == "__main__":
    count_chinese_demo2()

Tf-idf文本特征提取

  • Tf-idf的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
  • Tf-idf作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
    这种方法是计算特征词的重要程度的
  • TF-IDF:衡量重要程度
  • TF:词频
  • IDF:逆向文档频率,可以由总文件数目 / 包含该词语之文件的数目,再将得到的商取以10为底的对数得到
bash 复制代码
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba


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

    return ' '.join(jieba.cut(text))


def tfidf_demo():
    """
    用TF-IDF的方法进行文本特征抽取
    :return:
    """
    data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
            '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
            '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)

    # 1、实例化一个转换器类
    transfer = TfidfVectorizer()
    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())
    return None

if __name__ == '__main__':
    tfidf_demo()


相关推荐
奈斯。zs13 分钟前
yjs08——矩阵、数组的运算
人工智能·python·线性代数·矩阵·numpy
Melody205013 分钟前
tensorflow-dataset 内网下载 指定目录
人工智能·python·tensorflow
学步_技术15 分钟前
Python编码系列—Python抽象工厂模式:构建复杂对象家族的蓝图
开发语言·python·抽象工厂模式
Narutolxy1 小时前
Python 单元测试:深入理解与实战应用20240919
python·单元测试·log4j
Amo Xiang1 小时前
2024 Python3.10 系统入门+进阶(十五):文件及目录操作
开发语言·python
liangbm31 小时前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
潮汐退涨月冷风霜1 小时前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习
LQS20201 小时前
机器学习与深度学习之间的区别
机器学习
B站计算机毕业设计超人2 小时前
计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
爬虫·python·深度学习·算法·机器学习·自然语言处理·数据可视化
羊小猪~~2 小时前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn