2015-01-07 170 views
7

如何在应用机器学习算法之前处理数据集中的缺失值?如何在Python中处理缺少的机器学习NaN

我注意到,丢失缺失的NAN值不是一件聪明的事情。我通常使用熊猫进行内插(计算平均值)并填充数据,这是一种有效的工作,并提高了分类准确性,但可能不是最好的做法。

这是一个非常重要的问题。 处理数据集中缺失值的最佳方法是什么?

例如,如果你看到这个数据集,只有30%有原始数据。

Int64Index: 7049 entries, 0 to 7048 
Data columns (total 31 columns): 
left_eye_center_x   7039 non-null float64 
left_eye_center_y   7039 non-null float64 
right_eye_center_x   7036 non-null float64 
right_eye_center_y   7036 non-null float64 
left_eye_inner_corner_x  2271 non-null float64 
left_eye_inner_corner_y  2271 non-null float64 
left_eye_outer_corner_x  2267 non-null float64 
left_eye_outer_corner_y  2267 non-null float64 
right_eye_inner_corner_x  2268 non-null float64 
right_eye_inner_corner_y  2268 non-null float64 
right_eye_outer_corner_x  2268 non-null float64 
right_eye_outer_corner_y  2268 non-null float64 
left_eyebrow_inner_end_x  2270 non-null float64 
left_eyebrow_inner_end_y  2270 non-null float64 
left_eyebrow_outer_end_x  2225 non-null float64 
left_eyebrow_outer_end_y  2225 non-null float64 
right_eyebrow_inner_end_x 2270 non-null float64 
right_eyebrow_inner_end_y 2270 non-null float64 
right_eyebrow_outer_end_x 2236 non-null float64 
right_eyebrow_outer_end_y 2236 non-null float64 
nose_tip_x     7049 non-null float64 
nose_tip_y     7049 non-null float64 
mouth_left_corner_x   2269 non-null float64 
mouth_left_corner_y   2269 non-null float64 
mouth_right_corner_x   2270 non-null float64 
mouth_right_corner_y   2270 non-null float64 
mouth_center_top_lip_x  2275 non-null float64 
mouth_center_top_lip_y  2275 non-null float64 
mouth_center_bottom_lip_x 7016 non-null float64 
mouth_center_bottom_lip_y 7016 non-null float64 
Image      7049 non-null object 
+4

“*处理数据集中缺失值的最佳方法是什么?*”I会争辩说,这个问题的答案既是具体情况,也是基于观点。 – CoryKramer

+0

您可以删除任何缺少值的行,但这可能会降低性能,或者将缺失值设置为不影响预测的某个值,但如果缺少很多值,这可能仍然会歪曲您的模型,它实际上取决于。您可以使用平均值/中位数,但您必须衡量所有方法的性能,并查看最佳方法,这取决于这些功能是否有任何价值以及您选择哪种模型 – EdChum

回答

9
What is the best way to handle missing values in data set? 

没有最好的方式,每个解决方案/算法都有自己的优点和缺点(你甚至可以混合使用它们中的一些共同创建自己的战略,并调整相关参数拿出一个最好的满足你的数据,有关这个主题的许多研究/论文)。

例如,均值借补是快速和简单,但它会低估变化和分布形状是通过与平均值替换NaN的扭曲,而KNN归责可能不是一个大的数据集的理想在时间复杂度方面,因为它遍历所有的数据点并为每个NaN值执行计算,并且假定NaN属性与其他属性相关。

How to handle missing values in datasets before applying machine learning algorithm?? 

除了意味着你提到归集,你也可以看看K-近邻归责回归归责,并参考强大Imputerscikit-learn检查现有的API使用。

KNN归责

计算K最近这NaN的一点邻居的平均值。

回归插补

回归模型估计来预测基于其他变量的变量的观测值,然后将该模型用于其中该变量缺失归咎于在箱子值。

Here链接到scikit的'缺失值的插补'部分。 我也听说过Orange库的插补,但还没有机会使用它。

2

没有最好的方法来处理丢失的数据。最严格的方法是将缺失值建模为像PyMC这样的概率框架中的附加参数。通过这种方式,您可以获得可能值的分布,而不仅仅是一个答案。下面是使用PyMC处理丢失数据的一个示例:http://stronginference.com/missing-data-imputation.html

如果您确实想要使用点估计来堵塞这些漏洞,那么您希望执行“插补”。我会避开像平均填充这样的简单插补方法,因为它们确实会影响你的特征的联合分布。相反,尝试像softImpute(它试图通过低秩近似推断缺失值)。 softImpute的原始版本是为R编写的,但是我已经制作了一个Python版本(以及其他方法,如kNN插补):https://github.com/hammerlab/fancyimpute