第7节:异常值处理
在机器学习和深度学习模型的开发过程中,异常值(Outliers)可能会显著影响模型的性能。异常值是指那些偏离数据集大多数其他数据点的值,可能由于数据采集错误、输入错误或是极端但合理的事件所导致。处理异常值的目的是为了提高模型的鲁棒性和预测准确性。异常值可能会破坏模型的训练,导致模型的泛化能力下降,特别是在回归和分类任务中。
本节将展示如何识别和处理异常值,并结合实际应用场景给出处理策略和代码示例。我们将讨论三种常见的异常值处理方法:基于统计的方法(如Z-score、IQR方法)、基于模型的方法(如孤立森林)和基于距离的方法(如K近邻)。同时,我们将通过实际案例深入探讨每种方法的应用。
案例一:基于Z-Score的异常值检测与处理(金融交易数据)
案例描述
在金融交易数据中,异常交易行为可能是欺诈行为的表现。假设我们有一个包含每笔交易金额的数据集,通过Z-score方法可以检测出与大多数交易金额偏离较大的异常值。Z-score方法计算每个数据点与均值的偏差,并根据标准差来确定数据点是否为异常值。通常,Z-score超过3或小于-3的数据点被认为是异常值。
案例分析
金融交易数据中可能存在极端的大额交易,尤其是交易错误或不当的行为。通过Z-score,我们可以有效地识别这些异常数据,并进行处理,如删除或调整这些数据。这有助于防止模型过度拟合这些异常数据,进而提高预测准确度。
案例算法步骤
- 导入金融交易数据并进行清洗。
- 计算Z-score,识别异常值。
- 删除或替换异常值。
- 使用处理后的数据训练模型。
Python代码实现
import numpy as np
import pandas as pd
from scipy.stats import zscore
# 模拟生成金融交易数据
np.random.seed(0)
n = 1000
transaction_amount = np.random.normal(200, 50, n) # 正常交易金额
transaction_amount[::50] = np.random.normal(2000, 100, 20) # 极端异常值
# 创建DataFrame
data = pd.DataFrame({
'TransactionAmount': transaction_amount
})
# 计算每个数据点的Z-score
data['ZScore'] = zscore(data['TransactionAmount'])
# 识别Z-score大于3或小于-3的异常值
outliers = data[abs(data['ZScore']) > 3]
# 显示异常值
print("检测到的异常值:")
print(outliers)
# 删除异常值
data_cleaned = data[abs(data['ZScore']) <= 3]
# 显示去除异常值后的数据
print("\n去除异常值后的数据:")
print(data_cleaned.head())
代码解读
- 数据生成:我们模拟了一个包含金融交易金额的简单数据集,其中有些交易金额为异常值。
- Z-score计算:使用
scipy.stats.zscore()
计算每笔交易金额的Z-score。Z-score衡量每个数据点与均值的偏离程度。 - 异常值识别:根据Z-score的绝对值大于3来判断异常值。一般来说,Z-score超过3或低于-3的点通常被认为是异常值。
- 异常值处理:我们删除了Z-score大于3或小于-3的异常值,并展示了处理后的数据。
案例二:基于IQR的异常值处理(健康数据)
案例描述
在健康数据中,某些体检指标(如血糖、体重等)可能出现异常值,这些异常值可能是由于记录错误或个别极端的健康状况造成的。通过IQR(四分位距)方法,我们可以识别并处理这些异常值。IQR是数据集的第三四分位数(Q3)和第一四分位数(Q1)之间的差值,通常使用1.5倍IQR来识别异常值。
案例分析
在健康数据中,异常值可能会影响疾病预测模型的训练。IQR方法是一种非常有效的统计方法,用于识别数据中的异常值,尤其是在数据分布不对称或不呈正态分布的情况下。通过识别并处理这些异常值,我们可以提高模型的稳定性和预测效果。
案例算法步骤
- 导入健康数据并进行清洗。
- 计算IQR,识别异常值。
- 删除或替换异常值。
- 使用处理后的数据训练模型。
Python代码实现
# 模拟生成健康体检数据
np.random.seed(0)
n = 1000
glucose_levels = np.random.normal(100, 15, n) # 正常血糖水平
glucose_levels[::100] = np.random.normal(300, 50, 10) # 极端异常值
# 创建DataFrame
health_data = pd.DataFrame({
'GlucoseLevel': glucose_levels
})
# 计算IQR
Q1 = health_data['GlucoseLevel'].quantile(0.25)
Q3 = health_data['GlucoseLevel'].quantile(0.75)
IQR = Q3 - Q1
# 识别异常值
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = health_data[(health_data['GlucoseLevel'] < lower_bound) | (health_data['GlucoseLevel'] > upper_bound)]
# 显示异常值
print("检测到的异常值:")
print(outliers)
# 删除异常值
health_data_cleaned = health_data[(health_data['GlucoseLevel'] >= lower_bound) & (health_data['GlucoseLevel'] <= upper_bound)]
# 显示去除异常值后的数据
print("\n去除异常值后的数据:")
print(health_data_cleaned.head())
代码解读
- 数据生成:我们模拟了一个包含血糖水平的健康数据集,其中包含一些异常值。
- IQR计算:首先计算数据的Q1和Q3,然后通过IQR来定义异常值的边界。通常,低于
Q1 - 1.5 * IQR
或高于Q3 + 1.5 * IQR
的数据点被认为是异常值。 - 异常值识别:根据IQR定义的上下边界来识别异常值。
- 异常值处理:我们删除了所有超出边界的异常值,并展示了处理后的数据。
案例三:基于孤立森林算法的异常值检测(社交网络用户行为数据)
案例描述
在社交网络数据中,用户的行为(如发帖频率、评论数量等)可能存在异常值。例如,一些用户的活跃度可能极高或极低,这可能是由于异常行为或者数据采集错误导致的。孤立森林(Isolation Forest)是一种基于树的异常值检测方法,特别适用于高维数据。孤立森林通过分割数据来“孤立”异常值,通常异常值会更容易被孤立。
案例分析
孤立森林是一种高效的异常值检测方法,尤其适用于大规模数据集。在社交网络数据中,孤立森林可以帮助我们识别那些极端的用户行为,进而优化推荐系统或分析用户行为。
案例算法步骤
- 导入社交网络数据并进行清洗。
- 使用孤立森林算法识别异常值。
- 删除或调整异常值。
- 使用处理后的数据进行建模。
Python代码实现
from sklearn.ensemble import IsolationForest
# 模拟生成社交网络用户行为数据
np.random.seed(0)
n = 1000
post_count = np.random.normal(10, 3, n) # 正常的发帖次数
post_count[::50] = np.random.normal(100, 10, 20) # 极端异常值
# 创建DataFrame
social_data = pd.DataFrame({
'PostCount': post_count
})
# 使用孤立森林算法识别异常值
iso_forest = IsolationForest(contamination=0.02) # 假设2%的数据是异常值
social_data['Outlier'] = iso_forest.fit_predict(social_data[['PostCount']])
# 显示异常值
outliers = social_data[social_data['Outlier'] == -1]
print("检测到的异常值:")
print(outliers)
# 删除异常值
social_data_cleaned = social_data[social_data['Outlier'] != -1]
# 显示去除异常值后的数据
print("\n去除异常值后的数据:")
print(social_data_cleaned.head())
代码解读
- 数据生成:我们模拟了一个社交网络用户的发帖次数数据集,并在其中加入了异常值。
- 孤立森林模型:使用
IsolationForest
算法进行异常值检测,并指定contamination=0.02
,假设数据中有2%的异常值。 - 异常值识别:孤立森林会将异常值标记为-1。
- 异常值处理:我们删除了所有被标记为异常值的数据,并展示了处理后的数据。
总结
异常值处理是数据预处理中的重要环节,它对于模型的稳定性和准确性至关重要。不同的异常值检测和处理方法(如Z-score、IQR、孤立森林)适用于不同的数据场景。通过识别和处理异常值,我们可以提高模型的预测能力和鲁棒性,从而优化最终的模型效果。
【学习大模型技术与深度学习,必须从机器学习开始】
哈佛博后带小白玩转机器学习 【限时5折-含直播】哈佛博后带小白玩转机器学习_哔哩哔哩_bilibili
总课时超400+,时长75+小时