什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
- 意义︰会直接影响机器学习的效果
特征工程的位置与数据处理的比较
- pandas:—个数据读取非常方便以及基本的处理格式的工具
- sklearn:对于特征的处理提供了强大的接口
sklearn 特征工程
pandas 数据清洗、数据处理
特征工程包含内容
- 特征抽取
- 特征预处理
- 特征降维
什么是特征抽取
例一:
机器学习算法——统计方法——数学公式
文本类型—>数值
例二:
类型——>数值
特征提取
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注:特征值化是为了计算机更好的去理解数据
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习将介绍)
特征提取API
sklearn.feature_extraction
字典特征提取
类别——>one-hot编码
作用:对字典数据进行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,. . .)
- DictVectorizer.fit_transform(X)×:字典或者包含字典的迭代器返回值:返 回sparse矩阵
- DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵返回值:转换之前数据格式
- DictVectorizer.get_feature_names()返回类别名称
vector 数学:向量 物理:矢量
矩阵 matrix 二维数组
向量 vector 一维数组
父类:transformer
1应用
[{i'city': '北京', ' temperature ' :100},
{ ' city ' : '上海', ' temperature ':60},
{ 'city ': '深圳', ' temperature ' :30}]
sparse=True返回稀疏矩阵,元组表示非0值的位置
sparse=False范围二维数组
稀疏矩阵好处就是节省内存,提高加载效率
2流程分析
- 实例化类DictVectorizer
- 调用fit_transform方法输入数据并转换(注意返回格式)
from sklearn.feature_extraction import DictVectorizer
def dict_demo( ) :
data = [{i'city': '北京', ' temperature ' :100},{ ' city ' : '上海', ' temperature ':60},{ 'city ': '深圳', ' temperature ' :30}]
#1、实例化一个转换器类
transfer = DictVectorizer(sparse=False)
#2、调用fit_transform
data = transfer.fit_transform(data)
print("返回的结果:\n",data)
#打印特征名字
print("特征名字: \n",transfer.get_feature_names( ))
return None
注意观察没有加上sparse=False参数的结果
pandas中的离散化的时候,也实现了类似的效果。这个处理数据的技巧叫做”one-hot“编码:
3总结
对于特征当中存在共别信息的我们都会做one-hot编码处理
4应用场景
- 数据集当中类别特征比较多
- 将数据集的特征——>字典类型
- bictVectorizer转换
- 本身拿到的数据就是字典类型
文本特征提取
作用:对文本数据进行特征值化
- sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
- 返回词频矩阵
- CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
- CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵
- 返回值:转换之前数据格
- CountVectorizer.get_feature_names()
- 返回值:单词列表
- sklearn.feature_extraction.text.TfidfVectorizer
1应用
我们对以下数据进行特征提取
["life is short,i like python" ,
"life is too long,i dislike python"]
没有sparse=True参数,用.toarray()
单词作为特征,统计每个样本特征词出现的个数
方法1: CountVectorizer
中文没有空格的分割
data =[“我 爱 北京 天安门”,“天安门 上 太阳 升"]
stop_words停用词
2流程分析
- 实例化类CountVectorizer
- 调用fit_transform方法输入数据并转换(注意返回格式,利用toarray()进行sparse矩阵转换array数组)
from sklearn.feature_extraction.text import CountVectorizer
def text_count_demo():
data = ["life is short,i like python" ,"life is too long,i dislike python"]
#1、实例化一个转换器类
# transfer = CountVectorizer(sparse=False)
transfer = CountVectorizer( )
#2、调用fit_transform
data = transfer.fit_transform(data)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n",transfer.get_feature_names())
return None
3jieba分词处理
- jieba.cut()
- 返回词语组成的生成器
需要安装下jieba库
pip3 install jieba
4案例分析
对以下三句话进行特征值化
今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。
我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。
如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
- 分析
- 准备句子,利用jieba.cut进行分词
- 实例化CountVectorizer
- 将分词结果变成字符串当作fit_transform的输入值
from sklearn.feature_extraction.text import Countvectorizer
import jieba
def cut_word (text):
#用结巴对中文字符串进行分词
text = " ".join(list(jieba.cut(text)))
return text
def text_chinese_count_demo2():
data = ["今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
#将原始数据转换成分好词的形式
text_list = []
for sent in data;
text_list.append(cut_word(sent))
print(text_list)
#1、实例化一个转换器类
#transfer = CountVectorizer(sparse=False)
transfer = CountVectorizer()
#2、调用fit_transform
data = transfer.fit_transform(text_list)
print("文本特征抽取的结果:\n", data.toarray( ))
print("返回特征名字:\n", transfer.get_feature_names())
return None
关键词∶在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
方法2:TfidfVectorizer
5 Tf-idf文本特征提取
- TF-IDF的主要思想是︰如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
- TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
TF-IDF—>重要程度 TF—>词频 IDF—>逆向文档频率
eg:
5.1公式
- 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到。
5.2 API
- sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None,…)
- 返回词的权重矩阵
- TfidfVectorizer.fit_transform(X)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
- TfidfVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
- TfidfVectorizer.get_feature_names()
- 返回值:单词列表
- TfidfVectorizer.fit_transform(X)
- 返回词的权重矩阵
5.3 流程分析
6 Tf-idf的重要性
分类机器学习算法进行文章分类中前期数据处理方式