Python 数据缺失的难题:探索和填补技术

Python 数据缺失的难题:探索和填补技术

数据缺失是统计分析和机器学习中最常见且不可避免的问题。它们影响了数据质量。可能是由于各种原因导致,例如用户在推荐系统中不回答问题,患者在治疗过程中死亡或不遵守治疗措施等。

在本教程中,我们将讨论缺失数据的重要性,并确定缺失数据的原因。

缺失数据机制

在当前时代,数据被视为燃料,也就是说,数据是一种非常强大的东西。它可以以多种方式使用。但是不完整的数据可能会导致问题。因此,我们首先需要了解数据的重要性,更重要的是,我们需要全面地确定缺失数据发生的原因。数据收集过程也在确定数据收集错误方面发挥着重要作用。

缺失数据的机制可以分为三个主要类别。这些类别基于缺失数据的性质和观察到的数据。以下是这些机制:

完全随机缺失 (MCAR)

缺失数据的性质与观察到的数据相关,但与缺失数据无关。例如- 孩子们因为父母搬到其他城市而缺课,所以他们不得不离开学校。

随机缺失 (MAR)

缺失数据的性质与观察到的数据相关,但与缺失数据无关。例如- 孩子们因为父母搬到其他城市而缺课,所以他们不得不离开学校。

非随机缺失 (MNAR)

也被称为不可忽略的缺失,因为缺失机制不能被忽略。只有当既不是MCAR也不是MAR时,才会出现这种情况。变量上的缺失值与观察到的变量和未观察到的变量都有关。例如- 父母拒绝将孩子送去学习中心,因为那里环境有毒,他们不想让孩子受欺负。 MNAR数据的问题与可识别性问题密切相关。

了解数据收集过程和实质性科学知识有助于假设数据机制。统计测试还有助于理解缺失数据机制的类型。

有许多模块可以有效处理缺失数据,但 the fancyimpute模块 非常有用和受欢迎。

Fancyimpute 模块

缺失数据在创建预测模型中起着重要作用;算法在缺失数据集上表现不佳。

Fancyimpute是一个用于缺失数据插补算法的机器学习库。它使用机器学习算法来插补缺失值。Fancyimpute使用整列数据来插补缺失值。它提供两种方法来插补缺失数据:

  • KNN或K最近邻
  • MICE或多重链式方程插补

K最近邻

KNN找出所有特征中相似的数据点,并填补缺失值。让我们了解以下示例。

示例

import pandas as pd
import numpy as np
# importing the KNN from fancyimpute library
from fancyimpute import KNN

df = pd.DataFrame([[np.nan, 1, np.nan, 0],
        [2, 7, np.nan, 1],
        [np.nan, np.nan, np.nan, 5],
        [np.nan, 8, np.nan, 4],
        [9,  7, 8,   2],
        [2,  5, 7,   9]],
        columns = list('ABCD'))

# printing the dataframe
print(df)

# calling the KNN class
knn_imputer = KNN()
# imputing the missing value with knn imputer
df = knn_imputer.fit_transform(df)

# printing dataframe
print(df)

输出:

A    B    C  D
0  NaN  1.0  NaN  0
1  2.0  7.0  NaN  1
2  NaN  NaN  NaN  5
3  NaN  8.0  NaN  4
4  9.0  7.0  8.0  2
5  2.0  5.0  7.0  9
Imputing row 1/6 with 2 missing, elapsed time: 0.001
[[4.80735271 1.         7.70802941 0.        ]
 [2.         7.         7.57627146 1.        ]
 [5.29411783 7.49760549 7.64000033 5.        ]
 [6.2499999  8.         7.87179494 4.        ]
 [9.         7.         8.         2.        ]
 [2.         5.         7.         9.        ]]

多链方程的多重插补

在这种方法中,小鼠使用多个插补而不是单个插补。它对样本数据执行多个回归,并取平均值。让我们理解以下示例。

示例

import pandas as pd
import numpy as np
# importing the MICE from fancyimpute library
from fancyimpute import IterativeImputer

df = pd.DataFrame([[np.nan, 15, 1, np.nan],
        [23, 40, np.nan, 1],
        [np.nan, np.nan, np.nan, 5],
        [np.nan, 3, np.nan, 4],
        [15,   70, 28,   29],
        [20,   35, 57,   91]],
        columns = list('ABCD'))

# printing the dataframe
print(df)

# calling the MICE class
mice_imputer = IterativeImputer()
# imputing the missing value with mice imputer
df = mice_imputer.fit_transform(df)

# printing dataframe
print(df)

输出:

    A     B     C     D
0   NaN  15.0   1.0   NaN
1  23.0  40.0   NaN   1.0
2   NaN   NaN   NaN   5.0
3   NaN   3.0   NaN   4.0
4  15.0  70.0  28.0  29.0
5  20.0  35.0  57.0  91.0
[[ 32.13508529  15.           1.         -76.25883183]
 [ 23.          40.          23.80426163   1.        ]
 [ 24.47759791  32.58430591  26.67745156   5.        ]
 [ 31.14858991   3.          32.06817994   4.        ]
 [ 15.          70.          28.          29.        ]
 [ 20.          35.          57.          91.        ]]

处理缺失数据

文献、教材和标准课程中提供了许多方法来处理缺失的数据。我们已经讨论了一个重要方法,即 a fancyimputer 。然而,这些方法也存在一些缺点。在使用数据挖掘过程时,需要小心避免偏倚或高估变异性,这些方法表现不佳。

