第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 机器学习基础之《特征工程(2)—特征工程介绍 特征抽取》

机器学习基础之《特征工程(2)—特征工程介绍 特征抽取》

时间:2021-01-05 08:52:16

相关推荐

机器学习基础之《特征工程(2)—特征工程介绍 特征抽取》

一、什么是特征工程

机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”

注:业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程

意义:会直接影响机器学习的效果

二、用什么做特征工程

目前就是sklearn

三、特征工程的位置与数据处理的比较

1、pandas

一个数据读取非常方便以及基本的处理格式的工具

2、sklearn

对于特征的处理提供了强大的接口

3、特征工程包含内容

(1)特征抽取

(2)特征预处理

(3)特征降维

4、特征抽取/特征提取

比如有一篇英文短文,要对文章进行分类:

机器学习算法 -- 统计方法 -- 数学公式

数学公式不能处理字符串,要把文本字符串转换成数值的类型

问题:文本类型转换成数值怎么转?

分类船仓位

问题:类型转换成数值?

onehot编码或者哑变量

四、特征提取

1、什么是特征提取

将任意数据(如文本或图像)转换为可用于机器学习的数字特征

注:特征值化是为了计算机更好的去理解数据

(1)字典特征提取(特征离散化)

(2)文本特征提取

(3)图像特征提取(深度学习将介绍)

2、特征提取API

sklearn.feature_extraction

五、字典的特征提取

sklearn.feature_extraction.DictVectorizer(sparse=True, ...)

作用:对字段数据进行特征值化

说明:

vector 数学里是向量,物理里是矢量

matrix 矩阵,二维数组

如果将向量存储在计算机中,可以用一维数组来存储

1、DicVectorizer.fit_transform(X)

X:字段或者包含字典的迭代器

返回值:返回sparse矩阵

2、DicVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回值:转换之前数据格式

3、DicVectorizer.get_feature_names()

返回值:返回类别名称

4、例子

我们对以下数据进行特征提取

[{'city': '北京','temperature':100}{'city': '上海','temperature':60}{'city': '深圳','temperature':30}]

上面一行代表feature_names,下面三行就是data

解释一下,如果有三个城市就有3个0,字典排列顺序是几第几个0就变成1,有点像二进制编码

样本是一个三行两列的矩阵,当进行字典特征抽取之后,样本量变成4列了

把城市类别转换成了one-hot编码

5、修改day01_machine_learning.py

from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction import DictVectorizerdef datasets_demo():"""sklearn数据集使用"""#获取数据集iris = load_iris()print("鸢尾花数据集:\n", iris)print("查看数据集描述:\n", iris["DESCR"])print("查看特征值的名字:\n", iris.feature_names)print("查看特征值几行几列:\n", iris.data.shape)#数据集的划分x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)print("训练集的特征值:\n", x_train, x_train.shape)return Nonedef dict_demo():"""字典特征抽取"""data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]# 1、实例化一个转换器类transfer = DictVectorizer()# 2、调用fit_transform()data_new = transfer.fit_transform(data)print("data_new:\n", data_new)return Noneif __name__ == "__main__":# 代码1:sklearn数据集使用#datasets_demo()# 代码2:字典特征抽取dict_demo()

运行结果:

data_new:(0, 1)1.0(0, 3)100.0(1, 0)1.0(1, 3)60.0(2, 2)1.0(2, 3)30.0

为什么是这个结果:

这个API将X传进来之后,返回sparse矩阵(sparse英文是稀疏的意思,就是稀疏矩阵)

如果设置:transfer = DictVectorizer(sparse=False)

就会得到预想的结果:

data_new:[[ 0. 1. 0. 100.][ 1. 0. 0. 60.][ 0. 0. 1. 30.]]

怎么看稀疏矩阵:某些矩阵中,非0元素远少于0元素。典型存储方法:三元组法,(行,列,元素值)

就是标注了稀疏矩阵中的非零元素的位置以及对应的值,通俗点讲:0行1列的数值是1,在预想结果里就能找到

好处是节省内存,提高加载效率

增加打印特征名:

from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction import DictVectorizerdef datasets_demo():"""sklearn数据集使用"""#获取数据集iris = load_iris()print("鸢尾花数据集:\n", iris)print("查看数据集描述:\n", iris["DESCR"])print("查看特征值的名字:\n", iris.feature_names)print("查看特征值几行几列:\n", iris.data.shape)#数据集的划分x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)print("训练集的特征值:\n", x_train, x_train.shape)return Nonedef dict_demo():"""字典特征抽取"""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 Noneif __name__ == "__main__":# 代码1:sklearn数据集使用#datasets_demo()# 代码2:字典特征抽取dict_demo()

data_new:[[ 0. 1. 0. 100.][ 1. 0. 0. 60.][ 0. 0. 1. 30.]]特征名字:['city=上海', 'city=北京', 'city=深圳', 'temperature']

六、文本特征提取

1、作用

对文本数据进行特征值化

单词作为特征,特征词

2、方法一:CountVectorizer

sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

返回值:返回词频矩阵

3、CountVectorizer.fit_transform(X)

X:文本或者包含文本字符串的可迭代对象

返回值:返回sparse矩阵

4、CountVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回值:转换之前的数据格式

5、CountVectorizer.get_feature_names()

返回值:单词列表

6、例子

我们对一下数据进行特征提取

["life is short,i like python","life is too long,i dislike python"]

为什么没有i,因为api设计的时候认为单词做分类或情感分析意义不大

7、修改day01_machine_learning.py

from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction import DictVectorizerfrom sklearn.feature_extraction.text import CountVectorizerdef datasets_demo():"""sklearn数据集使用"""#获取数据集iris = load_iris()print("鸢尾花数据集:\n", iris)print("查看数据集描述:\n", iris["DESCR"])print("查看特征值的名字:\n", iris.feature_names)print("查看特征值几行几列:\n", iris.data.shape)#数据集的划分x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)print("训练集的特征值:\n", x_train, x_train.shape)return Nonedef dict_demo():"""字典特征抽取"""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 Nonedef count_demo():"""文本特征抽取"""data = ["life is short,i like like python", "life is too long,i dislike python"]# 1、实例化一个转换器类transfer = CountVectorizer()# 2、调用fit_transform()data_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names()) return Noneif __name__ == "__main__":# 代码1:sklearn数据集使用#datasets_demo()# 代码2:字典特征抽取#dict_demo()# 代码3:文本特征抽取count_demo()

运行结果:

data_new:[[0 1 1 2 0 1 1 0][1 1 1 0 1 1 0 1]]特征名字:['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']

统计每个样本特征词出现的个数

8、中文文本特征抽取

问题:如果我们将数据替换成中文?

那么得到的结果是把整句作为了一个词,手工打空格则不支持单个中文词!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。