5.4 缺失值插补

因为各种各样的原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格、NaNs,或者是其他的占位符。但是这样的数据集并不能scikit-learn学习算法兼容,因为大多的学习算法都默认假设数组中的元素都是数值,因而所有的元素都有自己的意义。 使用不完整的数据集的一个基本策略就是舍弃掉整行或整列包含缺失值的数据。但是这样就付出了舍弃可能有价值数据(即使是不完整的 )的代价。 处理缺失数值的一个更好的策略就是从已有的数据推断出缺失的数值。有关插补(imputation),请参阅常用术语表和API元素条目。

5.4.1 单变量与多变量插补

一种类型的插补算法是单变量算法,它只使用第i个特征维度中的非缺失值(如impute.SimpleImputer)来插补第i个特征维中的值。相比之下,多变量插补算法使用整个可用特征维度来估计缺失的值(如impute.IterativeImputer)。

5.4.2 单变量插补

SimpleImputer类提供了计算缺失值的基本策略。缺失值可以用提供的常数值计算,也可以使用缺失值所在的行/列中的统计数据(平均值、中位数或者众数)来计算。这个类也支持不同的缺失值编码。

以下代码段演示了如何使用包含缺失值的列(轴0)的平均值来替换编码为 np.nan 的缺失值:

>>> import numpy as np

>>> from sklearn.preprocessing import Imputer

>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)

>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])

Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)

>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]

>>> print(imp.transform(X))

[[ 4. 2. ]

[ 6. 3.666...]

[ 7. 6. ]]

>>> import scipy.sparse as sp

>>> X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])

>>> imp = Imputer(missing_values=0, strategy='mean', axis=0)

>>> imp.fit(X)

Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)

>>> X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])

>>> print(imp.transform(X_test))

[[ 4. 2. ]

[ 6. 3.666...]

[ 7. 6. ]]

注意,此格式不用于隐式存储矩阵中的缺失值,因为它会在转换时将其密集化。编码为0的缺失值必须与密集输入一起使用。

当使用 'most_frequent' 或 'constant' 策略时,SimpleImputer类还支持以 string values 或 pandas categoricals 表示的分类数据(categorical data)

>>> import pandas as pd

>>> df = pd.DataFrame([["a", "x"],

... [np.nan, "y"],

... ["a", np.nan],

... ["b", "y"]], dtype="category")

...

>>> imp = SimpleImputer(strategy="most_frequent")

>>> print(imp.fit_transform(df))

[['a' 'x']

['a' 'y']

['a' 'y']

['b' 'y']]

5.4.3 多变量插补

一种更复杂的方法是使用IterativeImputer类,它将每个缺失值的特征建模为其他特征的函数,并使用该估计值进行估算。它以迭代循环方式执行:在每个步骤中,将要素目标列指定为输出y,将其他列视为输入X。使用一个回归器来在已知(未缺失)y的样本上,对(X,y)进行拟合。然后使用这个回归器来预测缺失的y值。这是以迭代的方式对每个特征进行的,然后重复max_iter轮。最后一轮的计算结果被返回。

注意 :这个估计器目前还处于试验阶段:预测和API可能会在没有任何弃用周期的情况下发生变化。要使用它,您需要显式地导入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(add_indicator=False, estimator=None,

imputation_order='ascending', initial_strategy='mean',

max_iter=10, max_value=None, min_value=None,

missing_values=nan, n_nearest_features=None,

random_state=0, sample_posterior=False, tol=0.001,

verbose=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.]]

5.4.3.1 多变量插补的灵活性

在R数据科学生态系统中,有许多成熟的估算包:Amelia, mi, mice, missForest等。misforest是一种很流行的算法,它是不同序列计算算法的一个特殊实例,这些算法都可以使用IterativeImputer来实现,通过传递不同的回归函数来预测缺失的特征值。在misforest的情况下,这个回归因子是一个随机森林。请参见Imputing missing values with variants of IterativeImputer

5.4.3.2 单次与多次插补

在统计学界,通常的做法是执行多次计算,例如,为单个特征矩阵生成m个单独的计算。然后,每一个m的估算都通过后续的分析管道(例如,特征工程、聚类、回归、分类)进行。m个最终分析结果(例如,延迟验证错误)允许数据科学家了解由于缺失值所导致的固有不确定性,分析结果可能会有何不同。上述做法称为多重插补。

