机器学习 第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 简介
当数据预处理完成后,我们就要开始进行特征工程了. 在做特征选择之前,有三件非常重要的事:跟数据提供者开会!跟数据提供者开会!跟数据提供者开会!一定要抓住给你提供数据的人,尤其是理解业务和数据含义的人, ...
随机推荐
- django搭建
1.进入终端使用虚拟环境安装---pip install django==2.2 2.创建新的工程django-admin startproject bookpro 3.创建app或模块 使用djan ...
- 关于深度学习之中Batch Size的一点理解(待更新)
batch 概念:训练时候一批一批的进行正向推导和反向传播.一批计算一次loss mini batch:不去计算这个batch下所有的iter,仅计算一部分iter的loss平均值代替所有的. 以下来 ...
- LeetCode 040 Combination Sum II
题目要求:Combination Sum II Given a collection of candidate numbers (C) and a target number (T), find al ...
- python 网络并发 :理论部分
1.今日内容大纲 进程的介绍(理论部分) 进程的创建以及分析 获取进程的pid 进程之间的隔离 1.进程的介绍(理论部分) 1.1什么是进程 一个正在被cpu执行的程序就是一个进程,一个程序可以开启多 ...
- moviepy音视频剪辑:与大小相关的视频变换函数详解
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...
- 第10.9节 Python子包的导入方式介绍
在<第10.8节 Python包的导入方式详解>详细介绍了包的导入方式,子包也是包,子包的导入与包的导入方法上没有本质区别,但二者还是有所不同.本节对照二者的方式介绍子包与包导入的关系: ...
- Python正则表达式re.findall("[A-Za-z]([A-Za-z0-9])*[.]txt",'Abc2019.txt')的结果为什么是['9']
在<Python妙用re.sub分析正则表达式匹配过程>中老猿分析了findall函数的返回情况,老猿前一阵子在执行这个语句时: >>> re.findall(" ...
- Mybatis学习04
title: Mybatis学习04 date: 2020-01-20 21:48:00 tags:Mybatis学习的第四篇笔记 这次的笔记主要是mybatis中的注解 <!--more--& ...
- 3、tensorflow变量运算,数学运算
import tensorflow as tf import numpy as np a = tf.range(1,7) a = tf.reshape(a,[2,3]) b = tf.constant ...
- LeetCode初级算法之字符串:344 反转字符串
反转字符串 题目地址:https://leetcode-cn.com/problems/reverse-string/ 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] ...