2.3.1特征提取
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
特征提取API:
sklearn.feature_extraction
2.3.2 字典特征提取
作用:对字典数据进行特征值化
应用场景:
- 数据集中类别特征比较多
- 本身数据就是字典类型
调用API:
sklearn.feature_extraction.DictVectorizer(sparse=True,…) #默认返回spares稀疏矩阵
DictVectorizer.fit_transform(X) #X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) #X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() #返回类别名称
将数据转化为向量vector,通过向量表示位序及信息,做one-hot编码处理
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""字典特征提取"""
data=[{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
#实例化一个转换器类
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())
TIPS:one-hot编码
由于单纯将不同类别按1234分类,可能会引入其他信息,因此采用one-hot为每个类别生成一个布尔列。这些列中只有一列可以为每个样本取值1
2.3.3 文本特征提取
作用:对文本数据进行特征值化,将单词作为特征
· sklearn.feature_extraction.text.CountVectorizer(stop_words=[]) 返回词频矩阵,stop_words传入停用词
· CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
· CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
·
·
方法一:实例化类CountVectorizer。调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)通过将单词抽取为特征,统计文本中出现次数
from sklearn.feature_extraction.text import CountVectorizer
def text_count_demo():
"""
对文本进行特征抽取,countvetorizer
"""
data = ["to be or not to be","life is to be short"]
# 1、实例化一个转换器类
transfer = CountVectorizer() #无法像字典特征提取一样传入spares参数
# 2、调用fit_transform
data = transfer.fit_transform(data)
print("返回特征名字:\n", transfer.get_feature_names())
print("文本特征抽取的结果:\n", data.toarray()) #toarray()将稀疏矩阵转为数组
方法二:对于中文文本,使用jieba分词
方法三:Tf-idf文本特征提取
思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
公式:
词频(term frequency,tf) 指的是某一个给定的词语在该文件中出现的频率
逆向文档频率(inverse document frequency,idf) 是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
API:
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cut_word (text):
"""对中文进行分词处理
"""
temp=jieba.lcut(text)
text=" ".join(temp) #“ ”
return text
def tfidf_demo():
"""
用tfidf对中文文本特征提取
"""
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
#将原始数据转化为分好词
text_list=[]
for sent in data:
text_list.append(cut_word(sent))
#print(text_list)
#1.实例化转换器类
transfer=TfidfVectorizer()
#2.调用fit_transform
data=transfer.fit_transform(text_list)
print("文本提取结果:\n",data.toarray())
print("文本特证名字:\n",transfer.get_feature_names())