数据集
机器学习常用数据集
数据集的结构组成
特征工程
定义:特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。特征工程包括数据的特征抽取、特征处理、特征选择、降维等。
特征工程常用工具Scikit-learn
Scikit-learn是python语言的机器学习工具,包括许多知名的机器学习算法的实现,文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。
pip install Scikit-learn # 命令行
import sklearn
注:安装Scikit-learn需要numpy、pandas等库。
数据特征抽取
特征抽取针对非连续型数据,对文本等进行特征值化,特征值化是为了使计算机更好的理解数据。
Scikit-learn特征抽取API
sklearn.feature_extraction
字典特征抽取
- 作用:对字典数据进行特征值化
- 类:sklearn.feature_extraction.DictVectorizer
- DictVectorizer语法:
DictVectorizer(sparse = True,……)
(1)DictVectorizer.fit_transform(X)
X:字典或者包含字典的迭代器;
返回值:返回sparse矩阵。
(2)DictVectorizer.inverse_transform(X)
与(1)的操作相反,X是array数组或者sparse矩阵;返回转换之前数据格式。
(3)DictVectorize.get_feature_names():返回类别名称
from sklearn.feature_extraction import DictVectorizer
# 1. 实例化 DictVectorizer
dict = DictVectorizer()
# 2. 调用 fit_transform 方法输入数据并转换,返回sparse矩阵
data = dict.fit_transform([{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}])
print(data)
运行结果(sparse矩阵:节约内存,方便读取处理):
若实例化时,设置sparse=False:
from sklearn.feature_extraction import DictVectorizer
# 1. 实例化DictVectorizer
dict = DictVectorizer(sparse=False)
# 2. 调用fit_transform方法输入数据并转换,返回sparse矩阵
data = dict.fit_transform([{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}])
print(dict.get_feature_names())
print(data)
运行结果:
ont-hot编码
例:七个样本共4个类别(编号分别为1、2、3、4)
one-hot编码之后:
文本特征抽取
作用:对文本数据进行特征值化
类 sklearn.feature_extraction.text.CountVectorizer
CountVectorizer语法:
(1)返回词频矩阵(实例化时没有sparse可选参数);
(2)CountVectorizer.fit_transform(X)
X:文本或者包含文本字符串的可迭代对象;
返回值:返回sparse矩阵。
(3)CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵;
返回值:转换之前的数据格式。
(4)CountVectorizer.get_feature_names()
from sklearn.feature_extraction.text import CountVectorizer
# 1. 实例化类CountVectorizer
cv = CountVectorizer()
# 2. 调用 fit_transform 方法输入数据并转换,返回sparse矩阵
# 可利用 toarray() 进行sparse矩阵转换array数组
data = cv.fit_transform(["life is short,i like python", "life is too long,i dislike python"])
print(data)
print(cv.get_feature_names())
print(data.toarray())
运行结果:
注:
- 统计文本中出现的所有词汇的个数;而一般文本特征抽取用于文本分类或者情感分析,所以单个字母不统计。
- CountVectorizer 对中文字符作用结果:
from sklearn.feature_extraction.text import CountVectorizer
# 1. 实例化类CountVectorizer
cv = CountVectorizer()
# 2. 调用fit_transform方法输入数据并转换,返回sparse矩阵
# 可利用 toarray() 进行sparse矩阵转换array数组
data = cv.fit_transform(["人生苦短,我用python", "人生漫长,我不用python"])
print(cv.get_feature_names())
print(data.toarray())
运行结果:
需要对中文文本进行分词才能进行特征值化!(可以用空格来分词)
jieba分词
下载:pip install jieba
使用:import jieba
jieba.cut("好好学习,天天向上”)
注意:返回值:词语生成器(generator)
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word():
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
def hanzivec():
c1, c2, c3 = cut_word()
print(c1, c2, c3)
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
hanzivec()
结果:
类 sklearn.feature_extraction.text.TfidfVectorizer
- why
若两篇文章出现频率最高的词组为“明天”“我们”,则不可由频率简单推断这两篇文章属于同一类型。 - TF-IDF主要思想:若某个词或者短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词语具有很好的类别区分能力,适合用来分类。TF-IDF可用来评估一个词对于一个文献或者一个语料库中的其中一份文件的重要程度。
tf: term frequency(词的频率)
idf: inverse document frequency(逆文档频率):
=log(总文档数量/该词出现的文档数量)
tf * idf :重要程度 - TfidfVectorizer 语法
(1)TfidfVectorizer(stop_words = None, ……)
返回词的权重矩阵
(2)TfidfVectorizer.fit_transform(X)
X:文本或者包含文本的可迭代对象
返回值:返回sparse矩阵
(3)TfidfVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前的数据格式
(4)TfidfVectorizer.get_feature_names()
返回值:单词列表
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cut_word():
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
def hanzivec():
c1, c2, c3 = cut_word()
print(c1, c2, c3)
cv = TfidfVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
hanzivec()
运行结果:
拜师教育学员文章:作者:1191-杨同学,
转载或复制请以 超链接形式 并注明出处 拜师资源博客。
原文地址:《机器学习2—数据的特征工程之特征抽取》 发布于2020-07-22
评论 抢沙发