在统计分析和机器学习算法的训练过程中,异常值可能会对结果产生负面影响,导致准确度降低。本文将讨论如何处理这些异常值。将深入了解异常值在机器学习中的定义、产生原因、对分析的影响,以及如何有效地处理它们。
理解数据中异常值的定义和特征;识别异常值产生的原因及其潜在来源(例如,变异性、实验误差);掌握异常值对统计度量(均值、中位数、众数)和模型性能的影响。
异常值是指在给定数据集中,与其他观测值相比显著不同的观测值。这意味着异常值的处理远远大于或小于集合中的其余值。
异常值可能由于数据的变异性或实验/人为错误而产生。
在统计学中,有三个中心趋势的度量:均值、中位数和众数。它们帮助描述数据。当没有异常值存在时,均值是描述数据的准确度量。如果数据集中存在异常值,则使用中位数。如果存在异常值,并且大约一半或更多的数据相同,则使用众数。均值是唯一受异常值处理影响的中心趋势度量,这反过来又影响标准差。
如果数据集很小,可以通过查看数据集来检测异常值。但是,如果有一个庞大的数据集,如何识别异常值呢?需要使用可视化和数学技术。以下是一些检测异常值的技术:箱线图、Z分数和四分位数范围(IQR)。
import matplotlib.pyplot as plt
sample= [15, 101, 18, 7, 13, 16, 11, 21, 5, 15, 10, 9]
plt.boxplot(sample, vert=False)
plt.title("使用箱线图检测异常值")
plt.xlabel('样本')
plt.show()
标准:任何Z分数超出3个标准差的数据处理被视为异常值。
import numpy as np
outliers = []
def detect_outliers_zscore(data):
thres = 3
mean = np.mean(data)
std = np.std(data)
for i in data:
z_score = (i-mean)/std
if (np.abs(z_score) > thres):
outliers.append(i)
return outliers
sample_outliers = detect_outliers_zscore(sample)
print("Z分数方法的异常值: ", sample_outliers)
标准:位于Q3上方1.5倍IQR和Q1下方的数据点被视为异常值。
outliers = []
def detect_outliers_iqr(data):
data = sorted(data)
q1 = np.percentile(data, 25)
q3 = np.percentile(data, 75)
IQR = q3-q1
lwr_bound = q1-(1.5*IQR)
upr_bound = q3+(1.5*IQR)
for i in data:
if (iupr_bound):
outliers.append(i)
return outliers
sample_outliers = detect_outliers_iqr(sample)
print("IQR方法的异常值: ", sample_outliers)
已经学习了如何检测异常值处理。主要问题是如何处理异常值?以下是一些处理异常值的方法:
# 修剪
for i in sample_outliers:
a = np.delete(sample, np.where(sample==i))
print(a)
tenth_percentile = np.percentile(sample, 10)
ninetieth_percentile = np.percentile(sample, 90)
b = np.where(sampleninetieth_percentile, ninetieth_percentile, b)
print("新数组:",b)
median = np.median(sample)
for i in sample_outliers:
c = np.where(sample==i, 14, sample)
print("新数组: ",c)
plt.boxplot(c, vert=False)
plt.title("处理异常值后的样本箱线图")
plt.xlabel("样本")