利用Python对一些已经定位好的缺失数据进行缺失值插补

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

1、单变量与多变量插补的区别

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

2、单变量插补

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

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

import numpy as np
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
imp_mean.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]])

X = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]
print(imp_mean.transform(X))

结果:
在这里插入图片描述

3、多变量插补

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

注意 :这个估计器目前还处于试验阶段:预测和API可能会在没有任何弃用周期的情况下发生变化。要使用它,您需要显式地导入enable_iterative_imputer

import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imp_mean = IterativeImputer(random_state=0)
imp_mean.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]])

X = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]
imp_mean.transform(X)

结果:
在这里插入图片描述

参考:

  • http://scikitlearn.com.cn/0.21.3/41/
  • https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html#sklearn.impute.SimpleImputer
  • https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html#sklearn.impute.IterativeImputer
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python进行数据缺省识别和拉格朗日法对缺失进行的步骤如下: 1. 导入必要的库,例如`pandas`,`numpy`和`scipy`。 ```python import pandas as pd import numpy as np from scipy.interpolate import lagrange ``` 2. 读取数据文件,查看数据的基本信息,如数据行列数、数据类型、数据缺省等。 ```python data = pd.read_csv('data.csv') print(data.shape) print(data.info()) print(data.isnull().sum()) ``` 3. 对数据缺省进行拉格朗日法的。首先需要定义一个函数,该函数用于求取拉格朗日多项式系数,并返回结果。 ```python def lagrange_interp(data, col, k): y = data[col].dropna().values x = data.index.dropna().values f = lagrange(x, y) return f(k) ``` 其中,`data`为原始数据,`col`为需要数据列名,`k`为的位置。 4. 遍历数据中所有的缺失,并利用拉格朗日进行。 ```python for col in data.columns: for i in range(len(data)): if (data[col].isnull())[i]: data.loc[i, col] = lagrange_interp(data, col, i) ``` 5. 将后的数据保存到新的文件中。 ```python data.to_csv('new_data.csv', index=False) ``` 完整代码示例: ```python import pandas as pd import numpy as np from scipy.interpolate import lagrange # 读取数据文件 data = pd.read_csv('data.csv') print(data.shape) print(data.info()) print(data.isnull().sum()) # 拉格朗日函数 def lagrange_interp(data, col, k): y = data[col].dropna().values x = data.index.dropna().values f = lagrange(x, y) return f(k) # 对所有缺失进行 for col in data.columns: for i in range(len(data)): if (data[col].isnull())[i]: data.loc[i, col] = lagrange_interp(data, col, i) # 保存后的数据 data.to_csv('new_data.csv', index=False) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值