如何在机器学习中检测异常值

您所在的位置:网站首页 箱线图去除异常值的方法 如何在机器学习中检测异常值

如何在机器学习中检测异常值

2024-07-10 19:11| 来源: 网络整理| 查看: 265

原文:How to Detect Outliers in Machine Learning – 4 Methods for Outlier Detection,作者:Bala Priya C

你是否使用过现实数据来对机器学习模型进行过训练?如果答案是肯定的,你很可能遇到过_异常点_。

异常点通常_明显_地不同于数据集中其他数据。异常点的存在会扭曲数据集的数据分布,提高数据的不连贯性或使观测产生错误。

为了使训练模型在进行测试时有更好的泛用性,发现并删除异常点非常重要。

在本文中,我们将介绍几个常用来发现并去除异常点的统计学工具。

为什么需要发现异常点

在机器学习流程中_数据清洗_和_数据预处理_是两个关键步骤,它们能帮助你更好地理解你所面对的数据。这些步骤中包括处理丢失值,发现异常值等操作。

过高或过低的异常值常常会扭曲数据集的统计分析结果。这会使得训练出来的模型低效甚至完全无效。

处理异常值需要一定的专业性,在_不清楚_所面对的数据和消除异常值工具适用环境的情况下不应冒然使用。

举例来说,如果你在房价数据集中发现_少量_房价处于150万美金并显著高于所有房价中位数时,这些150万美金的房价很可能是异常值。但是,当数据集包含有大量100万美金以上的房价时,房价呈现上涨趋势。此时将150万美金的房价将视为异常值是_不合适_的。在此情境下,数据分析者需要一定的房地产知识以便正确处理异常值。

发现异常值的目的是为了去除_真正的异常值_以便构建一个泛用的,即使面对未知数据依旧能表现良好的模型。我们将几个有助于发现异常值的统计工具。

如何通过标准差发现异常值

如果一组数据,或数据集中某些特征符合正态分布时,可以考虑使用正态分布及等效的Z-分数(z-score)来发现异常值。

在统计学中,标准差(standard deviation)反映了_数据点和均值(mean)之间的关系+,一言以蔽之,标准差衡量的是数据点离数据的算数平均有多远。

对于正态分布的数据来说,约68.2%的数据在均值的一倍标准差之内。约有95.4%和99.7%的数据点在均值的两倍和三倍标准差以内。

我们约定标准差为σ,算术平均为μ。

一个发现异常值的方法是将_阈值下限_设为均值减去三倍标准差 (μ - 3*σ) ,_阈值上限_设为均值加上三倍标准差 (μ + 3*σ) 。所有在阈值之外的数据点都被视为异常值。

因为99.7%的数据点会在均值的±三倍标准差以内,此方法将会发现并标记0.3%的数据点为异常值。

使用标准差检测异常点的代码

我们通过构造一个正态分布的学生分数数据集,用以解释发现异常点的过程。

第一步,载入必须的python库。

import numpy as np import pandas as pd import seaborn as sns

第二步,定义名为generate_scores()的函数,这个函数会生成一个有包含有200个数据的正态分布的分数数据集。我们会使用这个函数生成数据集并存储到变量scores_data中。

def generate_scores(mean=60,std_dev=12,num_samples=200): np.random.seed(27) scores = np.random.normal(loc=mean,scale=std_dev,size=num_samples) scores = np.round(scores, decimals=0) return scores scores_data = generate_scores()

你可以使用Seaborn的displot()函数来生成数据集分布图像。通过下图可以看出,这个数据集服从正态分布。

sns.set_theme() sns.displot(data=scores_data).set(title="Distribution of Scores", xlabel="Scores")

EqfsNr10SYnFcCpdC_5Bdt9Z3jWIsaTI1yCcATGbf10BXTwwqKuJHUMuZT9n6M3bGuU8k4QOA8Vb87BStDzxQRRdQ-MzMwLT2EZZJL4ieB0_u0LnvsUXCkYBTllcll15mF1oGziS1QqZrfYR5A

图表1:正态分布

接下来,我们可以把该数据集导入Pandas dataframe 以便进一步分析。

df_scores = pd.DataFrame(scores_data,columns=['score'])

你可以使用.mean()和.std()方法来获取数据集df_scores的均值和标准差。

df_scores.mean() # Output score 61.005 dtype: float64 df_scores.std() # Output score 11.854434 dtype: float64

像之前说的一样,阈值下限(lower_limit)设为算数平均减去三倍标准差,阈值上限(upper_limit)设为算术平均加上三倍标准差。

lower_limit = df_scores.mean() - 3*df_scores.std() upper_limit = df_scores.mean() + 3*df_scores.std() print(lower_limit) print(upper_limit) # Output 25.530716709142666 96.47928329085734

通过上一步我们定义了阈值的上下限,我们可以使用这个阈值[lower_limit, upper_limit]来筛选数据集df_score中处于这个阈值的数据点,代码如下。

df_scores_filtered=df_scores[(df_scores['score']>lower_limit)&(df_scores['score']lower_limit) & (df_scores['score']lower_limit) & (df_scores['score']


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3