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 。然而,这些方法也存在一些缺点。在使用数据挖掘过程时,需要小心避免偏倚或高估变异性,这些方法表现不佳。
案例删除
有两种类型的案例删除方法。第一种是列表删除(也称为完全案例分析),第二种是对删除。案例删除方法用于以按分析为基础删除数据集中的缺失案例。
让我们使用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
结论
在本教程中,我们讨论了在数据科学项目中缺失数据的重要性。它回顾了用于处理缺失数据的探索技术和重要的填补方法。我们还描述了处理缺失值的方法。一个广泛使用的模型假设所有缺失值的联合分布,并估计描述观察数据的模型参数。