赵走x博客
网站访问量:151576
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:27、特征提取
资源编号:75926
人工智能
深入浅出Python机器学习
热度:102
通过上面两个小节的学习, 我们可以总结出一个idea , 那就是有些时候,我们通过对数据集原来的特征进行转换,生成新的“特征”或者说成分,会比直接使用原始的特征效果要好。现在我们再引入一个新的名词,称为“ 数据表达” (data representation )。
通过上面两个小节的学习, 我们可以总结出一个idea , 那就是有些时候,我们通过对数据集原来的特征进行转换,生成新的“特征”或者说成分,会比直接使用原始的特征效果要好。现在我们再引入一个新的名词,称为“ 数据表达” (data representation )。 在数据集极为复杂的情况下,比如图像识别, 数据表达就显得十分重要。因为图像是有成千上万个像素组成,每个像素上又有不同的RGB 色彩值,所以我们要用到一个新的数据处理方法,称为“特征提取”( feature extraction )。 # 1、PCA主成分分析法用于特征提取 我们在上9.2 节中,介绍了如何使用PCA 主成分分析法进行数据降维,接下来我们还要介绍PCA 在特征提取方面的使用。这次我们使用一个相对复杂一点的数据集一一LFW 人脸识别数据集。 LFW 人脸识别数据集包含了若千张JPEG 图片, 是从网上搜集的一些名人的照片。每张照片都是一个人的脸部。而创建这个数据集的目的, 是训练机器学习算法,看给出两个照片,算法是否能判断出这两个人是否是同一个人。后来人们对机器又提出了更高的要求:给出一张不在数据集中的人脸照片,让机器判断这张照片是否属于该数据集中 的某一个人,并且要叫出他/ 她的名字。 下面让我们来初步了解一下这个数据集,在Jupyter Notebook 中输入代码如下: ``` import ssl ssl._create_default_https_context = ssl._create_unverified_context import matplotlib.pyplot as plt # 导人数据集获取工具 from sklearn.datasets import fetch_lfw_people # 载入人脸数据集 faces = fetch_lfw_people(min_faces_per_person=20, resize=0.8) image_shape = faces.images[0].shape # 将照片打印出来 # fig, axes= plt.subplots(3,4,figsize=(l2 , 9), # subplot kw=(’ xticks ’ :(),’ yti cks ’:() }) fig, axes = plt.subplots(3, 4, figsize=(12, 9), subplot_kw={'xticks': (), 'yticks': ()}) for target, image, ax in zip(faces.target, faces.images, axes.ravel()): ax.imshow(image, cmap=plt.cm.gray) ax.set_title(faces.target_names[target]) # 显示图像 plt.show() ``` 运行代码,会得到如图9-16 所示的结果。  图9 -16 LFW 人脸数据集中的部分照片 [结果分析]从图9-16 中可以看出LFW 人脸数据集中图像的大概样子。有个彩蛋:图中左上角第一张照片来自著名影星薇诺娜·瑞德, 喜欢电影的朋友可能会记得她在《剪刀手爱德华》或是《小妇人》中的惊艳亮相。要想在加载LFW 人脸数据集时能载入她的照片,请把min_faces per _person 参数设为20 。 接下来,咱们在数据未经处理的情况下,尝试训练一个神经网络,看看效果如何。 输入代码如下: ``` from sklearn.model_selection import train_test_split # 导人神经网络 from sklearn.neural_network import MLPClassifier # 对数据集进行拆分 X_train,X_test,y_train,y_test=train_test_split(faces.data/255,faces.target,random_state=62) # 训练神经网络 mlp=MLPClassifier(hidden_layer_sizes=[100,100],random_state=62,max_iter=400) mlp.fit(X_train,y_train) # 打印模型准确率 print('模型识别准确率:{:.2f}'.format(mlp.score(X_test,y_test))) ``` 运行代码,会得到如图9-17 所示的结果。 ``` 模型识别准确率:0.56 ``` 图9-17 模型识别准确率仅为0.56 [结果分析]从结果中可以看到,在使用了2 个节点数为100 的隐藏层时,神经网络的识别准确率只有0.56 ,也就是说,有接近一半的照片是识别错误的。(其实还好了,毕竟这个数据集里有62 个人,能在短短几秒内记住30 多个人的脸,已经很不容易了。〉 但是我们还不满足于此,接下来我们使用一些方法来提升模型的表现。第一个要用到的就是PC A 主成分分析法中的数据白化功能( data whiten ) 。 那么什么是数据白化呢? 拿我们这个例子来说,虽然每个人的面部特征有很大差异,但如果你从像素级别观察, 差距其实就没有那么大了。而且相邻的像素之间有很大的相关性,这样一来,样本特征的输入就是冗余的了,白化的目的就是为了要降低冗余性。 所以白化的过程会让样本特征之间的相关度降低,且所有特征具有相同的方差。 下面我们用PCA 的自化功能处理一下LFW 人脸数据集,输入代码如下: ``` from sklearn.model_selection import train_test_split from sklearn.decomposition import PCA # 对数据集进行拆分 X_train, X_test, y_train, y_test = train_test_split(faces.data / 255, faces.target, random_state=62) # 使用自化功能处理人脸数据 pca = PCA(whiten=True, n_components=0.9, random_state=62).fit(X_train) X_train_whiten = pca.transform(X_train) X_test_whiten = pca.transform(X_test) # 打印自化后数据形态 print('白化后数据形态:{}'.format(X_train_whiten.shape)) ``` 这里我们要求PCA 保留原始特征中90% 的信息,所以参数n_compo nents 指定为0.9 。 运行结果: ``` 白化后数据形态:(2267, 105) ``` [结果分析} 从结果中可以看到, 经过PCA 白化处理的数据成分为105 个,远远小于原始数据的特征数量87 × 65=5655 个。 下面我们来看看经过自化后神经网络识别的准确率有什么变化。输入代码如下: ``` # 导人神经网络 from sklearn.neural_network import MLPClassifier # 训练神经网络 mlp = MLPClassifier(hidden_layer_sizes=[100, 100], random_state=62, max_iter=400) # 使用自化后的数据训练神经网络 mlp.fit(X_train_whiten, y_train) # 打印模型准确率 print('数据白化后模型识到准确率:{:.2f}'.format(mlp.score(X_test_whiten, y_test))) ``` 运行结果: ``` 数据白化后模型识到准确率:0.57 ``` [结果分析] 从结果中可以看到,模型的准确率轻微地提高了,达到了57% 。这说明PCA 的数据自化功能对于提高神经网络模型的准确率是有一定帮助的。 # 2、非负矩阵分解用于特征提取 除了PCA 之外, scikit-learn 中还封装了非负矩阵分解( Non-Negative Matrix Factorization, NMF )。NMF 也是一个无监督学习算法,同样可以用于数据的特征提取。 那么NMF 和PCA 有什么不同呢? 首先我们要先明白什么是矩阵分解,所谓矩阵分解就是把一个矩阵拆解为n 个矩阵的乘积。而非负矩阵分解,顾名思义, 就是原始的矩阵中所有的数值必须大于或等于0,当然分解之后的矩阵中数据也是大于或等于0 的。用一个比较简单的方式来理解NMF的话,我们可以想象一下有一堆特征值混乱无序地堆放在空间中,而NMF 可以看成是从坐标原点( 0 , 0 )引出一个(或几个)向量,用这个(或这些〉向量, 尽可能地把原始特征值的信息表达出来,如图9 -20 所示。  图9-20 非负矩阵分解NMF 与PCA 不同的是,如果我们降低NMF 的成分数量, 它会重新生成新的成分,而新的成分和原来的成分是完全不一样的。另外, NMF 中的成分是没有顺序的,这点和PCA也有所不同。下面我们试一试使用NMF 对LFW 人脸数据集进行特征提取,再重新训练神经网络, 看看模型的识别准确率是否有所变化。输入代码如下: ``` import ssl ssl._create_default_https_context = ssl._create_unverified_context import matplotlib.pyplot as plt # 导人数据集获取工具 from sklearn.datasets import fetch_lfw_people # 载入人脸数据集 faces = fetch_lfw_people(min_faces_per_person=20, resize=0.8) image_shape = faces.images[0].shape # 导入NMF from sklearn.decomposition import NMF from sklearn.model_selection import train_test_split # 对数据集进行拆分 X_train, X_test, y_train, y_test = train_test_split(faces.data / 255, faces.target, random_state=62) # 使用NMF处理数据 nmf=NMF(n_components=105,random_state=62).fit(X_train) X_train_nmf=nmf.transform(X_train) X_test_nmf=nmf.transform(X_test) # 打印NMF处理后的数据形态 print('NMF处理后数据形态:{}'.format(X_train_nmf.shape)) ``` 公平起见,我们设置NMF 的n_components 参数和PCA 的一致,都为105 个。运行代码(这次要等的时间可能要长一些) ,运行结果: ``` NMF处理后数据形态:(2267, 105) ``` > ⚠️:和PCA 不同, NMF 的n_components 参数不支持使用浮点数,只能设置为正的整型数。 接下来我们用NMF 处理后的数据训练神经网络,输入代码如下: ``` # 导人神经网络 from sklearn.neural_network import MLPClassifier # 训练神经网络 mlp = MLPClassifier(hidden_layer_sizes=[100, 100], random_state=62, max_iter=400) # 用NMF处理后的数据训练网络 mlp.fit(X_train_nmf, y_train) # 打印模型准确率 print('NMF 处理后模型准确率:{:.2f}'.format(mlp.score(X_test_nmf, y_test))) ``` 运行结果: ``` NMF 处理后模型准确率:0.56 ``` [结果分析] 从结果中可以看出, NMF 处理后的数据训练的神经网络模型准确率和PCA 处理后的模型准确率基本持平,略微低一点点。