一.特征工程
1.1 什么是特征工程?
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
也就是说,使用特征工程之后,能够更好的进行机器学习,机器可以根据一些特有特征来预测结果。
1.2 特征工程包含什么?
a. 特征抽取(将任意的数据可以转化为机器可以学习的数字)
b. 特征预处理(通过一些转换函数将特征数据转换成更加适合算法模型的特征数据)
c. 特征降维(降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程)
1.3 特征抽取
特征抽取主要体现在三个方面:
1.字典特征提取
2.文本特征提取
3.图像特征提取
1.4 字典特征提取举例
现在我们对以下数据进行特征提取
[{'fruit': '香蕉','num':100}
{'fruit': '苹果','num':60}
{'fruit': '桃子','num':30}]
结果如下:
如何实现的呢?
代码如下:
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
data = [{'fruit': '香蕉','num':100},{'fruit': '苹果','num':60},{'fruit': '桃子','num':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
dict_demo()
值得注意的是,我们在进行特征提取时,要进行上述代码所示的1、2步,首先需要实例化转换器,其次进行特征提取。
那么会有人问了,为什么要进行实例化转换器呢?
在代码中’DictVectorizer‘ 是 ‘sklearn’ 库中的一个工具,它用于将字典对象转换为机器学习算法可以接受的格式。在这里,‘sparse=False’ 表示转换后的特征矩阵不是稀疏矩阵而是稠密矩阵,在内存中占用更多空间但可加快运算。
当我们没有加入“sparse=False”会怎么样呢?
from sklearn.feature_extraction.text import CountVectorizer
def text_count_demo():
data = ["life is short,i like 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
这是我们想要的样子吗?该结果与加了“sparse=False”的结果有什么不同?
我们观察可知,(0,2)在加了“sparse=False”中表示在列表的第1号位的列表上的第三个数是1.0 ,由此可知,(0,3)表示在列表的第1号位的列表上的第四个数为100.0 , 那么剩下没有的数都是什么呢?对的,剩下没有说明的数都是0。二者在数据处理上速度上相差很大,我们将这个技巧称为“one-hot”编码
1.5 文本特征提取举例
我们对以下两句话进行特征提取:
"life is short,i like like python", "life is too long,i dislike python"
代码如下:
from sklearn.feature_extraction.text import CountVectorizer
def text_count_demo():
data = ["life is short,i like 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
结果如下:
因为我们对文本进行特征提取,所以我们此时需要将上一步对于字典的提取中的实例化代码换为CountVectorizer(),此时就可以进行文本特征提取!