机器学习 检测给定数据集中异常情况的方法
简介
异常是指在现有数据集中与其他观测值非常不同的数值或数据观测值,在建立机器学习模型时,检测和处理异常是至关重要的,因为传递给模型的数据质量应该足够公平,值得信赖。人们认为,高质量的数据集可以提供准确可靠的信息,即使是性能很差的算法,也能得到结果子,如果数据集的质量本身很差,那么实现高性能模型的概率就很低。
这篇文章将讨论离群值,它们背后的核心思想,为什么我们要检测它们,以及检测它们的方法。这将有助于人们理解异常值的概念,它们在模型构建中的作用,以及进一步检测和处理它们。
什么是异常值
异常值或离群值是指在一个给定的数据集中,与现有的其他数据观测值不相符的数据点。异常值是指与其他数据观测值非常高、非常低或非常不同的数据值或观测值。
离群值对模型的性能影响最大,因此应该检测并妥善处理它们。数据清理和预处理在建立一个准确可靠的模型中起着重要作用;在这里,异常值的检测和清除是最复杂和最重要的阶段之一。这里需要注意的一点是,离群值检测也是一项有风险的工作,因为我们在这个阶段检测的是不符合正常数据的数值。不过,有时异常值也会对我们有所帮助,为我们提供正常数据所不能提供的信息,所以检测和处理异常值需要技术和领域的专业知识。
异常值检测:方法
检测和清除异常值的方法主要有两种
- 修剪
-
覆盖
修剪是一种方法,我们通过决定数据集的上限和下限来删除异常值或排除异常值。这种技术是检测和去除异常值的最快技术之一。
封顶是一种方法,我们用一些数据观测值对数据进行封顶,顾名思义。这里决定了数据的上限和下限,并根据这些限制对数据进行封顶。
异常点检测:Z评分
Z分数是检测异常值的最古老和最可靠的方法之一。这里我们使用统计方法来检测数据集中的异常值。每一个有数值的数据都会有一些分布或方差,我们可以使用python中的不同库来轻松绘制。在这里,我们可以用公式计算出数据的Z分数,数值大于3和小于3的数据观测值将被选为离群值。
Z分数的公式可以是 –
Z = Xi – Mean(X)/ StdDev(X)
Z = Z评分
Xi = 数据观察值
Mean(X) = X的平均值
StdDev = X的标准偏差
例子
df['zscore'] = (df[‘x’] - df[‘x’].mean())/df[‘x’].std()
df[(df['zscore'] > 3) | (df['zscore'] < -3)]
new_df = df[(df['zscore'] < 3) & (df['zscore'] > -3)]
异常情况检测:封顶
封顶也是最常用的异常值检测和清除方法之一。在这里,我们使用数据观察的标准差和平均值来检测异常值并将其删除。在这种方法中,我们计算数据的平均值和标准偏差。然后,根据我们从上限和下限得到的数值,我们设定阈值,对于这个阈值,高于上限的数据观察将被视为离群值,反之亦然。
在这里,数据的上限和下限是用以下公式计算的
上限=平均值(X)+3*(StdDev(X))。
下限=平均值(X)-3*(StdDev(X))
例子
upper_limit = df[‘x’].mean() + 3*df[‘x’].std()
lower_limit = df[‘x’].mean() - 3*df[‘x’].std()
df[‘x’] = np.where(
df[‘x’]>upper_limit,
upper_limit,
np.where(
df[‘x’]<lower_limit,
lower_limit,
df[‘x’]
)
)
在上面的代码中我们可以看到,数据的平均值和标准差的值决定了上下限。那些数值高于上限和低于下限的数据观测值被删除。
异常情况检测:IQR法
量子间范围法也被用来检测数据分布偏斜的异常值。在这种情况下,数据的上限和下限是根据数据的四分位数间范围决定的。这里,数值高于Q3+1.5IQR的数据观测值被认为是离群值,而数值低于Q1-1.5IQR的数据观测值被认为是离群值。
上限 = Q3 + 1.5IQR
下限 = Q1 – 1.5IQR
这里IQR = Intern quanmtile range = Q3 – Q1
Q3 = 数据集的第75个百分点
Q1 = 数据集的第25个百分位数
例子
percentile25 = df['placement_exam_marks'].quantile(0.25)
percentile75 = df['placement_exam_marks'].quantile(0.75)
upper_limit = percentile75 + 1.5 * iqr
lower_limit = percentile25 - 1.5 * iqr
df[df[‘new_data’] > upper_limit]
df[df[‘new_data’] < lower_limit]
new_df = df[df['placement_exam_marks'] < upper_limit]
new_df = df[df[‘new_data’] < upper_limit]
New_df.shape
主要启示
- 离群值是指在数据集中具有比其他观察值非常高或浅的数据观察值。
-
离群值是在清理和预处理数据时需要处理的最关键的参数之一。
-
应该检测并妥善处理离群值,以避免表现不佳的模型。
-
我们可以计算数据的Z分数,然后将数值大于3或小于-3的离群点进行分类。
-
我们还可以使用封顶法,即根据数据的标准差和平均值,使用上限和下限对数据进行封顶。
-
当我们有倾斜的数据时,也可以使用四分位数间的范围方法。这里的上限和下限是根据IQR、25和75分位数的数据决定的。
总结
在这篇文章中,我们讨论了异常值,什么是异常值,为什么我们应该检测它们,以及希望我们能够处理它们。我们还讨论了基于数据集的Z分数、封顶法和四分位数范围法的三种检测和删除异常值的方法。这将有助于人们更好地理解离群值的概念,并帮助处理它们。