Python 数据缺失的难题:探索和填补技术

案例删除

有两种类型的案例删除方法。第一种是列表删除(也称为完全案例分析),第二种是对删除。案例删除方法用于以按分析为基础删除数据集中的缺失案例。

让我们使用pandas数据帧创建一个包含一些缺失值的虚拟数据集。

示例 1

import pandas as pd  
import numpy as np  
import fancyimpute  
from sklearn.impute import SimpleImputer
data = {'Name': ['John','Paul', np.NaN, 'Wale', 'Mary', 'Carli', 'Steve'], 'Age': [21,23,np.nan,19,25,np.nan,15],'Sex': ['M',np.nan,np.nan,'M','F','F','M'],'Goals': [5,10,np.nan,19,5,0,7],'Assists': [7,4,np.nan,9,7,6,4],'Value': [55,84,np.nan,90,63,15,46]}  
df=pd.DataFrame(data, columns =['Name','Age','Sex','Goals', 'Assists', 'Value'])
print(df)

输出:

    Name   Age  Sex  Goals  Assists  Value
0   John  21.0    M    5.0      7.0   55.0
1   Paul  23.0  NaN   10.0      4.0   84.0
2    NaN   NaN  NaN    NaN      NaN    NaN
3   Wale  19.0    M   19.0      9.0   90.0
4   Mary  25.0    F    5.0      7.0   63.0
5  Carli   NaN    F    0.0      6.0   15.0
6  Steve  15.0    M    7.0      4.0   46.0

在上面的代码中,我们创建了包含缺失值的新数据集。我们可以使用df.dropna()方法来删除所有丢失的值。让我们看一下下面的输出。

示例 2:

import pandas as pd  
import numpy as np  
import fancyimpute  
from sklearn.impute import SimpleImputer
data = {'Name': ['John','Paul', np.NaN, 'Wale', 'Mary', 'Carli', 'Steve'], 'Age': [21,23,np.nan,19,25,np.nan,15],'Sex': ['M',np.nan,np.nan,'M','F','F','M'],'Goals': [5,10,np.nan,19,5,0,7],'Assists': [7,4,np.nan,9,7,6,4],'Value': [55,84,np.nan,90,63,15,46]}  
df=pd.DataFrame(data, columns =['Name','Age','Sex','Goals', 'Assists', 'Value'])
print(df.dropna())

输出:

   Name   Age Sex  Goals  Assists  Value
0   John  21.0   M    5.0      7.0   55.0
3   Wale  19.0   M   19.0      9.0   90.0
4   Mary  25.0   F    5.0      7.0   63.0
6  Steve  15.0   M    7.0      4.0   46.0

我们还可以使用 df.dropna(how=’all’) 来删除包含缺失值的行。我们也可以使用 df.dropna(axis=1, how=’all’) 来指定删除包含缺失值的列。让我们来理解下面的示例。

示例 2

import pandas as pd  
import numpy as np  
import fancyimpute  
from sklearn.impute import SimpleImputer
data = {'Name': ['John','Paul', np.NaN, 'Wale', 'Mary', 'Carli', 'Steve'], 'Age': [21,23,np.nan,19,25,np.nan,15],'Sex': ['M',np.nan,np.nan,'M','F','F','M'],'Goals': [5,10,np.nan,19,5,0,7],'Assists': [7,4,np.nan,9,7,6,4],'Value': [55,84,np.nan,90,63,15,46]}  
df=pd.DataFrame(data, columns =['Name','Age','Sex','Goals', 'Assists', 'Value'])
print(df.dropna(how = 'all'))

输出:

    Name   Age  Sex  Goals  Assists  Value
0   John  21.0    M    5.0      7.0   55.0
1   Paul  23.0  NaN   10.0      4.0   84.0
3   Wale  19.0    M   19.0      9.0   90.0
4   Mary  25.0    F    5.0      7.0   63.0
5  Carli   NaN    F    0.0      6.0   15.0
6  Steve  15.0    M    7.0      4.0   46.0

示例 3

import pandas as pd  
import numpy as np  
import fancyimpute  
from sklearn.impute import SimpleImputer
data = {'Name': ['John','Paul', np.NaN, 'Wale', 'Mary', 'Carli', 'Steve'], 'Age': [21,23,np.nan,19,25,np.nan,15],'Sex': ['M',np.nan,np.nan,'M','F','F','M'],'Goals': [5,10,np.nan,19,5,0,7],'Assists': [7,4,np.nan,9,7,6,4],'Value': [55,84,np.nan,90,63,15,46]}  
df=pd.DataFrame(data, columns =['Name','Age','Sex','Goals', 'Assists', 'Value'])
print(df.dropna(axis=1, how='all'))

输出:

    Name   Age  Sex  Goals  Assists  Value
0   John  21.0    M    5.0      7.0   55.0
1   Paul  23.0  NaN   10.0      4.0   84.0
2    NaN   NaN  NaN    NaN      NaN    NaN
3   Wale  19.0    M   19.0      9.0   90.0
4   Mary  25.0    F    5.0      7.0   63.0
5  Carli   NaN    F    0.0      6.0   15.0
6  Steve  15.0    M    7.0      4.0   46.0

结论

在本教程中,我们讨论了在数据科学项目中缺失数据的重要性。它回顾了用于处理缺失数据的探索技术和重要的填补方法。我们还描述了处理缺失值的方法。一个广泛使用的模型假设所有缺失值的联合分布,并估计描述观察数据的模型参数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程