文章目录
- 前言
- 一、什么是数据质量校验?
- 二、常见数据质量问题
-
- [1. 缺失值](#1. 缺失值)
- [2. 异常值](#2. 异常值)
- [3. 数据类型错误](#3. 数据类型错误)
- [4. 重复数据](#4. 重复数据)
- [5. 数据分布异常](#5. 数据分布异常)
- 三、数据质量校验的核心维度
-
- [1. 完整性](#1. 完整性)
- [2. 唯一性](#2. 唯一性)
- [3. 一致性](#3. 一致性)
- [4. 合法性](#4. 合法性)
- [5. 准确性](#5. 准确性)
- 四、构建数据质量校验工具
-
- [1. 项目目标](#1. 项目目标)
- [2. 实现代码](#2. 实现代码)
- [3. 示例](#3. 示例)
- [4. 设计思路说明](#4. 设计思路说明)
- 五、自动化数据校验框架
-
- [1. Great Expectations](#1. Great Expectations)
- [2. Pandera](#2. Pandera)
前言
在机器学习项目中,模型效果往往并不取决于算法本身,而是高度依赖数据质量。现实中的数据通常存在缺失值、异常值、不一致格式等问题,如果不进行严格校验,模型训练结果会出现偏差甚至完全失效。
一、什么是数据质量校验?
数据质量校验(Data Quality Validation)是指在数据进入模型训练之前,对数据的完整性、准确性、一致性、合理性等进行检测和验证的过程。
其核心目标是:
- 提前发现数据问题
- 避免"垃圾进,垃圾出"
- 提高模型稳定性与可信度
二、常见数据质量问题
1. 缺失值
表现形式:
- NaN
- None
- 空字符串
影响:
- 模型无法训练(如线性回归)
- 统计偏差
2. 异常值
表现形式:
- 极端数值(如年龄=999)
- 不合理范围数据
影响:
- 拉偏模型参数
- 降低泛化能力
3. 数据类型错误
示例:
- 数值列存储为字符串
- 日期格式不统一
4. 重复数据
影响:
- 模型偏向某些样本
- 训练数据分布失真
5. 数据分布异常
训练集 vs 测试集分布不同:
- 训练集:年龄集中在20-30
- 测试集:年龄集中在40-50
三、数据质量校验的核心维度
1. 完整性
检查是否存在缺失数据:
python
import pandas as pd
df = pd.read_csv("data.csv")
# 缺失值统计
print(df.isnull().sum())
2. 唯一性
检查是否存在重复数据:
python
# 检查重复行
duplicates = df.duplicated().sum()
print("重复数据数量:", duplicates)
# 删除重复
df = df.drop_duplicates()
3. 一致性
例如:性别字段必须为 Male/Female
python
# 检查非法值
invalid_gender = df[~df['gender'].isin(['Male', 'Female'])]
print(invalid_gender)
4. 合法性
数值范围校验:
python
# 年龄必须在0-120之间
invalid_age = df[(df['age'] < 0) | (df['age'] > 120)]
print(invalid_age)
5. 准确性
通常需要业务规则或外部数据验证,例如:
- 地址是否真实
- 邮箱格式是否正确
python
import re
def is_valid_email(email):
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
return re.match(pattern, email)
df['email_valid'] = df['email'].apply(is_valid_email)
四、构建数据质量校验工具
1. 项目目标
实现一个通用数据校验工具,支持:
- 缺失值检测
- 类型校验
- 范围校验
- 唯一性检查
2. 实现代码
python
import pandas as pd
class DataValidator:
def __init__(self, df):
self.df = df
def check_missing(self):
print("=== 缺失值检测 ===")
print(self.df.isnull().sum())
def check_duplicates(self):
print("=== 重复值检测 ===")
print("重复行数:", self.df.duplicated().sum())
def check_range(self, column, min_val, max_val):
print(f"=== {column} 范围检测 ===")
invalid = self.df[(self.df[column] < min_val) | (self.df[column] > max_val)]
print(invalid)
def check_type(self, column, dtype):
print(f"=== {column} 类型检测 ===")
print(self.df[column].dtype)
if self.df[column].dtype != dtype:
print("类型不匹配!")
def run_all_checks(self):
self.check_missing()
self.check_duplicates()
3. 示例
python
df = pd.read_csv("data.csv")
validator = DataValidator(df)
validator.run_all_checks()
validator.check_range("age", 0, 120)
validator.check_type("age", "int64")
4. 设计思路说明
- 面向对象封装:便于扩展
- 单一职责:每个方法负责一种校验
- 可配置化:后续可加入规则配置文件(如JSON/YAML)
五、自动化数据校验框架
在工业级项目中,通常不会手写校验逻辑,而是使用专业工具,例如:
1. Great Expectations
特点:
- 声明式数据校验
- 自动生成报告
- 支持数据管道集成
示例:
python
import great_expectations as ge
df = ge.read_csv("data.csv")
df.expect_column_values_to_not_be_null("age")
df.expect_column_values_to_be_between("age", 0, 120)
df.save_expectation_suite()
2. Pandera
类似于"DataFrame的类型系统":
python
import pandera as pa
schema = pa.DataFrameSchema({
"age": pa.Column(int, checks=pa.Check.in_range(0, 120)),
})
schema.validate(df)