数据预处理及sklearn方法实现
1、标准化(中心化)
在许多机器学习执行前,需要对数据集进行标准化处理。因为很对算法假设数据的特征服从标准正态分布。所以如果不对数据标准化,那么算法的效果会很差。
例如,在学习算法的目标函数,都假设数据集的所有特征集中在0附近,并且有相同的方差。如果某个特征的方差远大于其他特征的方差,那么该特征可能在目标函数占的权重更大,使得算法不能从所有特征中学习。
在实践中,我们往往忽略了分布的形状,只需要通过减去每个特征的均值,然后除以非标准特征的标准偏差来转换数据。
scale方法提供了在一个类似数据的数据集上执行操作的简便方法:
from sklearn import preprocessing
X_scaled = preprocessing.scale(X)
preprocessing模块还提供了一种使用类:StandardScaler,主要计算训练集的均值和标准差,然后应用在测试集的转换上
scaler = preprocessing.StandardScaler().fit(X)
sscaler.transform(X)
1.1将特征缩放到一个范围
另一种标准化方法是将特征值缩放到在一个给定的最小值和最大值之间,通常是0~1;或者每个特征的最大绝对值被缩放到单位大小。该方法可以分别通过MinMaxScaler或者MaxAbsScaler实现。
使用范围:特征对非常小的标准差的鲁棒性和希望在稀疏数据中保存零项
Example1:
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
Example2:
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
1.2稀疏数据缩放
对稀疏数据中心化处理会破坏数据的稀疏性结构,所以很少对稀疏数据中心化。但是如果特征在不同的方差下,依然需要对数据进行缩放。
类MaxAbsScaler和方法maxabs_scale是专门用来对稀疏数据进行缩放的。
1.3、离群点的缩放
如果数据集中包含很多离群点,那么使用数据的均值方差进行缩放的效果不会很好。
在这种情况下,可以使用方法robust_scale和类RobustScaler来进行替换,它们对数据的均值和方差使用更健壮的估计
1.4、中心化核矩阵
如果有一个核K的核矩阵,通过定义的函数phi计算特征空间的点积,使用类KernelCenterer可以变换核矩阵,它包含去除特征空间均值后,再利用phi计算特征空间的内积。
2、归一化
归一化是将单个样本缩放为单位范数的过程。如果使用一个二次形式,例如点积或其他任何内核来量化一对样本的相似度,这个步骤会很有必要。这个步骤是向量空间模型的基础,常被用于文本分类和聚类中。
normalize方法提供了快速简单的方法来对单个array数据集进行归一化,可以选择L1或者L2范数。
preprocessing.normalize(X, norm='l2')
preprocessing模块还提供了类Normalizer,通过方法Transformer API对另一数据集执行同样的操作。
normalizer = preprocessing.Normalizer().fit(X)
normalizer.transform(X)
注:normalize和Normalizer同样适用于类似array的稠密的或者稀疏的矩阵。
3、二值化
特征二值化是对数值特征进行阈值化以得到布尔值的过程。这对于假设输入数据服从多变量伯努利分布的后验分布的估计是有用的。例如,在sklearn.neural_network.BernoulliRBM的使用时需要二值化。
在文本处理中经常使用二值特征(可能是为了简化推理过程),例如在计数或者TF-IDF特征值中,使用二值特征能够更有效。
类Binarizer是专门用于二值化的,例如:
preprocessing.Binarizer().fit(X)或者preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
preprocessing模块提供binarize方法来对特征进行二值化处理。
4、种类特征编码
在很多情况下,特征值不是连续的值而是种类。例如,一个人可能的特征是[male, female]等等,这些特征可以用整数值来进行编码。
在scikit-learn中,将种类特征用1-of-k或者one-hot编码。预处理模块中有OneHotEncoder来对种类特征编码,通常是m个可能的种类用m个值来表示。例如:
preprocessing.OneHotEncoder()
默认情况下,m值时通过数据集自动推断出来的。例如,数据集中有2种性别,三种可能的地方,4中可能的浏览器。然后在编码时,在9列的array数组中,前2个数字编码性别,接下来3个数字编码地方,最后4个数字编码浏览器。
5、缺失值处理
由于各种原因,许多现实世界的数据集包含缺失值,通常变为为空白、NaN或其他占位符。使用不完整数据集的基本策略是丢弃包含缺失值的整行或整列,然而这样会丢失可能有价值的数据。一个更好的策略就是从已知的部分数据中推断出缺失值。
Imputer类提供了基本的策略来填充缺失值,可以用行或者列的均值、中位数或众数来填充缺失值。例如:
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]
imp.transform(X)
该类还支持稀疏矩阵(将缺失值编码为0),将稀疏矩阵填充为稠密的矩阵。
6、生成多项式特征
通常,通过考虑输入数据的非线性特征来增加模型的复杂度是很有用的。一个简单常用的方法是多项式特征,它可以得到特征的高阶和相互作用项。
PolynomialFeatures类可以用来生成多项式特征。
poly = PolynomialFeatures(2)
poly.fit_transform(X)
上述将(X1, X2)转化为(1, X1, X2, X12, X1X2, X22)
应用范围:多样式特征常用于核方法中(SVM, 核PCA)
PS:该内容从sklearn数据预处理模块整理,具体方法和类的使用可以在sklearn官网上查询:http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing
数据预处理及sklearn方法实现的更多相关文章
- 文本数据预处理:sklearn 中 CountVectorizer、TfidfTransformer 和 TfidfVectorizer
文本数据预处理的第一步通常是进行分词,分词后会进行向量化的操作.在介绍向量化之前,我们先来了解下词袋模型. 1.词袋模型(Bag of words,简称 BoW ) 词袋模型假设我们不考虑文本中词与词 ...
- 机器学习 第4篇:数据预处理(sklearn 插补缺失值)
由于各种原因,现实世界中的许多数据集都包含缺失值,通常把缺失值编码为空白,NaN或其他占位符.但是,此类数据集与scikit-learn估计器不兼容,这是因为scikit-learn的估计器假定数组中 ...
- 数据预处理 | 通过 Z-Score 方法判断异常值
判断异常值方法:Z-Score 计算公式 Z = (X-μ)/σ 其中μ为总体平均值,X-μ为离均差,σ表示标准差.z的绝对值表示在标准差范围内的原始分数与总体均值之间的距离.当原始分数低于平均值时, ...
- sklearn数据预处理-scale
对数据按列属性进行scale处理后,每列的数据均值变成0,标准差变为1.可通过下面的例子加深理解: from sklearn import preprocessing import numpy as ...
- 使用sklearn进行数据挖掘-房价预测(4)—数据预处理
在使用机器算法之前,我们先把数据做下预处理,先把特征和标签拆分出来 housing = strat_train_set.drop("median_house_value",axis ...
- 【sklearn】数据预处理 sklearn.preprocessing
数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...
- python中常用的九种数据预处理方法分享
Spyder Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...
- sklearn数据预处理
一.standardization 之所以标准化的原因是,如果数据集中的某个特征的取值不服从标准的正太分布,则性能就会变得很差 ①函数scale提供了快速和简单的方法在单个数组形式的数据集上来执行标准 ...
- sklearn学习笔记(一)——数据预处理 sklearn.preprocessing
https://blog.csdn.net/zhangyang10d/article/details/53418227 数据预处理 sklearn.preprocessing 标准化 (Standar ...
随机推荐
- Java:集合类的区别详解
Java中集合类的区别 Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放. 集合 : 集合对象:用于管理其他若干对象的对象 数组:长度不可 ...
- namespace使用方法
https://blog.csdn.net/CHIERYU/article/details/50262043 参考值这文献
- solr 常用命令
1.启动和关闭 a.启动和重启 启动和重启命令有很多选项让你运行在SolrCloud模式,使用示例配置,以hostname为开头或者非默认端口,指向本地ZooKeeper. bin/solr star ...
- jquery给多个span赋值
因为我想在页面载入完毕后,有几个地方显示当前时间,所以我须要给多个span赋值. span代码的写法例如以下: <span name="currentDate">< ...
- 关于web后门权限防删的一个新思路
见土司有一帖子 具体看下面连接 https://www.t00ls.net/thread-26444-1-2.html 这是php的 其实IIS也有类似的 这是MSF生成的一个ASPX执行shellc ...
- 在windows上一键编译各种版本的protobuf(2017-12-05修改)
所需工具 : cmake for windows 和 git for windows 原理:protobuf 是google的一个开源项目,其源代码在github上可以下载到,并且源码都采用cm ...
- python 道生一,一生二,二生三,三生万物
千万不要被所谓“元类是99%的python程序员不会用到的特性”这类的说辞吓住.因为每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生万物 我是谁?我从哪来 ...
- Nginx限制连接和请求
一.ngx_http_limit_conn_module对同一个ip/server的连接数做限制.配置指令:limit_conn_zone语法: limit_conn_zone $variable z ...
- 网络编程 TCP学习
上传txt文本 通过socket向服务端发送数据 然后用serversocket 接收socket 通过流读取数据保存 服务端在发送确认信息并在client输出 client import java. ...
- Ubuntu16.04安装QQ
说明:一开始,我在Ubuntu 16.04下安装的QQ版本是Wineqq2013SP6-20140102-Longene,但后来发现这个版本QQ在linux下问题很多,比如不能用键盘输入密码,QQ表情 ...