顾乔芝士网

持续更新的前后端开发技术栈

通透!处理缺失值和异常值 !!

哈喽,大家好~

咱们今天来聊聊数据清洗,其中最重要的两个方面:缺失值和异常值~

数据清洗(Data Cleaning)是指在数据预处理中,通过一系列技术手段来识别并修正或删除错误数据、缺失数据、异常数据的过程,以提高数据质量和分析准确性。

脏数据(Dirty Data)不仅影响建模效果,还可能导致完全错误的商业决策。

处理缺失值

缺失值的来源

缺失值处理技术

删除缺失值

简单粗暴,适用于缺失占比很低的情况。

若数据集 ,定义:

(如5%),则直接删除。

均值/中位数/众数填充

最常见的方法。

回归填补

使用其他特征预测缺失值。

步骤

若有特征集 ,目标变量 ,则:

使用回归系数估算缺失值。

插值法(Interpolation)

适合时间序列数据。

常用方法

公式(线性插值)

设缺失点在 之间:

缺失类型分类(重要)

类型
描述
处理方式
MCAR
完全随机缺失
删除或简单填补
MAR
条件随机缺失(受其他变量影响)
回归或模型推断填补
MNAR
非随机缺失(依赖自身未观测值)
高级推断或专业建模

处理异常值(Outliers)

异常值的来源

异常值检测技术

统计学方法

(1)标准差法

若数据服从正态分布, 为均值, 为标准差,则:

之外的数据是异常值。

(2)箱型图法(IQR)

基于模型的方法

适合大规模、高维度数据。

处理异常值方法

一个完整案例

数据集

import numpy as np
import pandas as pd

np.random.seed(42)
n = 200
X = np.linspace(0, 100, n)
y = 0.5 * X + np.random.normal(0, 5, n)

# 加入缺失值
y[np.random.choice(n, 10, replace=False)] = np.nan

# 加入异常值
y[np.random.choice(n, 5, replace=False)] += np.random.normal(50, 10, 5)

# 组装成DataFrame
data = pd.DataFrame({'X': X, 'Y': y})

缺失值处理

# 缺失值可视化
import missingno as msno
import matplotlib.pyplot as plt

# 绘制缺失矩阵
msno.matrix(data)
plt.show()

# 用中位数填充
data['Y'] = data['Y'].fillna(data['Y'].median())

异常值检测与处理

# 计算IQR
Q1 = data['Y'].quantile(0.25)
Q3 = data['Y'].quantile(0.75)
IQR = Q3 - Q1

# 判定异常
outlier_condition = (data['Y'] < Q1 - 1.5 * IQR) | (data['Y'] > Q3 + 1.5 * IQR)

# 替换异常值为中位数
data.loc[outlier_condition, 'Y'] = data['Y'].median()

拟合回归曲线并绘图

from sklearn.linear_model import LinearRegression

# 拟合模型
model = LinearRegression()
model.fit(data[['X']], data['Y'])
y_pred = model.predict(data[['X']])

import seaborn as sns

plt.figure(figsize=(16,12))
plt.suptitle('Data Cleaning and Analysis', fontsize=22, color='navy')

# 1. 原始数据分布
plt.subplot(2,2,1)
sns.scatterplot(x='X', y='Y', data=data, color='blue')
plt.title('Scatter plot after cleaning')
plt.xlabel('X')
plt.ylabel('Y')

# 2. 残差图
plt.subplot(2,2,2)
residuals = data['Y'] - y_pred
sns.histplot(residuals, kde=True, color='red')
plt.title('Residuals distribution')
plt.xlabel('Residuals')

# 3. 拟合曲线
plt.subplot(2,2,3)
sns.scatterplot(x='X', y='Y', data=data, color='green')
plt.plot(data['X'], y_pred, color='purple', linewidth=2)
plt.title('Regression Line')
plt.xlabel('X')
plt.ylabel('Predicted Y')

# 4. 误差分布热图
plt.subplot(2,2,4)
sns.heatmap(np.abs(residuals.values.reshape(20,10)), cmap='coolwarm')
plt.title('Heatmap of Absolute Errors')

plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.show()

各种处理方法总结

方法
优势
劣势
适用场景
删除缺失
简单直接
丢失数据
缺失占比低
均值/中位数填充
易实现
忽略数据波动
MCAR
回归填补
考虑特征关系
容易过拟合
MAR
插值法
保持时间趋势
对非时间数据差
连续时间数据
IQR检测异常
鲁棒,简单
无法检测复杂模式
单变量异常检测
Isolation Forest
适合高维数据
参数敏感
大规模数据
LOF
局部异常检测
高维下计算量大
多群组数据

最后

最近准备了 16大块的内容,124个算法问题 的总结 ,完整的机器学习小册,免费领取~
领取:备注「算法小册」即可~

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言