在Python中处理缺失值的完整指南
数据清理是机器和深度学习模型表现良好的最关键步骤之一。它涉及到通过处理缺失值、删除特殊字符、处理倾斜数据等方式将原始数据转化为终端用户可以解释的格式。
这篇文章将探讨数据清理和处理缺失值的问题。
一般来说,缺失值用NaN,null, 或None 表示。
数据集的数据结构可以通过删除错误、重复、损坏的项目和其他问题来改善。
前提条件
- 在你的Python环境中安装Python。
- 有一些Python编程语言的知识是最好的。
处理缺失值的意义
有效的数据管理需要有填补空白的能力。这在数据分析中是个大问题,因为它对结果有很大的影响。
有很多数据空白的模型的结果真的很难接受。在统计研究中,倾斜的估计值可能会使它不可靠,给人们带来错误的结果。
缺失值引起的问题
- 有缺失值会使测试过程中排除[无效假设]更加困难。
- 如果数据丢失,参数估计可能会受到影响。
- 样本的代表性可能因此而被扭曲。
- 正因为如此,解释研究结果可能更加困难。
- 模型的准确性可能不合适。
- 数据的不一致性可能会导致在训练模型时经常出错。
缺失数据的类型
一些分类或预测模型取决于数据集中缺少的数据模式。
完全随机缺失(MCAR)
使用MCAR时,是否有观察到的或未观察到的数据并不重要。如果数据是MCAR,数据可以被看作是整个感兴趣的数据集的简单随机样本。
MCAR是一个过于乐观的、经常没有根据的假设。当数据缺失的机会与预测值或观察到的对查询的反应无关时,就会出现这种假设。
简单地说,与目标变量不相关的缺失数据可以被忽略。
解决方案:删除行或列。
随机缺失(MAR)
在MAR数据的情况下,观察到的数据与缺失的数据有系统的联系。
对包含MAR数据的数据集进行完整的个案分析,可能会也可能不会导致偏差,这取决于是否所有相关数据都存在,并且没有字段缺失。只要你考虑到已知的因素,你就可以客观地分析这个案例。
与其说是考虑到单一的缺失值,不如说是观察到的反应群对实验者收到缺失答案的可能性有更大的影响。
解决方案:归因数据。
当我们发现缺失的数据与目标变量有很高的相关性时,我们就将缺失的数据归入,从而获得更好的模型结果。
非随机缺失(MNAR)
当数据为MNAR时,缺失的数据总是与未观察到的数据相联系,这意味着缺失的数据与研究者无法测量的事物或事件有关。
对一个有MNAR数据的数据集进行完整的个案分析可能会有偏差,因为缺失的数据源没有被计算在内。这意味着这个问题无法在分析中得到解决,也就是说,这个事实会使你对数据集的影响的结论出现偏差。
非随机缺失是唯一缺乏的信息,除了之前列出的类别之外。
管理MNAR数据集是一个重要的烦恼。对缺失的数据进行建模是在这种情况下对参数进行近似的唯一方法。
解决方案:改进数据集查找数据。
归纳信息的类型
各种大小和形状的推断都是以推断的形式提供的。
为了建立一个准确的应用模型,我们必须首先填补数据集中的任何数据空白。
这些是一些技术。
- 单一归因法:只向数据集添加一次缺失值,以创建一个归入的数据集。
- 单变量归因法:这种情况下,只有目标变量被用来生成归因值。
- 多重归因:在多行数据中进行重复缺失值的归纳。为了得到多个归入的数据集,你必须重复一次归入过程。
- 多变量归因:基于其他变量进行归因,例如使用线性回归估计缺失值。
如何修复我们数据集的缺失数据
有各种各样的方法来处理缺失数据。我们将看一下其中的一些,但首先,我们将从导入库等方面入手。
import pandas as pan
import numpy as num
dataset = pan.read_csv("IncomeAndGender.csv")
dataset.head()
输出。
Salary Gender AgeNumber PhD
0 150.0 1 30.0 Yes
1 30.0 0 NaN Yes
2 50.0 0 50.0 Nan
3 20.0 1 20.0 AND
4 15.1 0 25.0 No
看一下数据集的维度,作为衡量其大小的一个标准。
print(dataset.shape)
输出。
(6, 4)
在寻找缺失的信息。
print(dataset.isnull().sum())
输出。
Salary 0
Gender 0
AgeNumber 1
PhD 0
dtype: int64
不要担心没有足够的信息。算法决定如何读取你给出的数据,以及如果没有足够的数据将如何使用它。
可以训练损失减少算法来寻找缺失数据的最佳值。
在线性回归中会出现一个错误。我们需要处理数据不足的问题,直到我们弄清楚模型出了什么问题。如果是正面的,我们就继续。如果不是,我们就停止。
dataset["AgeNumber"][:10]
输出。
0 30.0
2 50.0
3 20.0
4 25.0
5 20.0
Name: AgeNumber, dtype: float64
删除不使用的行/列
接下来要做的最直接的事情就是把没有任何数据的观测值剔除。最后,你可能不知道重要的事情。
Python的panda的模块有一个叫做dropna() 的方法,可以摆脱空行。在处理机器学习问题时,不要试图填满每一列的空白。
去除行/列有好处也有坏处。
- 更快、更容易
- 大约40%的数据会丢失。
dataset.dropna(inplace=True)
print(dataset.isnull().sum())
输出。
Salary 0
Gender 0
AgeNumber 0
PhD 0
dtype: int64
基于平均值的代入法
在计算了一列中的非缺失值后,每个缺失值都可以被恢复。对数字以外的东西使用这种方法是受到严格限制的。
这是一种分析少量数据的简单方法。一个缺陷是缺乏特征相关性,但也有其他缺陷。
这种技术一次只对一列起作用。倾斜的平均值很可能会取代离群值的处理。
该技术只对数字数据集起作用,当独立变量相关时就会失败。
使用均值还破坏了变量之间的关系。诚然,插入的平均值保留了观察到的数据平均值。即使在数据随机缺失的情况下,也可以得到一个公平、准确的均值估计。
dataset["AgeNumber"] = dataset["AgeNumber"].replace(num.NaN, dataset["AgeNumber"].mean())
print(dataset["AgeNumber"][:10])
输出。
0 30.0
2 50.0
3 40.0
4 25.0
5 20.0
Name: AgeNumber, dtype: float64
使用中位数来计算
使用中位值是另一种Imputation的方法,它解决了前一种方法的离群点问题。
离群点是指与数据集的其他部分明显不同的对象或数据项。
在排序时,一列的中心值被更新,而不是离群值。没有发现自变量之间的相关性,而且它只适用于数字数据集。自变量就是你精确改变的东西。
dataset["AgeNumber"] = dataset["AgeNumber"].replace(num.NaN, dataset["AgeNumber"].median())
print(dataset["AgeNumber"][:10])
输出。
0 30.0
2 50.0
3 20.0
4 25.0
5 20.0
Name: AgeNumber, dtype: float64
基于最常见的值(模式)的归因法
它可以应用于数值数量有限的分类变量。
Education level 是属于这种类型的序数绝对属性的一个很好的例子。
由于在利用这一程序时没有考虑特征关系,所以会出现数据偏差。如果类别值在类别中的分布不均匀,那么数据的偏差就会增加。
它与所有的数据格式兼容,独立特征之间的协方差值不能被预测。
import statistics
dataset["AgeNumber"] = dataset["AgeNumber"].replace(num.NaN, statistics.mode(dataset["AgeNumber"]))
print(dataset["AgeNumber"][:10])
插值-线性
用一条直线将点按递增的顺序连接起来,以接近缺失的值。
在大多数情况下,未知值的计算顺序与之前的值相同,呈升序排列。我们不需要指定线性插值,因为它是默认的方法。
几乎总是这样,它将被用于时间序列数据集中。
dataset["AgeNumber"] = dataset["AgeNumber"].interpolate(method='linear', limit_direction='forward', axis=0)
dataset.isnull().sum()
输出。
Salary 0
Gender 0
AgeNumber 0
PhD 0
dtype: int64
为了填补我们数据集中的空白,我们可以使用前面提到的概念。
谈到寻找缺失值,并没有一种方法是最有效的。根据我们要使用的特征和应用,寻找缺失值是不同的。
因此,我们必须通过实验来找到适合我们应用的最佳解决方案。
结论
数据清洗是我们在这篇文章中探讨的预处理数据模块的一个特征。此外,数据丢失可能导致参数估计的偏差,样本代表性的降低,以及更复杂的研究分析。
最后,我们研究了处理缺失数据的各种方法以及这些技术的使用方法。
我希望你觉得这个教程很有帮助。