暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

大数据分析之异常值检测后的数据处理方法

追梦IT人 2025-02-27
29

异常值处理的常用方法包括以下几种‌:

‌删除观测值‌:直接删除异常值是最简单的方法,但可能会导致样本量不足,改变变量的原有分布,从而影响统计模型的稳定性‌。

‌保留并综合分析‌:通过回归分析,利用残差分布信息来判断模型优劣,观察残差是否超出经验范围(如3倍标准差),并检查R方、均分误差等指标,这些指标可以提供关于异常值的信息‌。

‌使用统计量替代‌:如果样本量较小,可以用均值或其他统计量来替代异常值。这种方法虽然克服了丢失样本的缺陷,但可能丢失样本的“特色”‌。

‌视为缺失值处理‌:将异常值视为缺失值,并利用统计模型进行填补。根据异常值的特点(如完全随机缺失、随机缺失或非随机缺失)选择合适的方法。例如,可以使用插值法、回归模型等方法进行填补‌。

第一段代码仍然是导入各种包、读取数据,通过pyod的IForest实现异常值检测。

from __future__ import division
from __future__ import print_function
import warnings
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from pyod.models.iforest import IForest

warnings.filterwarnings("ignore")
# ---------------------------------------对pandas显示进行格式化-----------------------------------------
pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.max_rows', None) # 显示所有行
pd.set_option('display.width'1000)    # 不换行显示
pd.set_option('display.unicode.ambiguous_as_wide', True)    # 行列对齐显示,显示不混乱
pd.set_option('display.unicode.east_asian_width', True) # 行列对齐显示,显示不混乱
pd.set_option('display.precision'4)   # 显示精度
pd.get_option("display.precision")  # 显示小数位数

# 在本节中,使用Python代码介绍了检测数据集中异常值的不同方法。为了演示不同方法的方法,使用了包含加速度计数据(在自行车活动期间捕获)的数据集。
# 所有CSV文件都包含索引、时间戳以及X、Y和Z轴的加速度。关于每个文件的信息可以在train.csv和test.csv中找到:记录的表面、智能手机的记录频率以及骑自行车的次数。
# 最新信息是相关的,因为所有自行车都有不同的悬架,因此加速度的幅度也不同。尽可能使用一致的记录设置,以确保数据具有可比性。
data_path = r'E:\JetBrains\PythonProject\DeepLearning\Accelerometer_Data.csv'
data = pd.read_csv(data_path, index_col=0)

# 初始化Isolation Forest模型
iforest = IForest(contamination=0.005)
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(data), columns=data.columns)
# 训练模型
iforest.fit(df_scaled)
# 模型预测,并将异常值输出到新增的cluster列
data['cluster'] = iforest.predict(df_scaled)


复制

第二段代码是删除观测值。

# 处理异常值的三种方法
1.从数据集中完全删除异常值。数据集中的相应条目在分析中不再进一步考虑。一般不建议从具有许多属性的数据集中删除所有异常值,因为可能会在不同的属性中删除相当多的条目。
data_copy = data.copy()
data_copy = data_copy[data_copy['cluster'] != 1]
print(data.shape) # (65005)
print(data_copy.shape)  # (64675)


复制

第三段代码是将异常值置为null,也可以按照 大数据分析之缺失值处理,多种方法带你轻松搞定 一文所述,对空值进行插值法、均值法、随机森林进行填充

2.可以用NaN值替换异常值,从而将其转换为缺失值,一般建议仅对单个属性执行异常值检测。然后再通过值插补方法填充缺失的值。
# Calculate the IQR
data_copy = data.copy()
def IQR(data):
    Q1 
= data.quantile(0.25)
    Q3 = data.quantile(0.75)
    IQR = Q3 - Q1
    # Define the boundaries
    lower_boundary = Q1 - 1.5 * IQR
    upper_boundary = Q3 + 1.5 * IQR
    return lower_boundary,upper_boundary

data_copy.loc[(data_copy['x'] < IQR(data_copy['x'])[0]) | (data_copy['x'] > IQR(data_copy['x'])[1]), 'x'] = np.nan
data_copy.loc[(data_copy['y'] < IQR(data_copy['y'])[0]) | (data_copy['y'] > IQR(data_copy['y'])[1]), 'y'] = np.nan
data_copy.loc[(data_copy['z'] < IQR(data_copy['z'])[0]) | (data_copy['z'] > IQR(data_copy['z'])[1]), 'z'] = np.nan


复制

第四段代码几乎不用因此不做赘述。

3.第三种方法是在数据集中保留异常值及其各自的值,但添加一个二进制列,指示一个点是否被视为异常值。然而,这种方法不是最佳实践,只有在上述方法都不起作用的情况下才应该使用。


复制

最后欢迎关注公众号:python与大数据分析

文章转载自追梦IT人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论