数据预处理:清洗与转化,如何处理噪声数据

你手上有了数据,但别急着训练模型。

不做预处理的模型,不是废物,就是疯子。

原始数据从来都不干净。你以为拿来就能用,实际上它:

  • 缺失了一堆值;

  • 格式乱七八糟;

  • 字段不统一;

  • 异常值满天飞;

  • 还有很多看不见的“噪声”。

先别谈什么AI,连数据都没洗干净,结果只能是:垃圾进,垃圾出(Garbage In, Garbage Out)。

这篇文章就告诉你,怎么用Python把数据清洗干净、转换合理、去掉噪声,为建模打好地基。


一、数据清洗的核心任务

清洗数据,就两句话:

把该填的填上,把该扔的扔掉。

1. 处理缺失值(Missing Values)

现实数据集常见问题是缺值,比如:

nameageincome
Tom255000
Jerry6200
Lucy30

怎么办?

几种方案:

import pandas as pd

df = pd.read_csv("data.csv")

# 删除缺失行
df.dropna(inplace=True)

# 填平均值
df["age"].fillna(df["age"].mean(), inplace=True)

# 填固定值
df["income"].fillna(0, inplace=True)

选择哪个?看业务场景。如果“缺失”本身就代表某种信息(比如没填写收入代表失业),那也可以保留原值,额外加一列“是否缺失”。

2. 去掉重复值

爬虫爬出来的东西、用户上传的表格,经常会有重复。

df.drop_duplicates(inplace=True)

一行代码解决。

3. 统一格式

日期字段有“2023/01/01”“01-01-2023”,搞不统一模型根本读不进去。

df["date"] = pd.to_datetime(df["date"])

字符串字段有大写、小写、不规范:

df["city"] = df["city"].str.lower().str.strip()

二、数据转换(Transform)

有些字段虽然没有“错误”,但直接拿去建模会出问题,要变一下形

1. 数值标准化 / 归一化

比如年龄在0~100之间,收入是几万,房价是几百万,不做处理模型权重会严重偏差。

from sklearn.preprocessing import MinMaxScaler, StandardScaler

# 归一化:把数据压缩到 0~1
scaler = MinMaxScaler()
df[["age", "income"]] = scaler.fit_transform(df[["age", "income"]])

# 标准化:转成均值为0,方差为1
scaler = StandardScaler()
df[["age", "income"]] = scaler.fit_transform(df[["age", "income"]])

2. 类别变量编码(One-Hot、Label Encoding)

比如性别字段 ['男', '女']、城市字段 ['北京', '上海', '广州'],模型看不懂,需要变成数字。

# Label Encoding(适合有顺序的分类)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df["gender"] = le.fit_transform(df["gender"])

# One-Hot Encoding(适合无序分类)
df = pd.get_dummies(df, columns=["city"])

注意:不要对高维离散字段(如手机号、用户ID)做One-Hot,会爆炸。


三、识别与处理噪声数据

所谓“噪声”,就是没有规律、带来干扰的异常数据

1. 什么是噪声数据?

举例:

  • 年龄字段突然出现一个“999”

  • 收入字段变成了“abc”

  • 传感器数据中夹杂了断电或失真数据

2. 怎么发现噪声?

方法一:看统计信息
print(df.describe())

一眼看出最大值、最小值有没有离谱,比如收入最大值居然是几千万,那多半是错误。

import seaborn as sns
import matplotlib.pyplot as plt

sns.boxplot(data=df["income"])
plt.show()

箱型图能清楚看到哪些是异常值。

方法三:设定规则阈值
df = df[(df["age"] > 0) & (df["age"] < 100)]

用常识规则把不可能的值筛掉。

3. 处理异常值的方式

处理过程:

  • 删除异常行(最简单)

  • 用中位数或均值替换

  • 对异常值进行缩放处理(比如对数变换)

    import numpy as np
    df["income"] = np.log1p(df["income"])
    

    四、一个完整的预处理流程

    以一个常见的数据集为例,我们处理一个“用户评分预测”数据集。

    字段如下:

  • user_id(字符串)

  • age(整数)

  • gender(字符串)

  • movie_id(字符串)

  • rating(1~5)

  • timestamp(时间戳)

    # 1. 读取数据
    df = pd.read_csv("ratings.csv")
    
    # 2. 清洗缺失
    df.dropna(inplace=True)
    
    # 3. 格式统一
    df["timestamp"] = pd.to_datetime(df["timestamp"])
    df["gender"] = df["gender"].str.lower()
    
    # 4. 异常值处理
    df = df[(df["age"] > 0) & (df["age"] < 100)]
    df = df[(df["rating"] >= 1) & (df["rating"] <= 5)]
    
    # 5. 编码
    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    df["user_id"] = le.fit_transform(df["user_id"])
    df["movie_id"] = le.fit_transform(df["movie_id"])
    
    # 6. 标准化
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    df[["age"]] = scaler.fit_transform(df[["age"]])
    

    做完这些,才算把“人类数据”变成了“机器能读懂的格式”。


    五、你该掌握的技能点

    技能点工具必须掌握
    缺失值处理fillna, dropna
    去重drop_duplicates
    格式转换to_datetime, str.lower
    异常值检测describe, boxplot
    编码LabelEncoder, get_dummies
    标准化归一化MinMaxScaler, StandardScaler

    数据清洗和预处理,是AI建模中最重要但常被忽视的一步。想让模型靠谱,必须先把原始数据搞干净。

    一句话总结:

    模型再牛,也架不住数据乱七八糟。

    数据预处理不是选修课,是必修。Python能帮你用最少的代码,做最清晰的处理。

    下一篇,我们讲讲“特征工程”,告诉你怎么从数据里“榨出价值”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值