赵走x博客
网站访问量:151929
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出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机器学习:25、数据预处理
资源编号:75923
人工智能
深入浅出Python机器学习
热度:165
数据预处理、降维、特征提取及聚类:快刀斩乱麻
>数据预处理、降维、特征提取及聚类:快刀斩乱麻 在上一章中,小C 为了帮助女朋友小I 训练一个手写数字识别的神经网络,使用了MNIST数据集。不知道读者朋友们是否记得,在载入数据集的时候,我们使用了这样一行代码: ``` X = mnist . data/255 ``` 这行代码是作用是什么呢?我们知道, MNIST 数据集中的样本特征是从0 到2 55 的灰皮值, 0 表示白,而255 代表黑,中间的数值代表不同深度的灰色。通过除以255 的操作,我们可以把所有的特征值限定到0 到1之间,从而有助于提高模型的准确率,这就是一种简单的数据预处理( data preprocessing ) 。那么为什么要进行数据预处理?数据预处理的方法都有哪些呢?本章将和读者朋友一起展开探索。 本章主要涉及的知识点有: 1、几种常见的数据预处理工具 2、PCA 主成分分析用于数据降维 3、PCA 主成分分析和NMF 非负矩阵分解用于特征提取 4、几种常用的聚类算法 # 1、使用StandardScaler进行数据预处理 首先我们还是先手工生成一些数据, 用它们来说明数据预处理的一些原理和方法。这次我们依旧使用scikit- leam 的make_blobs 函数, 在Jupyter Notebook 中新建一个notebook ,输入代码如下: ``` # 导人numpy import numpy as np # 导入画图工具 import matplotlib.pyplot as plt # 导入数据集生成工具 from sklearn.datasets import make_blobs X, y = make_blobs(n_samples=40, centers=2, random_state=50, cluster_std=2) # 用散点图绘制数据点 plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.cool) # 显示图像 plt.show() ``` 运行结果:  图9-1 手工生成的数据集 {结果分析] 我们在使用make_blobs 函数时,指定了样本数量n_samples 为40 ,分类centers 为2 , 随机状态random_state 为50 , 标准差cluster_std 为2 。从图9-1 中可以看到,数据集中的样本有2 个特征,分别对应x 轴和y 轴, 特征1 的数值大约在- 8 到7 之间,而特征2 的数值大约在- 10 到0 之间。接下来,我们要使用scikit-leam 的preprocessing 模块对这个手工生成的数据集进行预处理的操作。首先我们先来看一下第一个方法: StandardScaler。在Jupyter Notebook中输入代码如下: ``` # 导入StandardScaler from sklearn.preprocessing import StandardScaler # 使用StandardScaler进行数据预处理 X_1 = StandardScaler().fit_transform(X) # 用散点图绘制经过预处理的数据点 plt.scatter(X_1[:, 0], X_1[:, 1], c=y, cmap=plt.cm.cool) # 显示图像 plt.show() ``` 运行代码,将会得到如图9-2 所示的结果。  图9-2 经过StandardScaler 处理的数据 [结果分析] 对比图9 -2 和图9-1 ,你也许会发现数据点的分布情况没有什么不同,但图像的x 轴和y 轴发生了变化。现在数据所有的特征1 的数值都在-2 到3 之间,而特征2 的数值都在-3 到2 之间。这是因为StandardScaler 的原理是,将所有数据的特征值转换为均值为0 , 而方差为1的状态, 这样就可以确保数据的“大小”都是一致的,这样更利于模型的训练。 # 2、使用MinMaxScaler进行数据预处理 除了StandardScaler 之外,还有其他一些不同的方法,下面我们来看第二个方法:MinMaxScaler。在Jupyter Notebook 中输入代码如下: ``` # 导入MinMaxScaler from sklearn.preprocessing import MinMaxScaler # 使用M工nMaxScaler进行数据预处理 X_2 = MinMaxScaler().fit_transform(X) # 绘制散点图 plt.scatter(X_2[:, 0], X_2[:, 1], c=y, cmap=plt.cm.cool) # 显示图像 plt.show() ``` 运行结果:  图9-3 经过MinMaxSca ler 处理的数据 {结果分析] 再次将图9-3 与图9 -1 、图9-2 进行对比,可以看到这次所有数据的两个特征值都被转换到0 到1 之间。对于我们使用make_blobs 生成的二维数据集,你也可以想象成是我们通过MinMaxScaler 把所有的数据压进了一个长和宽都是1的方格子当中了,这样会让模型训练的速度更快且准确率也会提高。 # 3、 使用RobustScaler进行数据预处理 还有一种数据转换的方法,和StandardScaler 比较近似,但是它并不是用均值和方差来进行转换,而是使用中位数和四分位数。这种方法称为RobustScaler,我个人特别喜欢把这种方法翻译成“粗暴缩放" ' 因为它会直接把一些异常值踢出去, 有点类似我们看体育节目中评委常说的“去掉一个最高分,去掉一个最低分”这样的情况。下面我们来看看RobustScaler 到底有多粗暴,在Jupyter Notebook 中输入代码如下: ``` # 导入RobustScaler from sklearn.preprocessing import RobustScaler # 使用RobustScale r进行数据预处理 X_3 = RobustScaler().fit_transform(X) # 绘制散点图 plt.scatter(X_3[:, 0], X_3[:, 1], c=y, cmap=plt.cm.cool) # 显示图像 plt.show() ``` 运行结果:  图9-4 经过RobustScal er 处理的数据 [结果分析] 从图9 -4 中可以看到, RobustScaler 将数据的特征1控制在了1.5 到2之间,而特征2 控制在了-2 到1. 5 之间。和Standard Scaler 非常类似,但因为其原理不同,所得到的结果也有所不同。 # 4、使用Normalizer进行数据预处理 下面我们再来看一个比较特殊的方法,称为Normalizer,这种方法将所有样本的特征向量转化为欧几里得距离为1。也就是说,它把数据的分布变成一个半径为1 的圆,或者是一个球。Normalizer 通常是在我们只想保留数据特征向量的方向,而忽略其数值的时候使用。下面我们还是用图像来展示Normalizer 的工作方式,在Jupyter Notebook 中输入代码如下: ``` # 导人Normalizer from sklearn.preprocessing import Normalizer # 使用Normalizer进行数据预处理 X_4 = Normalizer().fit_transform(X) # 绘制散点图 plt.scatter(X_4[:, 0], X_4[:, 1], c=y, cmap=plt.cm.cool) # 显示图像 plt.show() ``` 运行结果:  图9-5 经过Normalizer 处理的数据 . [结果分析]可以说,在我们介绍的集中方法中, Normalizer 是把原始数据变得最“面目全非”的方法了。除此之外, 在scikit-learan 中,还有MaxAbsScaler 、Quantile Transformer 、Binarizer等数据预处理的方法,在此我们先不做详细介绍,感兴趣的读者朋友可以到Scikit-learn 官方网站查阅相关的文档。 # 5、通过数据预处理提高模型准确率 相信看到这里,读者朋友们可能会有一个问题: 究竟我们对数据进行预处理的意义是什么呢?它真的可以让模型的训练结果更好吗?为了搞清楚这一点,我们使用酒的数据集来测试一下。在Jupyter Notebook 中输入代码如下: ``` # 导人红酒数据集 from sklearn.datasets import load_wine # 导入MLP神经网络 from sklearn.neural_network import MLPClassifier # 导人数据集拆分工具 from sklearn.model_selection import train_test_split # 建立训练集和测试集 wine = load_wine() X_train, X_test, y_train, y_test = train_test_split(wine.data, wine.target, random_state=62) # 打印数据形态 print(X_train.shape, X_test.shape) ``` 运行结果: ``` (133, 13) (45, 13) ``` 图9-6 训练集和测试集的数据形态 {结果分析] 这表示,我们已经成功地将数据集拆分为训练、集和测试集,训练集中的样本数量为133 个,而测试集中的样本数量为45 个。 下面我们用训练数据集来训练一个MLP 神经网络,再看下该神经网络在测试集中的得分,输入代码如下: ``` # 设定MLP神经网络的参数 mlp = MLPClassifier(hidden_layer_sizes=[100, 100], max_iter=400, random_state=62) # 使用MLP拟合数据 mlp.fit(X_train, y_train) # 打印模型得分 print('模型得分:{:.2f}'.format(mlp.score(X_test, y_test))) ``` 这里我们设定MLP 的隐藏层为2 个, 每层有100 个节点, 最大迭代数为400 , 并且指定了random state 的数值为62 , 这是为了在我们重复使用该模型的时候, 其训练的结果都是一致的。运行代码,会得到如图9 -7 所示的结果。 ``` 模型得分:0.93 ``` 图9-7 未经数据预处理时的模型得分 [结果分析] 在没有经过预处理的情况下, 模型的分说是0.93。 下面我们试着对数据集进行一些预处理的操作,输入代码如下: ``` from sklearn.preprocessing import MinMaxScaler # 使用MinMaxScaler进行数据预处理 scaler = MinMaxScaler() scaler.fit(X_train) X_train_pp = scaler.transform(X_train) X_test_pp = scaler.transform(X_test) # 重新训练模型 mlp.fit(X_train_pp, y_train) # 打印模型分数 print("数据预处理后的模型得分:{:.2f}".format(mlp.score(X_test_pp, y_test))) ``` 运行代码, 会得到一个让人惊喜的结果,如图9-8 所示。 ``` 数据预处理后的模型得分:1.00 ``` 图9-8 经过数据预处理后的模型评分 [结果分析]可以看到, 经过了预处理之后的数据集,大大提升了神经网络的准确率,从未经过预处理的模型得分0.97 , 直接提升到了进行预处理之后的1.00 , 也就是说,在经过数据预处理之后, MLP 神经网络在测试数据集中进行了完美的分类! >在上面的代码中,我们先用MinMaxScaler 拟合了原始的训练数据集, 再用它去转换原始的训练数据集和测试数据集。切记不要用它先拟合原始的测试数据集,再去转换测试数据集,这样做就失去了数据转换的意义。