机器学习 第4篇:数据预处理(sklearn 插补缺失值)
由于各种原因,现实世界中的许多数据集都包含缺失值,通常把缺失值编码为空白,NaN或其他占位符。但是,此类数据集与scikit-learn估计器不兼容,这是因为scikit-learn的估计器假定数组中的所有值都是数字,并且都存在有价值的含义。如果必须使用不完整数据集,那么处理缺失数据的基本策略是丢弃包含缺失值的整个行和/或列,但是,这是以丢失有价值的数据为代价的(即使数据不完整),更好的策略是估算缺失值,从数据的已知部分推断出缺失值,这就是插补(imputation)。
单变量插补法(univariate imputation),仅使用第i个特征维度中的非缺失值来插补第i个特征维度中的值。相比之下,多变量插补算法(multivariate imputation)会使用整个可用特征维度集来估算缺失值。
一,单变量插补
在sklearn包中,使用SimpleImputer估算器来实现单变量插补,单变量插补的处理策略(由strategy参数制定)有四个:mean,median,most_frequent和constant(搭配fill_value参数使用)。其中,mean和median分别表示使用均值和中位数来插补缺失值;对于定性数据,可以使用most_frequent(众数)来插补缺失值。
>>> import numpy as np
>>> from sklearn.impute import SimpleImputer
>>> imp = SimpleImputer(missing_values=np.nan, strategy='mean')
>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
SimpleImputer()
>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]
>>> print(imp.transform(X))
[[4. 2. ]
[6. 3.666...]
[7. 6. ]]
二,多变量插补
在scikit-learn包中,多变量插补使用IterativeImputer估算器来实现,该估算器把含有缺失值的每个特征建模为其他特征的函数,并使用该估算值进行插补。
多变量插补法以迭代循环的方式进行:
- 在每个步骤中,将特征列指定为输出y,将其他特征列视为输入X。
- 把回归器拟合到已知的y的(X,y)上。
- 然后,使用回归器预测y的缺失值。
- 针对每个特征以迭代方式完成此操作,然后在max_iter插补回合中重复此操作。
- 返回最后一轮估算的结果。
注意:多变量插补估算器目前仍处于试验阶段:默认参数或行为可能会更改。 解决以下问题将有助于稳定IterativeImputer:
- 收敛标准(#14338):IterativeImputer不会收敛,事实上,收敛准则似乎不会随着迭代而下降。
- 默认估计量(#13286):使用正则化最小二乘模型进行迭代插补与使用NMF进行插补大致相同。 取而代之的是,至少在sample_posterior = False的情况下,否则,我们应该使用RandomForestRegressor作为IterativeImputer中的默认回归器。
- 随机状态的使用 (#15611):通过random_state指定RandomState对象,来保证结果可重复,有些跟scikit-learn相兼容的模块可能不兼容RandomState对象。
要使用多变量插补,需要显式导入enable_iterative_imputer。
>>> import numpy as np
>>> from sklearn.experimental import enable_iterative_imputer
>>> from sklearn.impute import IterativeImputer
>>> imp = IterativeImputer(max_iter=10, random_state=0)
>>> imp.fit([[1, 2], [3, 6], [4, 8], [np.nan, 3], [7, np.nan]])
IterativeImputer(random_state=0)
>>> X_test = [[np.nan, 2], [6, np.nan], [np.nan, 6]]
>>> # the model learns that the second feature is double the first
>>> print(np.round(imp.transform(X_test)))
[[ 1. 2.]
[ 6. 12.]
[ 3. 6.]]
注意,IterativeImputer 返回单个插补而不是多个插补,但是,当设置sample_posterior = True时,通过把IterativeImputer重复应用于具有不同随机种子的同一数据集,也可以将其用于多个插补。
三,最邻近插补
KNNImputer 类提供了使用k最近邻方法来填充缺失值的插补。默认情况下,使用nan_euclidean_distances作为从存在缺失值的特征中计算欧氏距离的度量标准,用欧氏距离来查找最近的邻居。从存在缺失值的特征中选取最邻近的n_neighbors个邻居,使用这n_neighbors个邻居的值估算特征缺失的值。邻居的特征被均匀地平均,或通过到每个邻居的距离加权。如果一个样本有多个特征缺失,那么该样本的邻居可能会有所不同,具体取决于要插补的特定特征。当可用邻居的数量小于n_neighbors,并且与训练集之间没有定义的距离时,在插补过程中将使用该特征的训练集的平均值。如果存在至少一个具有定义距离的邻居,则在插补期间将使用其余邻居的加权或未加权平均值。如果训练中始终缺少某个特征,则在变换过程中将其删除。
以下代码段演示了如何使用具有缺失值的样本的两个最近邻居的平均特征值替换编码为np.nan的缺失值:
>>> import numpy as np
>>> from sklearn.experimental import enable_iterative_imputer
>>> from sklearn.impute import IterativeImputer
>>> imp = IterativeImputer(max_iter=10, random_state=0)
>>> imp.fit([[1, 2], [3, 6], [4, 8], [np.nan, 3], [7, np.nan]])
IterativeImputer(random_state=0)
>>> X_test = [[np.nan, 2], [6, np.nan], [np.nan, 6]]
>>> # the model learns that the second feature is double the first
>>> print(np.round(imp.transform(X_test)))
[[ 1. 2.]
[ 6. 12.]
[ 3. 6.]]
参考文档:
6.4. Imputation of missing values
机器学习 第4篇:数据预处理(sklearn 插补缺失值)的更多相关文章
- sklearn学习笔记(一)——数据预处理 sklearn.preprocessing
https://blog.csdn.net/zhangyang10d/article/details/53418227 数据预处理 sklearn.preprocessing 标准化 (Standar ...
- 机器学习实战基础(十):sklearn中的数据预处理和特征工程(三) 数据预处理 Preprocessing & Impute 之 缺失值
缺失值 机器学习和数据挖掘中所使用的数据,永远不可能是完美的.很多特征,对于分析和建模来说意义非凡,但对于实际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的 ...
- 【sklearn】数据预处理 sklearn.preprocessing
数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...
- Python数据预处理(sklearn.preprocessing)—归一化(MinMaxScaler),标准化(StandardScaler),正则化(Normalizer, normalize)
关于数据预处理的几个概念 归一化 (Normalization): 属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现. 常 ...
- python大战机器学习——数据预处理
数据预处理的常用流程: 1)去除唯一属性 2)处理缺失值 3)属性编码 4)数据标准化.正则化 5)特征选择 6)主成分分析 1.去除唯一属性 如id属性,是唯一属性,直接去除就好 2.处理缺失值 ( ...
- scikit-learn与数据预处理
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 机器学习实战基础(九):sklearn中的数据预处理和特征工程(二) 数据预处理 Preprocessing & Impute 之 数据无量纲化
1 数据无量纲化 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”.譬如梯度和矩阵为核心的算法中,譬如逻辑回 ...
- 机器学习实战基础(八):sklearn中的数据预处理和特征工程(一)简介
1 简介 数据挖掘的五大流程: 1. 获取数据 2. 数据预处理 数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字 ...
- 机器学习实战基础(十三):sklearn中的数据预处理和特征工程(六)特征选择 feature_selection 简介
当数据预处理完成后,我们就要开始进行特征工程了. 在做特征选择之前,有三件非常重要的事:跟数据提供者开会!跟数据提供者开会!跟数据提供者开会!一定要抓住给你提供数据的人,尤其是理解业务和数据含义的人, ...
随机推荐
- get、post、
1.get请求 get请求会把参数放在url后面,中间用?隔开,也可以把参数放在请求body中,如果参数中有中文,http传的时候requests框架会将中文换成urlencode编码 2.get和p ...
- MySQL中的事务原理和锁机制
本文主要总结 MySQL 事务几种隔离级别的实现和其中锁的使用情况. 在开始前先简单回顾事务几种隔离级别以及带来的问题. 四种隔离级别:读未提交.读已提交.可重复读.可串行化. 带来的问题:脏读.不可 ...
- 虚拟机下Ubuntu共享文件夹不能显示的一种解决方法
原文链接:https://blog.csdn.net/huyangzhilin/article/details/70666937
- Rest Framework:序列化组件
Django内置的serializers(把对象序列化成json字符串 from django.core import serializers def test(request): book_list ...
- Asp.NetCore之AutoMapper基础篇
应用场景 现在由于前后端技术的分离,后端程序员在使用ORM框架开发后台API接口的时候,往往会将数据库的"数据模型"直接提供给前端.而大多数时候,可能这些数据并不能够满足前端展示的 ...
- 基本的C#面试问题(15例)
1.给定一个int数组,编写方法以统计所有偶数的值. 有很多方法可以做到这一点,但是最直接的两种方法是: static long TotalAllEvenNumbers(int[] intArray) ...
- ModelViewSet里的过滤、排序、分页、序列化设置
1.DRF初始化 1.认证 2.权限 3.限流 4.序列化 5.分页 6.版本 7.过滤 8.排序 1.1安装DjangoRestFramework pip install djangoresfra ...
- Django+Nginx+uWSGI生产环境部署
生产环境中的数据流 参考文档: wsgi详解:https://blog.csdn.net/li_101357/article/details/52748323 wsgi协议介绍(萌新版):https: ...
- Java之选择排序(正序、逆序)
public class SelectSort { public static void main(String[] args) { /** * @author JadeXu * @// TODO: ...
- 转:解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别
解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别 标准Http协议支持六种请求方法,即: 1.GET 2.POST 3.PUT 4.Delete 5.HEAD ...