【sklearn第三讲】数据预处理
机器学习训练营——机器学习爱好者的自由交流空间(入群联系qq:2279055353)
sklearn.preprocessing
包提供了几个常用的函数和转换类,用它们将一个原始的特征向量转化为一个更适于数据分析的表示形式。一般来说,学习算法收益于数据集的标准形式。如果数据中存在异常点,稳健的数据规范或转换是更适合的。
数据标准化
对于大多数机器学习算法来说,数据集的标准化是基本要求。这是因为,如果特征并不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。实际上,我们经常忽略数据的分布形状,而仅仅做零均值、单位标准差的处理。例如,在一个机器学习算法的目标函数里的很多元素(例如,SVM的RBF核)假设所有特征都近似零均值,方差具有相同的阶。如果某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得估计量不能从其它特征有效地学习。
scale
函数提供了一种快速简单的数据标准化操作。
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
X_scaled = preprocessing.scale(X_train)
X_scaled
标准化后的数据具有0均值、1标准差。
preprocessing
模块还提供了一个StandardScaler
类,该类执行Transformer
API,计算训练集的均值和标准差,可以重新应用到后面的检验集的同样的转换上。因此,在一个sklearn.pipeline.Pineline
的较早步,很适合使用这个类。
然后,可以在新数据集上使用scaler实例,以在训练集上相同的方式转换新数据集。
也可以在StandardScaler的构造器里,通过设置with_mean=False
或with_std=False
阻止零均值化、单位标准差化。
设置特征的值范围
除了标准化的方法外,还可以设置特征的取值在一个特定的范围内,这个范围经常是[0, 1],可以通过MinMaxScaler
函数实现。设置特征的值范围,是为了保持特征的小标准差的稳健性,也为了保持稀疏数据里的值为0的项。下面是一个数据矩阵的操作示例:
非线性变换
类似scalers, QuantileTransformer
函数置每个特征于相同的分布范围。然而,通过做一个秩变换,使变换后的数据受异常值的影响较小。QuantileTransformer
,quantile_transform
函数将原始数据变换到[0, 1]区间的均匀分布。
也可以将变换后的数据映射到正态分布,通过设置output_distribution='normal'
:
归一化
归一化(Normalization
)是将样本规范化成单位范数的过程。函数normalize
提供了归一化的快速简单操作。这里的"范数",可以使用L1或L2范数。
preprocessing模块进一步提供了一个工具类Normalizer
, 该类使用Transformer API 执行相同的归一化操作。然后,归一化实例就可以使用在样本向量上了。
二值化
这里的二值化,指的是特征二值化,即,将数量特征按阈值转换为二值的过程。工具类Binarizer
执行二值化操作,举个例子:
因为样本是相互独立的,所以fit方法不起作用。也可以调整二值化的阈值
编码类别特征
特征经常不是取连续的值,而是取类别。例如,一个人可以有特征[“male”, “female”], [“from Europe”, “from US”, “from Asia”], [“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]. 这些特征能用整数有效地编码,例如,[“male”, “from US”, “uses Internet Explorer”]能编码为[0, 1, 3], [“female”, “from Asia”, “uses Chrome”]编码为[1, 2, 1].
但是,这些整数表示不能直接用在scikit-learn的估计里,这是因为scikit-learn的估计要求连续的输入,因而将这些编码的整数作为数量值,显然是不对的。为了将类别特征转换为scikit-learn的估计量能够使用的特征,一种方法是使用one-of-K
或one-hot
编码,执行函数是OneHotEncoder
, 它将具有m个可能值的类别特征转换为m个二值特征,只有一个是活跃的(即,取某个类别)。继续上面的例子,
缺省情况下,每个特征能够取多少个不同的值,从数据集自动推断,也可以通过赋予参数n_values
值明确类别数量。在上面的数据示例里,有2个性别、3个州和4个网页浏览器类别,然后我们拟合估计量,变换一个数据点。结果是,前2个数字编码性别,接着的3个数字编码州,最后的4个数字编码浏览器类型。注意到,如果训练集可能有缺失的类别特征,则必须明确地设置n_values的值。例如,
填补缺失值
由于各种各样的原因,很多真实世界的数据集包括缺失值,这些缺失值通常编码为空白,NaN或其它占位符。然而,这样的数据集与scikit-learn不兼容, scikit-learn假设在一个数组里的所有值都是数值。在scikit-learn里使用不完整数据集的一个基本策略是,丢弃那些包括缺失值的行或列。然而,这样做可能损失了有价值的数据。一个更好的策略是填补这些缺失值,即,根据已知的数据推断它们的值。
Imputer
类提供了填补缺失值的基本策略。可以使用缺失值所在的行或列的均值、中位数、频数最大的值。该类也考虑了不同缺失值的编码形式。下面的代码片段演示了怎样用包括缺失值的列均值填补缺失值,这些缺失值编码为NaN(Not a Number).
Imputer类也支持稀疏的矩阵。
注意,在这里缺失值编码为0,含蓄地存储在矩阵里。当数据的缺失值多于观测值时,适合用这种方式。
精彩内容,请关注微信公众号:统计学习与大数据
【sklearn第三讲】数据预处理相关推荐
- sklearn实战-----3.数据预处理和特征工程
1 概述 1.1 数据预处理与特征工程 想象一下未来美好的一天,你学完了菜菜的课程,成为一个精通各种算法和调参调库的数据挖掘工程师了.某一天 你从你的同事,一位药物研究人员那里,得到了一份病人临床表现 ...
- 使用Sklearn库学习数据预处理和特征工程
目录 1,概述 1.1,数据预处理和特征工程 1.2,sklearn中的数据预处理和特征工程 2,数据预处理 Preprocessing & Impute 2.1,数据无量纲化 2.2,缺失值 ...
- sklearn中的数据预处理方法学习汇总
文章目录 sklearn中的数据预处理方法学习 一.标准化 Z-score标准化 Z-score标准化学习 Z-score标准化实现 Min-max标准化 MaxAbs标准化 二.非线性转换 映射到均 ...
- Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别
敲<Python机器学习及实践>上的code的时候,对于数据预处理中涉及到的fit_transform()函数和transform()函数之间的区别很模糊,查阅了很多资料,这里整理一下: ...
- 【sklearn学习】数据预处理和特征工程
主成分分析 sklearn.PCA 特征选择 sklearn.feature_selection 特征处理 sklearn.preprocessing 特征提取 sklearn.feature_ext ...
- sklearn.preprocessing之数据预处理
sklearn.preprocessing 提供了多个数据预处理类和方法,将原始特征向量转换为更适合于下游模型的表示. Standardization 标准化是列处理,对不同样本的同一个属性值进行标准 ...
- sklearn 中的数据预处理函数,标准化
sklearn 是 python 中一个常用的机器学习与统计分析包,功能十分强大,既能做普通的统计分析,也可以做一些常用的机器学习算法. 在分析数据前,一般要对数据进行预处理,常用的数据预处理函数有: ...
- sklearn机器学习之数据预处理(Preprocessing Impute)
在之前的机器学习中,我们使用的数据集都是sklearn自带的数据集以及非常经典的泰坦尼克号数据集,这些数据集都是一些经过处理被验证为对机器学习很友好的数据集,而现实生活中我们往往数据集并不是那么友 ...
- 用sklearn.preprocessing做数据预处理(四)——OneHotEncoder
机器学习时,对于离散的特征基本就是按照one-hot(独热)编码,该离散特征有多少取值,就用多少维来表示该特征. from sklearn import preprocessing enc = pre ...
- sklearn 神经网络_sklearn中的数据预处理和特征工程
小伙伴们大家好~o( ̄▽ ̄)ブ,今天我们看一下Sklearn中的数据预处理和特征工程,老规矩还是先强调一下,我的开发环境是Jupyter lab,所用的库和版本大家参考: Python 3.7.1(你 ...
最新文章
- [kuangbin带你飞]专题七线段树 更新ing
- R基于H2O包构建深度学习模型实战
- 常考数据结构与算法:合并k个已排序的链表
- Java泛型总结--转
- Boost:用OpenCL编写的简单flip filter的测试程序
- java工程师_Java开发工程师需要掌握哪些技能?
- python logging模块 默认_python logging模块
- Acer 4750 安装黑苹果_安装黑苹果,你需要注意哪几点
- 递归下降分析法的基本思想。_语法分析 | 递归下降分析算法
- threejs 热力图做成材质_脉冲滤筒除尘器滤芯的材质
- matlab中二阶偏导数,MATLAB中带有两个变量的函数的一阶和二阶偏导数
- 台式计算机怎么查是32位还是64位,Win7系统怎么看电脑是32位还是64位?
- P1129 矩阵游戏
- 如何使用ArcGIS计算分区河流(管线)总长度
- Vue基础入门(2) Vue.js下载与安装
- 关于IE非安全更新带来flash和ActivX不能激活的解决办法(zt)
- 我爱你用计算机按出来,iPhone计算器魔法技巧 简单几步获取对方手机号
- wps字体缺失,问题
- Spring系列:mysqlsqlserver对比
- java 计算当天剩余多少秒
热门文章
- WCF---服务发布的步骤
- 验证码类库CaptchaMvc
- 游戏开发之类的构造函数调用时机(规则)及类对象作为另一个类的成员变量(C++基础)
- HCIE Security 防火墙多出口选路 备考笔记(幕布)
- Docker详解(十六)——Docker私有化仓库创建
- 使用Epoch-Based Reclamation(EBR,特定域回收的一种方法)修改 lazy-list
- telnet的基本配置(cisco、H3C、huawei 三个例子)
- JVM(一)内存分配
- metamask源码学习-ui/index.js
- opencv python 读取图像/显示图像/保存图像