• 靓仔的python机器学习入门2.2-特征工程-特征提取


    2.2 特征工程介绍

    2.2.1 为什么需要特征工程(Feature Engineering)

    在这里插入图片描述

    2.2.2 什么是特征工程

    特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
    意义:会直接影响机器学习的效果。

    sklearn :特征工程
    pandas:数据清洗、数据处理

    特征工程包含的内容:特征抽取/提取、特征预处理、特征降维

    2.3.1 特征抽取/提取:

    机器学习算法 - 统计方法 - 数学公式
    文本类型 - > 数值类型
    类型 - >数值
    在这里插入图片描述

    2.3.2 字典的特征提取

    vector 数学:向量 、物理:矢量
    	矩阵 matrix 二维数组
    	向量 vector 一维数组
    父类: 转换器类
    返回sparse矩阵
    	sparse稀疏
    		将非零值 按位置表示出来
    		节省内存 - 提高加载效率
    应用场景:
    	1) 数据集当中类别特征比较多
    		1.将数据集的特征-->字典类型
    		2.DicVectorizer转换
    	2)本身拿到的数据就是字典类型
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述
    字典特征提取 - 类别 -> one-hot 编码

    对字典数据进行特征化代码测试:

    from sklearn.feature_extraction import DictVectorizer
    
    def dict_demo():
        """
        字典特征抽取
        :return:
        """
        data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
        # 1.实例化一个转换器类
        transfer = DictVectorizer(sparse=False) #sparse默认为true(则是稀疏矩阵)
        # 2.调用fit_transform()
        data_new = transfer.fit_transform(data)
        print("data_new:\n", data_new)
        print("特征名字:\n",transfer.get_feature_names_out())
    
        return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    测试结果:
    每一行代表一个样本,共三行,分别对应的是data中的一个列表元素(字典形式)。每一列代表类别,共四列,分别代表上海、北京、深圳、temperature。

    例如第一行的样本:第二个数为1,对应的是类别为北京,第四个数为100,对应的类别就是温度为100.所以可用这种“one-hot编码”的形式表示出第一个样本的信息为,城市:北京,温度:100。
    在这里插入图片描述

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

    2.3.3 文本特征提取

    单个字 作为特征
    句子、短语、单字、字母
    特征:特征词
    方法1:CountVectorizer 
    	统计每个样本特征词出现的个数
    	stop_words 参数用来停用一些无意义的词(列表形式)
    关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    英文文本数据特征化代码测试:

    from sklearn.feature_extraction.text import CountVectorizer
    
    def count_demo():
        """
        文本特征抽取 :CountVecotrizer
        :return:
        """
        data = ["life is short,I like like python", "life is too long,I dislike python"]
        # 1.实例化一个转换器
        transfer = CountVectorizer() #默认是稀疏矩阵
    
        # 2.调用fit_transform(data)
        data_new = transfer.fit_transform(data)
        print("data_new:\n", data_new.toarray()) #toarray可以把稀疏矩阵转化为二维数组(矩阵)
        print("特征名字:\n", transfer.get_feature_names_out())
    
        return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    测试结果:
    例如第一行数据为第一个文本数据样本,其中第四个数据为特征词“like”,且数量为2
    在这里插入图片描述
    单个字母“i”,或者标点符号等,在分类或者情感分析的时候意义不大,所以没有

    中文文本数据特征化代码测试

    由于中文文本不像英文文本那样,每写一个单词都打一个空格,所以中文文本直接提取特征词的话,会直接出现“短句”,而我们特征词提取的目标是单个的“词”,所以我们有两个方案:
    方案一:每写一个词,我们就像写中文一样加一个空格,这种方法理论上可行,但实际上不符合我们写中文的习惯。
    方案二:使用分词工具包,例如“jieba”来对我们的中文句子进行分词后再提取特征词,下面有代码的演示:

    import jieba #y引用jieba库
    def count_chinese_demo():
        """
        中文文本特征抽取 :CountVecotrizer
        :return:
        """
        data = ["人生苦短,我喜欢蟒蛇", "人生太长,我不喜欢蟒蛇"]
        # 1.实例化一个转换器
        transfer = CountVectorizer(stop_words=["一种","所以"]) #默认是稀疏矩阵,stop_words参数用来停用一些没有太大意义的词(列表形式)
    
        # 2.调用fit_transform(data)
        # data_new = transfer.fit_transform(data)
        data_new = transfer.fit_transform(count_chinese_demo2())
    
        print("data_new:\n", data_new.toarray()) #toarray可以把稀疏矩阵转化为二维数组(矩阵)
        print("特征词:\n", transfer.get_feature_names_out())
    
        return None
    
    def cut_word(text):
        """
        将text进行中文分词
        :param text:
        :return:
        """
        # result = jieba.cut(text)
        # print(list(result)) #返回列表形式
        result = " ".join(list(jieba.cut(text))) #转化成字符串
        return result
    
    def count_chinese_demo2():
        """
        中文文本特征抽取,自动分词
        :return:
        """
        #1.将中文文本分词
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
        # print(cut_word("感谢你特别邀请,来见证你的爱情")) #测试字符串
        data_new = [] #用来接收进行分词后的文本
        for item in data:
            data_new.append(cut_word(item))
        # print(data_new)
        # print("*"*50)
        return data_new
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    测试结果:
    在这里插入图片描述

    2.3.4 Tf-idf文本特征提取

    在这里插入图片描述
    在这里插入图片描述
    方法2:TfidfVectorizer
    TF-IDF - 重要程度
    例如:

    	两个词 “经济”、“非常”
    	1000篇文章-语料库
    	100篇文章-“非常”
    	10篇文章 - “经济”
    	TF - 词频(term frequency,tf)
    	两篇文章
    	文章A (100词):10次“经济” “TF-IDF”:
    		tf:10/100=0.1
    		idf = log10(1000/10) = 2
    	文章B (100词):10次“非常” “TF-IDF”:
    		tf:10/100=0.1
    		idf:log10(1000/100) = 1
    	TF - 词频(term frequency,tf)
    	IDF  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.3.5 Tf-idf文本特征提取API

    在这里插入图片描述
    Tf文本特征提取代码测试:

    def tfidf_demo():
        """
        用TF-IDF的方法进行文本特征抽取
        :return:
        """
        # 1.将中文文本分词
        data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
                "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
                "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
        data_new = []  # 用来接收进行分词后的文本
        for item in data:
            data_new.append(cut_word(item))
        # 1.实例化一个转换器类
        transfer = TfidfVectorizer(stop_words=["一种", "所以"])
    
        # 2.调用fit_transform
        data_final = transfer.fit_transform(data_new)
        print("data_new:\n", data_final.toarray())
        print("特征名字:\n", transfer.get_feature_names_out())
        return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    测试结果:
    数值越大的,表示越有分类意义的词,更为重要
    在这里插入图片描述

  • 相关阅读:
    Cookie与Session的区别
    锁的优化机制了解吗?
    Ceph入门到精通-Macvlan网络模式
    什么是产线工控安全,如何保障产线设备的安全
    Java 网络编程 —— 创建非阻塞的 HTTP 服务器
    大数据算法系列13:最小生成树算法
    iSlide2024一款基于PPT的插件工具包含38个设计辅助功能
    vue实现全局消息提醒功能(vue-extend)
    结构型设计模式
    eachers地图的配置
  • 原文地址:https://blog.csdn.net/qq_42577508/article/details/125871456