一、什么是特征工程
- 特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程
- 意义:会直接影响机器学习的效果
二、特征工程的位置与数据处理的比较
- pandas:数据清洗、数据处理
- sklearn:对于特征的处理提供了强大的接口
三、特征抽取/特征提取
1、将任意数据(如文本或图像)转换为可用于机器学习的数字特征
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习将介绍)
2、特征提取API
- sklearn.feture_extraction
3、字典特征提取
作用:对字典数据进行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=Ture,…)
- DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
- DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵返回值:转换之前的数据格式
- DictVectorizer.get_feature_names() 返回类别名称
1)应用
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)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print('data_new:\n',data_new)
print('特征名字:\n',transfer.get_feature_names())
return None
if __name__ == '__main__':
dict_demo()
#默认sparse = True,返回sparse矩阵
#当sparse = False时,返回二维数组
默认sparse = True,返回sparse矩阵,
稀疏矩阵将非0值按位置表示出来,好处:节省内存——提高加载效率
当sparse = False时,返回二维数组
2)总结
- 对于特征当中存在类别信息的我们都会做one-hot编码处理
3)应用场景
- 数据集中类别特征比较多的情况下
- 将数据集的特征转换为字典类型
- DictVectorizer转换
- 本身拿到的数据就是字典类型
4、文本特征提取
作用:对文本数据进行特征值化
- 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
- TF-IDF的主要思想是:如果某个词或者短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语有很好的类别区分能力,适合用来分类
- TF-IDF的作用:用以评估一字对于一个文件集或者一个语料库中的其中一份文件的重要程度
- 公式:重要程度=tf(词频,给定词语在该文件中出现的频率) * idf(逆向文档频率,以10位底 总文件数/包含该词语文件数 的对数)
- TfidfVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
- TfidfVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前的数据格
- TfidfVectorizer.get_feature_names() 返回值:单词列表
1.1)应用—CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
'''
文本特征抽取:CountVectorizer
:return:
'''
data = ['life is short,i like like python','life is too long,i dislike python']
# 1、实例化一个转换器类
transfer = CountVectorizer(stop_words = ['is','too'])
#stop_words:停用词,不显示了
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print('data_new:\n', data_new)
print('data_new:\n', data_new.toarray())
# 返回二维数组结果
print('特征名字:\n', transfer.get_feature_names())
return None
if __name__ == '__main__':
count_demo()
1.2)应用—jieba + CountVectorizer 中文文本自动分词(可手动加空格)
from sklearn.feature_extraction.text import CountVectorizer
import jieba # 结巴分词
def cut_word(text):
'''
进行中文分词:'我爱北京天安门'->'我 爱 北京 天安门'
:param text:
:return:
'''
text = "".join(list(jieba.cut(text)))
# 转换器转换列表转换字符串
return text
def count_chinese_demo():
'''
中文文本特征抽取,自动分词
:return:
'''
# 1、将中文文本进行分词
data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
'我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
'如果只有用一种方式了解某样事物,你就不会真正的了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
data_new=[]
for sent in data:
data_new.append(cut_word(sent))
#print(data_new)
# 2、实例化一个转换器类
transfer = CountVectorizer()
# 3、调用fit_transform
data_final = transfer.fit_transform(data_new)
print('data_final:\n', data_final)
print('data_final:\n', data_final.toarray())
print('特征名字:\n', transfer.get_feature_names())
return None
if __name__ == '__main__':
count_chinese_demo()
1.3)应用—TfidfVectorizer (关键词分类)
from sklearn.feature_extraction.text import TfidfVectorizer
def tfidf_demo():
'''
用TF-IDF的方法进行文本特征的提取
:return:
'''
data = ['life is short,i like like python','life is too long,i dislike python']
# 1、实例化一个转换器类
transfer = TfidfVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print('data_new:\n', data_new)
print('data_new:\n', data_new.toarray())
print('特征名字:\n', transfer.get_feature_names())
return None
if __name__ == '__main__':
tfidf_demo()