你手上有了数据,但别急着训练模型。
不做预处理的模型,不是废物,就是疯子。
原始数据从来都不干净。你以为拿来就能用,实际上它:
缺失了一堆值;
格式乱七八糟;
字段不统一;
异常值满天飞;
还有很多看不见的“噪声”。
先别谈什么AI,连数据都没洗干净,结果只能是:垃圾进,垃圾出(Garbage In, Garbage Out)。
这篇文章就告诉你,怎么用Python把数据清洗干净、转换合理、去掉噪声,为建模打好地基。
清洗数据,就两句话:
把该填的填上,把该扔的扔掉。
现实数据集常见问题是缺值,比如:
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)
选择哪个?看业务场景。如果“缺失”本身就代表某种信息(比如没填写收入代表失业),那也可以保留原值,额外加一列“是否缺失”。
爬虫爬出来的东西、用户上传的表格,经常会有重复。
df.drop_duplicates(inplace=True)
一行代码解决。
日期字段有“2023/01/01”“01-01-2023”,搞不统一模型根本读不进去。
df["date"] = pd.to_datetime(df["date"])
字符串字段有大写、小写、不规范:
df["city"] = df["city"].str.lower().str.strip()
有些字段虽然没有“错误”,但直接拿去建模会出问题,要变一下形。
比如年龄在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"]])
比如性别字段 ['男', '女']、城市字段 ['北京', '上海', '广州'],模型看不懂,需要变成数字。
# 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,会爆炸。
所谓“噪声”,就是没有规律、带来干扰的异常数据。
举例:
年龄字段突然出现一个“999”
收入字段变成了“abc”
传感器数据中夹杂了断电或失真数据
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)]
用常识规则把不可能的值筛掉。
删除异常行(最简单)
用中位数或均值替换
对异常值进行缩放处理(比如对数变换)
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能帮你用最少的代码,做最清晰的处理。
下一篇,我们讲讲“特征工程”,告诉你怎么从数据里“榨出价值”。