我们实现IterativeImputer的灵感来自于R的MICE包[1],但与之不同的是,我们返回了一个单一的插补,而不是多个插补。然而,当sample_posterior=True时,IterativeImputer也可以通过重复应用于具有不同随机种子的同一数据集来进行多次计算。参见[2]第4章,以获得更多关于多重和单次估算的讨论。

当用户对由于缺失值而导致的测量不确定性不感兴趣时,单次和多次插补在预测和分类上下文中有多大用处,这仍然是一个有待解决的问题。

注意,调用IterativeImputer的转换方法不允许改变样本的数量。因此,单次调用transform不能实现多次计算。

5.4.4 参考

Stef van Buuren, Karin Groothuis-Oudshoorn (2011). “mice: Multivariate Imputation by Chained Equations in R”. Journal of Statistical Software 45: 1-67.

Roderick J A Little and Donald B Rubin (1986). “Statistical Analysis with Missing Data”. John Wiley & Sons, Inc., New York, NY, USA.

5.4.5 标记缺失值

MissingIndicator转换器用于将数据集转换为相应的二进制矩阵,以指示数据集中缺失值的存在。这个变换与归算结合起来是有用的。当使用插补时,保存关于哪些值丢失的信息可以提供有用的信息。

NaN通常用作缺少值的占位符。但是,它强制数据类型为浮点数。参数missing_values允许指定其他占位符,如整数。 在以下示例中,我们将使用-1作为缺失值

>>> from sklearn.impute import MissingIndicator

>>> X = np.array([[-1, -1, 1, 3],

... [4, -1, 0, -1],

... [8, -1, 1, 0]])

>>> indicator = MissingIndicator(missing_values=-1)

>>> mask_missing_values_only = indicator.fit_transform(X)

>>> mask_missing_values_only

array([[ True, True, False],

[False, True, True],

[False, True, False]])

参数features用于选择构造掩码的特征。默认情况下,它是 'missing-only',在fit时返回包含缺失值的特征的输入掩码

>>> indicator.features_

array([0, 1, 3])

参数features可以设置为'all'以返回所有特征,无论它们是否包含缺失的值

>>> indicator = MissingIndicator(missing_values=-1, features="all")

>>> mask_all = indicator.fit_transform(X)

>>> mask_all

array([[ True, True, False, False],

[False, True, False, True],

[False, True, False, False]])

>>> indicator.features_

array([0, 1, 2, 3])

当在 Pipeline 中使用 MissingIndicator时, 务必使用FeatureUnion 或ColumnTransformer来添加 indicator features 到 regular features中. 首先,我们在iris数据集上插补一些缺失值:

>>> from sklearn.datasets import load_iris

>>> from sklearn.impute import SimpleImputer, MissingIndicator

>>> from sklearn.model_selection import train_test_split

>>> from sklearn.pipeline import FeatureUnion, make_pipeline

>>> from sklearn.tree import DecisionTreeClassifier

>>> X, y = load_iris(return_X_y=True)

>>> mask = np.random.randint(0, 2, size=X.shape).astype(np.bool)

>>> X[mask] = np.nan

>>> X_train, X_test, y_train, _ = train_test_split(X, y, test_size=100,

... random_state=0)

现在我们创建一个FeatureUnion。为了使分类器能够处理这些数据,所有的特征都将使用SimpleImputer进行估算。 此外,它还从 MissingIndicator中添加指示变量。

>>> transformer = FeatureUnion(

... transformer_list=[

... ('features', SimpleImputer(strategy='mean')),

... ('indicators', MissingIndicator())])

>>> transformer = transformer.fit(X_train, y_train)

>>> results = transformer.transform(X_test)

>>> results.shape

(100, 8)

当然,我们不能用transformer来做任何预测。我们应该用分类器(例如,DecisionTreeClassifier)将其封装在pipeline中, 以便能够进行预测。

>>> clf = make_pipeline(transformer, DecisionTreeClassifier())

>>> clf = clf.fit(X_train, y_train)

>>> results = clf.predict(X_test)

>>> results.shape

(100,)

