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

本文深入浅出地讲解了特征工程的重要性,包括为何需要、特征抽取与提取(如文本转数值、字典编码)、Tf-idf文本处理等技巧。通过实例演示,展示了如何将类别特征转化为one-hot编码,以及如何利用CountVectorizer和TfidfVectorizer进行文本特征提取,提升机器学习模型性能。
摘要由CSDN通过智能技术生成

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)本身拿到的数据就是字典类型

在这里插入图片描述
字典特征提取 - 类别 -> 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

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

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

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

2.3.3 文本特征提取

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

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

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

测试结果:
例如第一行数据为第一个文本数据样本,其中第四个数据为特征词“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

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

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  

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值