使用标准差剔除异常值
创作时间:
作者:
@小白创作中心
使用标准差剔除异常值
引用
CSDN
1.
https://blog.csdn.net/u014217137/article/details/143819886
在数据分析和处理过程中,异常值的处理是一个重要的环节。异常值可能会对后续的分析和建模产生负面影响,因此需要在数据预处理阶段进行合理的处理。本文将介绍如何使用标准差的方法来剔除异常值,并通过Python代码实现这一过程。
方法
在绘制图表之前对数据进行预处理,剔除掉那些波动很大的数据点。我们可以使用一些统计方法来识别和剔除这些异常值。常用的方法包括使用标准差(Standard Deviation)或四分位数(Interquartile Range, IQR)来检测和剔除异常值。本文将重点介绍使用标准差的方法。
示例代码
下面是一个完整的示例代码,展示了如何读取数据、进行数据清洗、分段读取数据并绘图。
数据读取与清洗
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
# 读取数据
file_path = 'step_rewards.txt'
data = pd.read_csv(file_path, header=None, names=['reward'])
# 检查数据结构
print(data.head())
# 数据清洗 - 使用标准差方法剔除异常值
def remove_outliers(df, column, threshold=3):
mean = df[column].mean()
std = df[column].std()
outliers = (df[column] - mean).abs() > threshold * std
return df[~outliers]
# 清洗数据
cleaned_data = remove_outliers(data, 'reward')
# 打印前几行查看清洗后的数据
print(cleaned_data.head())
分段读取数据并绘图
# 将清洗后的数据保存到新的文件中
output_file_path = 'filter_step_rewards.txt'
cleaned_data.to_csv(output_file_path, index=False, header=False)
print(f"Filtered data saved to {output_file_path}")
# 确保输出目录存在
output_dir = 'plots'
os.makedirs(output_dir, exist_ok=True)
# 每隔 10000 行提取数据
chunk_size = 10000
num_chunks = len(cleaned_data) // chunk_size
for i in range(num_chunks):
start_idx = i * chunk_size
end_idx = (i + 1) * chunk_size
chunk = cleaned_data.iloc[start_idx:end_idx]
# 绘制清洗后的数据
plt.figure(figsize=(10, 6))
plt.plot(chunk.index, chunk['reward'], label='Cleaned Reward')
plt.legend()
plt.title(f'Rewards for Chunk {i+1}')
plt.xlabel('Step')
plt.ylabel('Reward')
# 保存图像
image_path = os.path.join(output_dir, f'reward_chunk_{i+1}.png')
plt.savefig(image_path)
plt.close()
print(f"Generated {num_chunks} plots and saved them in {output_dir}")
代码解释
数据读取:
data = pd.read_csv(file_path, header=None, names=['reward'])这行代码读取
step_rewards.txt文件,文件没有标题行。我们将列名指定为reward。数据检查:
print(data.head())打印数据的前几行,以便确认数据是否正确加载。
数据清洗:
def remove_outliers(df, column, threshold=3): mean = df[column].mean() std = df[column].std() outliers = (df[column] - mean).abs() > threshold * std return df[~outliers]
remove_outliers函数用于剔除异常值。它计算数据的均值和标准差,然后将距离均值超过threshold倍标准差的数据点标记为异常值。threshold参数默认为3,表示剔除距离均值超过3倍标准差的数据点。可以根据实际情况调整这个阈值。
调用cleaned_data = remove_outliers(data, 'reward')remove_outliers函数对数据进行清洗。
- 保存清洗后的数据:
output_file_path = 'filter_step_rewards.txt' cleaned_data.to_csv(output_file_path, index=False, header=False) print(f"Filtered data saved to {output_file_path}")
- 将清洗后的数据保存到
filter_step_rewards.txt文件中。 index=False表示不保存索引。header=False表示不保存列名。
- 分段读取数据并绘图:
chunk_size = 10000 num_chunks = len(cleaned_data) // chunk_size for i in range(num_chunks): start_idx = i * chunk_size end_idx = (i + 1) * chunk_size chunk = cleaned_data.iloc[start_idx:end_idx] plt.figure(figsize=(10, 6)) plt.plot(chunk.index, chunk['reward'], label='Cleaned Reward') plt.legend() plt.title(f'Rewards for Chunk {i+1}') plt.xlabel('Step') plt.ylabel('Reward') image_path = os.path.join(output_dir, f'reward_chunk_{i+1}.png') plt.savefig(image_path) plt.close()
chunk_size定义了每组数据的大小。num_chunks计算总共有多少组数据。for循环遍历每组数据,提取并绘制清洗后的数据。plt.savefig(image_path)将图像保存到指定路径。plt.close()关闭当前图像,防止内存泄漏。
- 输出信息:
输出生成的图像数量和保存路径。print(f"Generated {num_chunks} plots and saved them in {output_dir}")
运行上述代码后,将在plots目录中找到10张图像文件,每张图像对应一组数据的清洗后奖励值的图表。
关于异常值的处理
- 在
remove_outliers函数中,我们定义了一个布尔 Seriesoutliers,用于标识哪些数据点是异常值。outliers = (df[column] - mean).abs() > threshold * std
(df[column] - mean).abs():计算每个数据点与均值的绝对差值。> threshold * std:判断绝对差值是否大于threshold倍的标准差。- 结果是一个布尔 Series,其中
True表示该数据点是异常值,False表示该数据点不是异常值。
~outliers在 Python 中,~是按位取反运算符。对于布尔值,~True为False,~False为True。因此,~outliers会将布尔 Seriesoutliers中的True变为False,False变为True。df[~outliers]df[~outliers]是 Pandas 中的一种索引操作,用于从 DataFrame 中选择符合条件的行。具体来说:
df[~outliers]会选择outliers中为False的行,即非异常值的行。- 结果是一个新的 DataFrame,其中不包含任何异常值。
结果展示
热门推荐
男玩家涌入乙游,背后有何玄机?
六字真言“唵嘛呢叭咪吽”:读音、含义及其在藏传佛教中的重要地位
“唵嘛呢叭咪吽”你会念吗?究竟是什么意思?
游资陈小群、方新侠、章盟主、消闲派、交易猿的最新动向曝光!
陈小群:怎么提升龙头认知?8条认知逻辑,俗称“8步天龙”
陈小群:天天看研报,未必能赚到钱!5条盯盘要义,让利润奔跑
从480到666:黄金价格大涨,首饰金、投资金该如何选择
掌握翡翠擦拭技巧:如何正确清洁养护你的翡翠饰品
春节对联贴法,居家风水大揭秘!
春节对联贴法大揭秘:上下联怎么分?
春联:从桃符到世界文化遗产的千年文化之旅
自制Q弹芋圆,让你秒变甜品达人
自制珍珠奶茶攻略:红心粉圆Q弹爆表!
铁路部门推出无陪伴年长旅客服务,线上线下均可预约
《<小小的我>获东京电影节观众选择奖,易烊千玺演技获国际认可》
易烊千玺凭《小小的我》获东京电影节大奖,票房破7亿
易烊千玺新作<小小的我>:不只是脑瘫故事,更是青春写照
从评估到验收:钢结构修复全流程详解
三角骨骨折修复手术:从入路选择到功能锻炼
钢结构建筑加固技术:从损伤分析到修复实施
嫦娥六号即将启程,揭秘嫦娥五号背后的黑科技
嫦娥五号揭秘月球玄武岩:新材料揭示月球演化新线索
柠檬酸辣鸡爪制作攻略:从选材到入味的完整指南
火型人养生攻略:饮食运动心理全方位调适
洪濑鸡爪与花椒鸡爪:从地方小吃到网红品牌的崛起之路
鸡爪价格暴涨背后:供需失衡考验下的市场困局
虎皮鸡爪的营养秘密:不止是美味,更是养生佳品
《小小的我》:一部映射特殊儿童教育困境的暖心之作
五招远离慢性胃炎:从生活习惯到心理调节
《<小小的我>展现600万脑瘫患者心声,易烊千玺演技获认可》