特征工程的定义
-
常用的数据集的组成
特征值+目标值
每一行称为“样本”,列即为“特征”,收集一个样本就需要特征,收集的特征对于目标值的影响是不同的,
在数据集没有目标值的时候应该怎样去定义问题?
-
pandas读取数据dataFrame涉及到的问题
(1)缺失值,可以用pd来补全(数据转换)
(2)重复值,重复值是否需要处理?不需要去重.如果数据一样,是不影响学习的,如果第一次投入的数据可能学到的东西很多,第二次从这些样本中可能会学习到新的东西。
(3)pandas是一个数据读取非常方便以及基本的处理格式的工具
-
特征工程就是对特征进行处理的一系列的手段和相应内容
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QArLD9Jx-1625631495955)(D:/Typora_pictures/image-20210707101154948.png)]
是一个循环的过程,如果获得的效果不好,还需要继续进行特征工程的处理
特征工程的三个重要的方面:(必须掌握!!!)
(1)数据的特征抽取
(2)数据的特征预处理
(3)数据的降维
-
特征工程的定义
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高对未知数据的预测准确性。
eg:一篇文章输入,需要将输入的字符转换为一些能够代表这些字符意义的数字,然后再对这些数字进行处理。
-
特征工程的意义
直接影响预测结果
-
scikit-learn库简介
(1)python语言
(2)包括许多知名的机器学习算法的实现(主要弄懂算法原理)
-
安装scikit-learn(必须有pandas、numpy这些基础库)
字典特征的抽取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dbpcqOoS-1625631495956)(D:/Typora_pictures/image-20210707102404592.png)]
特征抽取实际上是数据当中包含了很多文本和字符串,必须将数字转化成数字类型
-
特征抽取的例子
#coding=utf-8 # 特征抽取 # # 导入包 from sklearn.feature_extraction.text import CountVectorizer # 实例化CountVectorizer vector = CountVectorizer() # 调用fit_transform输入并转换数据 res = vector.fit_transform(["life is short, i like python","life is too long, i dislike python"]) # 打印结果 print(vector.get_feature_names()) print(res.toarray())
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-70e6LO6b-1625631495958)(D:/Typora_pictures/image-20210707103829997.png)]
特征值化是为了计算机更好的去理解数据
-
sklearn特征抽取API
sklearn.feature_extraction
-
字典特征抽取
对字典数据进行特征值化
sklearn.feature_extraction.DictVectorize(sparse=True,...)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s2DVk2M2-1625631495958)(D:/Typora_pictures/image-20210707105111756.png)]
-
流程
(1)实例化类DictVectorizer
(2)调用fit_tranfrom方法输入数据并转换 (注意返回格式)
-
sparse矩阵格式是啥?
-
sparse优势:
(1)节约内存,方便读取处理
-
例子
from sklearn.feature_extraction import DictVectorizer def dictvec(): """ 字典数据抽取 :return: None """ # 实例化 # dict = DictVectorizer(sparse=False) # 使用sparse矩阵形式存储 dict = DictVectorizer(sparse=False) # 调用fit_transform data = dict.fit_transform([{'city':'北京','temperature':100},{'city':'北京','temperature':100},{'city':'北京','temperature':100}]) print(data) if __name__ == "__main__": dictvec()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7zLf6NJ0-1625631495959)(D:/Typora_pictures/image-20210707110948980.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKiTLXck-1625631495960)(D:/Typora_pictures/image-20210707111004046.png)]
下面是用ndarray的形式存储,上面的是sparse数组形式,前面的元组是对应后面数值的坐标,后面的是该坐标位置的值。
-
字典数据抽取
把字典中一些类别数据,分别进行转换成特征;数值类型没有必要转化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OqRflIQ3-1625631495961)(D:/Typora_pictures/image-20210707111528823.png)]
-
数组形式,有类别的特征,先要转换成字典数据
one-hot编码?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JB98g7cd-1625631495961)(D:/Typora_pictures/image-20210707112116378.png)]
将代表类别的特征中的所有取值拿出成列,如果该样本属于某类,就在下面标记1, 否则标记0,最后的到每个样本关于这个特征的编码序列
-
inverse_transform()
from sklearn.feature_extraction import DictVectorizer def dictvec(): """ 字典数据抽取 :return: None """ # 实例化 dict = DictVectorizer(sparse=False) # 调用fit_transform data = dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'广州','temperature':40}]) print(dict.get_feature_names()) print(dict.inverse_transform(data)) print(data) if __name__ == "__main__": dictvec()
文本特征抽取以及中文问题
-
文本特征抽取的作用
对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer
-
CountVectorizer语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Ek6gokl-1625631495962)(D:/Typora_pictures/image-20210707112544106.png)]
-
流程
(1)实例化CountVectorizer
(2)调用fit_transform方法输入数据并转换(注意返回格式,利用toarray()进行sparse矩阵转换array数组)
-
实例分析
#coding=utf-8 # 导入包 from sklearn.feature_extraction.text import CountVectorizer def countvec(): """ 文本数据转化 :return: None """ cv = CountVectorizer() data = cv.fit_transform(["life is short, i like python","life is long, i dislike python"]) print(cv.get_feature_names()) print(data) print(data.toarray()) if __name__ == "__main__": countvec()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHqMJetx-1625631495963)(D:/Typora_pictures/image-20210707113433939.png)]
- 统计所有文章当中所有的词,重复的只看做一次(词的列表)
- 对每篇文章,在词的列表里面进行统计每个词出现的次数
- 单个字母不统计?why?一个英文字母没有反应文章的主题,一个字母没有情感趋向和分类标准,没有分类依据,所以不统计
-
用处:文本分类、情感分析
文本特征抽取:Count 不同文章根本区别就是文章组成的单词不同,所以文本特征抽取是最基本的
-
中文文章处理呢?
#coding=utf-8 # 导入包 from sklearn.feature_extraction.text import CountVectorizer def countvec(): """ 文本数据转化 :return: None """ cv = CountVectorizer() data = cv.fit_transform(["人生苦短, 我喜欢python","人生漫长,不喜欢python"]) print(cv.get_feature_names()) print(data) print(data.toarray()) if __name__ == "__main__": countvec()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Z9jLZKF-1625631495964)(D:/Typora_pictures/image-20210707114122059.png)]
并没有很好的分类,比如把喜欢、漫长这些词语分成一类,现在这种分类不能提出特征。所以中文不支持这种处理方式。单个的汉字也不统计。中文需要分词!!!
-
jieba分词
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jDfUDcLI-1625631495964)(D:/Typora_pictures/image-20210707114508866.png)]
-
实例
#coding=utf-8 # 导入包 from sklearn.feature_extraction.text import CountVectorizer import jieba def countvec(): """ 文本数据转化 :return: None """ c1,c2,c3 = cutword() print(c1,c2,c3) cv = CountVectorizer() data = cv.fit_transform([c1,c2,c3]) print(cv.get_feature_names()) # print(data) print(data.toarray()) def hanzivec(): """ 中文特征值化 :return: None """ def cutword(): con1 = jieba.cut(" 最常见的定义是:“主题是文章中通过具体材料所表达的基本思想。”这个定义由来已久,似无庸置疑,但仔细想来,它似有片面之嫌。") con2 = jieba.cut(" 常识告诉我们:文章是表情达意的工具。这个定义只及“达意”(表达的基本思想),而不及“表情”,岂不为缺漏?或谓“达意”即“表情”?") con3 = jieba.cut(" 若然,岂不是说情感与思想等同?但心理学研究早已证明,情感是与思维不同的心理过程,它“具有独特的主观体验的形式和外部表现的形式”,具有极为复杂的社会内容。") # 转换成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表转换成字符串 c1 = ' '.join(content1) c2 = ' '.join(content2) c3 = ' '.join(content3) return c1,c2,c3 if __name__ == "__main__": countvec()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-td2Mcigk-1625631495964)(D:/Typora_pictures/image-20210707115546803.png)]
具体操作的时候如果是真正的文章,需要使用循环语句来进行分割
流程:
(1)使用jieba对文章进行分词
(2)实例化CountVectorizer
(3)将分词结果转换为字符串然后在进行分类
tf-df分析问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XwQQ9zz6-1625631495965)(D:/Typora_pictures/image-20210707120350978.png)]
一般直接使用词语占比,统计词语出现次数进行文本分类比较少,不这样做。
使用tfidf分析(朴素贝叶斯)
Tf:term frequency:词的频率
idf:逆文档频率inverse document frequency 【log(总文档数量/该词出现的文档数量)】
log函数:输入的值越小,结果越小
tf*idf:重要性程度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXkLvhpO-1625631495965)(D:/Typora_pictures/image-20210707121104481.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05xr0ktz-1625631495966)(D:/Typora_pictures/image-20210707121133025.png)]
def tfidfvec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
tv = TfidfVectorizer()
data = tv.fit_transform([c1, c2, c3])
print(tv.get_feature_names())
# print(data)
print(data.toarray())
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IRqNGPOo-1625631495967)(D:/Typora_pictures/image-20210707121512023.png)]
得出的这些值叫做:重要性
为什么需要TfidfVectorizer?
分类机器学习算法的重要依据
(ps:实际上这些现在已经outdate了,但是还是要了解这些基础算法)