【数据质量校验简介】

文章目录


前言

在机器学习项目中,模型效果往往并不取决于算法本身,而是高度依赖数据质量。现实中的数据通常存在缺失值、异常值、不一致格式等问题,如果不进行严格校验,模型训练结果会出现偏差甚至完全失效。


一、什么是数据质量校验?

数据质量校验(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)
相关推荐
ai产品老杨1 小时前
【架构解析】高并发 AI 视频流管理平台:实现 X86/ARM 异构部署与 GB28181 全链路源码交付
arm开发·人工智能·架构
MFXWW21 小时前
从 Python 到 3D 开发:Ursina 引擎零基础入门学习路径与核心开发思路
python·游戏引擎·游戏程序·ursina
2301_813599551 小时前
如何处理MongoDB副本集中节点IP变更_rs.reconfig强制更新配置矩阵
jvm·数据库·python
TG_yunshuguoji1 小时前
亚马逊云代理商:如何在AWS上部署Hermes Agent?
人工智能·云计算·aws·hermes agent·hermes
2301_796588501 小时前
如何用数据库版本号机制平滑升级前端本地的数据表结构
jvm·数据库·python
盐烟1 小时前
xpath-csv_doban_slider
开发语言·python
小学生-山海1 小时前
【安卓逆向】WE Learn登录接口iv、pwd参数分析,加密逆向分析
开发语言·python·安卓逆向
zhangchaoxies1 小时前
如何配置Oracle 19c JSON存储_环境要求与自动类型映射
jvm·数据库·python
BU摆烂会噶1 小时前
【工作流的常见模式】LangGraph 常用模式:路由模式(条件分支)
数据库·人工智能·python·langchain