用先进的归因策略加强模型结果
简介
虽然对许多数据科学家来说,拥有一个漂亮、干净的数据集,并将预处理需求降到最低是最理想的情况,但现实世界的数据通常并不理想。某些预处理步骤,如归一化和转换,有助于创建可能的最佳模型,但在技术上是可选的--也就是说,如果忽略输出质量的差异,也可以不通过这些步骤创建模型。然而,一个通常出现的不能忽视的问题是_缺失_数据。
用给定的统计方法填补缺失数据的过程被称为归因法,有各种不同的形式。在这篇文章中,我将讨论一些最常见的归因方法,并将它们与一种更先进的方法--迭代归因进行比较,这种方法可以带来更好的模型结果。
常见的归因方法
一些最常见的归因方法包括根据存在的数据,用给定变量的平均值或中位数 来填补缺失的数据。在这两种方法之间做出决定,主要取决于所处理的数据。在数据偏斜的情况下,中位数可能更合适。相反,正态分布的数据可以使用平均值或中位数,因为两者相对相同。让我们来看看实现它们的几种方法。
使用NumPy和Pandas
用NumPy和Pandas进行代入值是小菜一碟。在下面的例子中,A列和B列都有一个缺失的值。然后用NumPy中的nanmean()函数计算A列的平均数,同时忽略任何缺失值。同样的过程也适用于B列,用中位数代替。然后将fillna()函数应用于每一列,以填补缺失的值。这段代码的输出如下所示,右边是每一列的估算值。
图片由作者提供。上述代码的输出。
使用SimpleImputer
Scitkit-learn的SimpleImputer(查看文档)是另一种估算缺失值的方法。虽然它看起来比使用NumPy和Pandas的例子要稍微复杂一些,但使用SimpleImputer有几个关键的好处。首先,缺失值可以被设置为你想要的任何值,而不必像使用Pandas中的fillna()函数那样等同于np.nan。此外,通过改变策略参数,可以很容易地在以下四个选项中改变归因策略。
- "平均数" - 用平均数代替缺失值
- "中位数"--用中位数替换缺失值
- "最频繁"--用最频繁的值替换缺失的值
- "常数"--用fill_value参数中指定的任何值来替换缺失的值。这在你想用一个说 "缺失 "的字符串而不是一个实际值来替换缺失值的情况下可能很有用。
图片由作者提供。上述代码的输出。
迭代归纳法
只有在处理多变量数据时才有用,scikit-learn中的IterativeImputer(查看文档)利用了其他功能中的数据,以估计被置换的缺失值。它是通过一个...
...迭代轮回的方式:在每一步,一个特征列被指定为输出y,其他特征列被视为输入X,一个回归器被拟合到已知y的(X,y)上。最后一轮归因的结果被返回。[来源]
如果这看起来还是有点抽象,希望下面的例子能帮助我们理清头绪。由于IterativeImputer仍然是实验性的,导入enable_iterative_imputer是使用的一个要求。
图片由作者提供。上面的代码的输出。
这个假数据的基本模式是希望B列是A列的平方。虽然不是很完美,但IterativeImputer确实导致了一个有点接近16.0的 "真实 "值被填入。将这一结果与使用平均数归入策略(12.7)或中位数归入策略(9.0)所取得的结果进行比较,可以清楚地看到在这种情况下使用迭代归入策略的好处。
使用真实数据的比较
我最近有机会用真实世界的数据集对IterativeImputer进行测试,同时创建了一个澳大利亚降雨的次日预测模型。虽然我不会在这里详细介绍整个项目,但它确实是一个很好的例子,说明迭代归纳法比一些更简单的策略更有益。使用源数据集的weatherAUS.csv文件,使用三种不同的策略对连续特征进行归因。
- 平均值归入
- 中位数推算
- 迭代推算
我选择比较Pressure9am和Pressure3pm的特征,因为它们彼此直接相关,并表现出一种线性关系,这对评估是很有用的。下面的代码用三种不同的策略来归纳缺失的数据,将数据与回归线绘制在一起,然后显示均方根误差(RMSE,越低越好)。
图片由作者提供。上述代码的输出。
如果不注意RMSE值,光看迭代归因策略,它的拟合值应该更突出。由于平均数和中位数策略用相同的值来填补所有的缺失值,所以在数据中心附近形成了一个类似十字架的形状,不一定符合整体趋势。然而,迭代归因策略能够利用其他特征中包含的信息来代替近似值,从而导致一个更干净的图表,更准确地符合趋势。
你可能会想,将RMSE从1.874提高到1.871并不是什么大问题--你是对的。虽然这本身并不是什么了不起的事情,但有几件事情要记住。
- Pressure9am和Pressure3pm特征中的缺失数据量只有10%左右。因此,与平均值和中位数策略相比,RMSE值只能提高这么多。
- 这个比较只看了两个特征,而完整的数据集包含了更多的特征。当在建模过程中使用所有的数据时,每个特征的小改进可以导致整体的大改进。
结论
在处理单变量数据时,简单的归因策略,如使用平均数或中位数,可能是有效的。在处理多变量数据时,更高级的归因方法,如迭代归因,可以带来更好的结果。Scikit-learn的IterativeImputer提供了一个快速而简单的方法来实现这样的策略。
Github:
github.com/tjkynerMedi…:
tjkyner.medium.com/LinkedIn: www.linkedin.com/in/tjkyner/
Iterative Imputation with Scikit-learn最初发表于Towards Data Scienceon Medium,在那里人们通过强调和回应这个故事继续对话。