你手上有了数据,但别急着训练模型。
不做预处理的模型,不是废物,就是疯子。
原始数据从来都不干净。你以为拿来就能用,实际上它:
-
缺失了一堆值;
-
格式乱七八糟;
-
字段不统一;
-
异常值满天飞;
-
还有很多看不见的“噪声”。
先别谈什么AI,连数据都没洗干净,结果只能是:垃圾进,垃圾出(Garbage In, Garbage Out)。
这篇文章就告诉你,怎么用Python把数据清洗干净、转换合理、去掉噪声,为建模打好地基。
一、数据清洗的核心任务
清洗数据,就两句话:
把该填的填上,把该扔的扔掉。
1. 处理缺失值(Missing Values)
现实数据集常见问题是缺值,比如:
name | age | income |
---|---|---|
Tom | 25 | 5000 |
Jerry | 6200 | |
Lucy | 30 |
怎么办?
几种方案:
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能帮你用最少的代码,做最清晰的处理。
下一篇,我们讲讲“特征工程”,告诉你怎么从数据里“榨出价值”。