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

2.2 特征工程介绍

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

靓仔的python机器学习入门2.2-特征工程-特征提取_第1张图片

2.2.2 什么是特征工程

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

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

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

2.3.1 特征抽取/提取:

机器学习算法 - 统计方法 - 数学公式
文本类型 - > 数值类型
类型 - >数值
靓仔的python机器学习入门2.2-特征工程-特征提取_第2张图片

2.3.2 字典的特征提取

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

靓仔的python机器学习入门2.2-特征工程-特征提取_第3张图片
字典特征提取 - 类别 -> 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。
靓仔的python机器学习入门2.2-特征工程-特征提取_第4张图片

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

2.3.3 文本特征提取

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

靓仔的python机器学习入门2.2-特征工程-特征提取_第5张图片
英文文本数据特征化代码测试:

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
靓仔的python机器学习入门2.2-特征工程-特征提取_第6张图片
单个字母“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

测试结果:
靓仔的python机器学习入门2.2-特征工程-特征提取_第7张图片

2.3.4 Tf-idf文本特征提取

靓仔的python机器学习入门2.2-特征工程-特征提取_第8张图片
靓仔的python机器学习入门2.2-特征工程-特征提取_第9张图片
方法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

靓仔的python机器学习入门2.2-特征工程-特征提取_第10张图片
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

测试结果:
数值越大的,表示越有分类意义的词,更为重要
靓仔的python机器学习入门2.2-特征工程-特征提取_第11张图片

你可能感兴趣的:(机器学习,机器学习,python,人工智能)