点赞、关注、收藏,不迷路
点赞、关注、收藏,不迷路
做AI项目的你,是不是常被“数据质量差”拖后腿?拿到的数据集里缺失值、重复值一大堆,异常值藏在其中难以发现;数据格式混乱、单位不统一,清洗起来无从下手;更头疼的是,带着脏数据训练模型,不仅效果差、精度上不去,还会导致训练收敛慢、泛化能力差,甚至让项目反复返工,错过上线 deadline?
如果你也深陷这些困境,别再盲目清洗浪费时间!今天这篇指南,直接给你AI项目数据清洗的8个关键步骤,覆盖数据探索、缺失值处理、异常值修正等核心环节,每个步骤都附具体操作逻辑、可直接复用的Python代码示例,跟着做就能快速搞定脏数据,从根源提升模型效果!
一、先搞懂:为什么数据清洗是AI项目的“生命线”?
很多人觉得“数据清洗是边角料工作”,却忽略了核心事实:AI模型的效果,80%取决于数据质量,20%才依赖模型架构。劣质数据里的缺失值、异常值会让模型“学错规律”,重复值会增加训练冗余、拖慢效率,格式混乱会导致特征失效,最终让再好的模型也“英雄无用武之地”。
而科学的8个数据清洗步骤,正是帮你过滤无效数据、修正错误数据、规范数据格式,让数据具备“可训练性”,这是AI项目成功的基础。下面的步骤不用复杂理论,全是实操干货,新手也能轻松上手!
二、实操干货:AI项目数据清洗8个关键步骤(附完整代码)
核心工具:Python + Pandas + NumPy(AI数据处理最常用组合,提前安装:pip install pandas numpy),以下步骤基于结构化数据(表格数据)展开,文本、图像数据可类比调整核心逻辑。
步骤1:数据探索——摸清数据“底细”(基础前提)
清洗前先全面了解数据,避免盲目操作。重点关注数据维度、数据类型、缺失值分布、异常值特征,常用Pandas的描述性统计函数。
python
import pandas as pd
import numpy as np
1. 读取数据(替换为你的数据路径,支持csv、excel等格式)
df = pd.read_csv(“ai_project_data.csv”)
2. 基础信息探索:数据维度、类型、缺失值数量
print(“数据维度(行×列):”, df.shape)
print(“\n数据类型及缺失值统计:”)
print(df.info())
3. 数值型数据描述性统计:均值、中位数、最值、标准差(判断异常值线索)
print(“\n数值型数据统计信息:”)
print(df.describe())
4. 查看前5行数据,直观了解数据格式
print(“\n数据前5行:”)
print(df.head())
5. 检查重复行数量
print(f"\n重复行数量:{df.duplicated().sum()}")
6. 检查唯一值数量(判断是否存在无效重复特征)
print(“\n各列唯一值数量:”)
print(df.nunique())
实操要点:数据探索要重点标记3类问题——缺失值占比超30%的列、数据类型异常的列(如数值存为字符串)、唯一值为1的无效列,为后续清洗明确方向。
步骤2:缺失值处理——避免“以偏概全”(核心步骤)
缺失值不能直接删除或随意填充,要根据缺失比例和数据类型选择策略:缺失率<5%用均值/中位数/众数填充;5%-30%用模型预测填充;>30%考虑删除列。
python
import pandas as pd
import numpy as np
1. 查看各列缺失值占比
missing_rate = (df.isnull().sum() / len(df)) * 100
print(“各列缺失值占比(%):”)
print(missing_rate[missing_rate > 0].sort_values(ascending=False))
2. 策略1:数值型数据填充(缺失率<5%)
均值填充(适合分布均匀的数据)
df[“age”] = df[“age”].fillna(df[“age”].mean())
中位数填充(适合存在异常值的数据)
df[“salary”] = df[“salary”].fillna(df[“salary”].median())
3. 策略2:分类数据填充(缺失率<5%)
众数填充
df[“gender”] = df[“gender”].fillna(df[“gender”].mode()[0])
用“未知”标记(适合类别较多的数据)
df[“occupation”] = df[“occupation”].fillna(“未知”)
4. 策略3:模型预测填充(缺失率5%-30%,以填充age为例)
from sklearn.linear_model import LinearRegression
筛选无缺失值的样本作为训练集
train_data = df[df[“age”].notnull()][[“salary”, “work_years”, “age”]]
筛选缺失age的样本作为测试集
test_data = df[df[“age”].isnull()][[“salary”, “work_years”]]
训练模型预测缺失值
model = LinearRegression()
model.fit(train_data[[“salary”, “work_years”]], train_data[“age”])
df.loc[df[“age”].isnull(), “age”] = model.predict(test_data)
5. 策略4:删除缺失率>30%的列
high_missing_cols = missing_rate[missing_rate > 30].index.tolist()
df = df.drop(high_missing_cols, axis=1)
步骤3:重复值处理——减少冗余提升效率
重复数据会增加模型训练的计算成本,还可能导致模型对重复样本过度拟合,必须彻底清理。
python
import pandas as pd
1. 查看重复行数量
print(f"重复行数量:{df.duplicated().sum()}")
2. 删除完全重复的行(保留第一行)
df = df.drop_duplicates(keep=“first”)
3. 处理部分重复(关键字段重复,其他字段不同,以user_id为例)
查看关键字段重复情况
print(f"user_id重复数量:{df.duplicated(subset=[‘user_id’]).sum()}")
按user_id分组,取最新时间的记录(假设存在create_time字段)
df = df.sort_values(“create_time”).drop_duplicates(subset=[‘user_id’], keep=“last”)
重置索引(删除重复行后索引可能不连续)
df = df.reset_index(drop=True)
步骤4:异常值处理——剔除“干扰项”保障数据可靠性
异常值(如 salary=1000000 明显超出合理范围)会严重干扰模型训练,常用“3σ原则”“IQR四分位法”识别并处理。
python
import pandas as pd
import numpy as np
以处理salary字段异常值为例
方法1:3σ原则(适合数据呈正态分布)
def handle_outlier_3sigma(data, col):
mean = data[col].mean()
std = data[col].std()
# 定义异常值范围(超出均值±3σ)
lower = mean - 3 * std
upper = mean + 3 * std
# 过滤异常值(保留正常数据)
data_clean = data[(data[col] >= lower) & (data[col] <= upper)]
return data_clean
方法2:IQR四分位法(适合数据分布不规则,鲁棒性更强)
def handle_outlier_iqr(data, col):
q1 = data[col].quantile(0.25) # 第一四分位
q3 = data[col].quantile(0.75) # 第三四分位
iqr = q3 - q1 # 四分位距
# 定义异常值范围
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
# 替换异常值为边界值(避免删除过多数据)
data[col] = np.where(data[col] < lower, lower, data[col])
data[col] = np.where(data[col] > upper, upper, data[col])
return data
选择方法处理salary异常值(优先IQR法)
df = handle_outlier_iqr(df, “salary”)
验证处理结果(查看描述性统计)
print(“处理后salary统计信息:”)
print(df[“salary”].describe())
步骤5:数据标准化——统一尺度助力模型收敛
不同特征的尺度差异(如 age 范围10-80,salary 范围1000-100000)会导致模型偏向数值大的特征,需标准化为同一尺度(常用Z-score标准化、Min-Max归一化)
python
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
1. 选择需要标准化的数值型特征
numeric_cols = [“age”, “salary”, “work_years”]
df_numeric = df[numeric_cols].copy()
方法1:Z-score标准化(均值为0,标准差为1,适合大多数模型)
scaler_z = StandardScaler()
df_numeric_z = pd.DataFrame(
scaler_z.fit_transform(df_numeric),
columns=numeric_cols,
index=df_numeric.index
)
方法2:Min-Max归一化(缩放到0-1范围,适合需要明确数值范围的场景)
scaler_minmax = MinMaxScaler()
df_numeric_minmax = pd.DataFrame(
scaler_minmax.fit_transform(df_numeric),
columns=numeric_cols,
index=df_numeric.index
)
将标准化后的数据替换回原数据集
df[numeric_cols] = df_numeric_z # 选择一种标准化方式即可
步骤6:数据格式统一——消除“格式噪音”
数据格式混乱(如日期格式不统一、字符串大小写混杂、单位不统一)会导致特征无法被模型识别,需统一规范。
python
import pandas as pd
1. 日期格式统一
查看原始日期格式
print(“原始日期格式示例:”)
print(df[“create_time”].head())
统一转换为datetime格式
df[“create_time”] = pd.to_datetime(df[“create_time”], errors=“coerce”) # errors="coerce"将无效格式转为缺失值
提取年、月、日作为新特征(更适合模型使用)
df[“create_year”] = df[“create_time”].dt.year
df[“create_month”] = df[“create_time”].dt.month
df[“create_day”] = df[“create_time”].dt.day
2. 字符串格式统一(大小写、去空格)
df[“name”] = df[“name”].str.strip() # 去除前后空格
df[“gender”] = df[“gender”].str.lower() # 转为小写(或str.upper()转为大写)
df[“occupation”] = df[“occupation”].str.replace(" ", “”) # 去除中间空格
3. 单位统一(以weight为例,存在kg和g两种单位)
print(“原始weight字段示例:”)
print(df[“weight”].head())
统一转为kg(将含"g"的数值除以1000)
df[“weight”] = df[“weight”].apply(
lambda x: float(x.replace(“g”, “”))/1000 if “g” in str(x) else float(x.replace(“kg”, “”))
)
步骤7:特征筛选——保留“有用信息”精简数据
冗余特征(如与目标无关的字段、高度相关的特征)会增加模型复杂度,需筛选出对目标任务有价值的特征。
python
import pandas as pd
import numpy as np
1. 删除与目标无关的字段(如id、姓名等标识类字段,假设目标是预测user_behavior)
useless_cols = [“user_id”, “name”, “create_time”]
df = df.drop(useless_cols, axis=1)
2. 去除高度相关特征(避免多重共线性)
计算特征相关性矩阵
corr_matrix = df.corr()
print(“特征相关性矩阵:”)
print(corr_matrix)
定义相关系数阈值(如0.8),筛选高度相关特征
high_corr_cols = []
for i in range(len(corr_matrix.columns)):
for j in range(i+1, len(corr_matrix.columns)):
if abs(corr_matrix.iloc[i, j]) > 0.8:
high_corr_cols.append(corr_matrix.columns[j])
去重并删除高度相关特征(保留第一个)
high_corr_cols = list(set(high_corr_cols))
df = df.drop(high_corr_cols, axis=1)
3. 筛选低方差特征(方差接近0,说明特征值几乎无变化,无区分度)
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.01) # 设定方差阈值
df_selected = selector.fit_transform(df)
获取保留的特征名
selected_cols = df.columns[selector.get_support()].tolist()
df = df[selected_cols]
步骤8:数据验证——确保清洗后数据可用
清洗完成后需最后验证,确保无遗漏问题,数据可直接用于模型训练
python
import pandas as pd
1. 验证核心指标
print(“清洗后数据维度:”, df.shape)
print(“\n清洗后缺失值情况:”)
print(df.isnull().sum())
print(“\n清洗后数据统计信息:”)
print(df.describe())
2. 抽样检查数据格式
print(“\n清洗后数据抽样示例:”)
print(df.sample(5))
3. 保存清洗后的数据(用于后续模型训练)
df.to_csv(“cleaned_ai_project_data.csv”, index=False)
print(“\n数据清洗完成,已保存为 cleaned_ai_project_data.csv”)
**文末福利:入群免费选10门AI面试精品课程视频
以上只是AI工程师项目经验梳理和面试话术的基础技巧,面试中还有更多进阶需求。为了帮大家提升解决问题的能力,彻底搞定AI工程师面试,轻松拿下offer,我特意准备了专属福利—— 这次的10门AI实战课程视频都是我精心挑选,原价值299,现在入群免费选!为什么免费?希望我们后期有更多的合作! 私信回复【大模型】免费领取大模型课程视频,同步拉你进人工智能技术交流群,与300+行业精英交流。**