python多重插补_5.4 缺失值插补相关推荐

  1. 独家 | 在机器学习中利用统计插补来处理缺失值(附代码)

    作者:Jason Brownlee 翻译:吴振东 校对:冯羽 本文约4500字,建议阅读10分钟 本文以病马数据集为例,帮助你了解在机器学习领域如何利用统计策略来处理缺失值,对代码进行了较为详细的讲解 ...

  2. python 线性回归回归 缺失值 忽略_机器学习 第3篇:数据预处理(使用插补法处理缺失值)...

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  3. python预处理缺失值_数据预处理 第3篇:数据预处理(使用插补法处理缺失值)...

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  4. python均值插补法填补缺失值_R语言笔记(四):特殊值处理

    输入数据后,我们就能在 R 中对数据进行一系列的操作了.但现实获得的第一手数据往往都是不完整.不整齐的,比如存在数据本身缺失值.离群值,数据框存在冗余行或列,抑或数据需要进一步加工才能获取有意义的变量 ...

  5. 数据预处理 第3篇:数据预处理(使用插补法处理缺失值)

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  6. R语言缺失值插补之simputation包

    获取更多R语言和生信知识,请欢迎关注公众号:医学和生信笔记 医学和生信笔记 公众号主要分享:1.医学小知识.肛肠科小知识:2.R语言和Python相关的数据分析.可视化.机器学习等:3.生物信息学学习 ...

  7. 序列数据缺失值插补(线性插值)

      (时间)序列数据处理过程中往往会有缺失值(例如9999.NaN或其他的异常值),对这些数据的处理是下一步分析.研究和应用的基础.   本文以 2018年 MOD09A01 地表反射率数据计算的 8 ...

  8. 应用预测建模第六章线性回归习题6.3【缺失值插补,分层抽样,预测变量重要性,重要预测变量如何影响响应变量,多元线性回归,稳健回归,偏最小二乘回归,岭回归,lasso回归,弹性网】

    模型:多元线性回归,稳健回归,偏最小二乘回归,岭回归,lasso回归,弹性网 语言:R语言 参考书:应用预测建模 Applied Predictive Modeling (2013) by Max K ...

  9. 插补、直线插补、联动与插补

    转自:http://blog.gkong.com/218hty_27393.ashx 什么是插补? 试由直线的逐点比较工作节拍说明其插补过程: 答:插补是在组成轨迹的直线段或曲线段的起点和终点之间,按 ...

最新文章

  1. AI应届生年薪涨到40万了,你现在转行还来得及!
  2. 安卓实现定位功能的4种方式
  3. freemarke之TemplateDirectiveModel详解
  4. 20142335郝昊第三周学习总结
  5. sqoop mysql 安装_Sqoop安装及验证_MySQL
  6. 报表session与应用session常识普及
  7. Spring的事务管理和数据库事务相关知识
  8. 网络流24题(更新中
  9. java mybatis 事务,单独的使用mybatis 如何来管理事务
  10. 【云计算】云的七大分类定义说明
  11. 机器学习中的数学——激活函数(一):Sigmoid函数
  12. inputbox使用
  13. 减肥 低热量食物和运动卡路里
  14. 轻松理解Shel脚本中的变量(一)
  15. Mysql复制原理以及流程
  16. SpringBoot整合定时任务和邮件发送(邮箱 信息轰炸 整蛊)
  17. oracle获取每月的第一天和最后一天
  18. 简述冯诺依曼工作原理_冯.诺依曼计算机的基本工作原理是什么??
  19. php生成字母头像,Identicon:实现根据用户账号生成像素头像php版
  20. 如何连接并处理 sdf 数据库文件(便捷数据库处理)

热门文章

  1. 阿里巴巴的类ChatGPT产品
  2. Docker|Maven编译推送Docker服务器生成镜像
  3. 动态内存分配(详解)
  4. android8.1 修改默认时区为中国
  5. 编码的奥秘:从算盘到芯片
  6. 前端能获取用户网速吗_js实现的非常简单的网速测试方法
  7. 本酪忻残厮匆谕窒蕉稼砂瞬颈略啪
  8. Soul向港交所递交上市申请,持续发力社交元宇宙赛道
  9. 百度大脑3月新品推荐:EasyDL视频目标追踪全新发布
  10. SRM 683 div1 hard