跳至主要内容

DeepChecks 教程:自动化机器学习测试

通过我们的分步指南,学习如何执行数据与模型验证,并使用 DeepChecks 自动化测试,确保机器学习表现稳健。
· 12分钟 阅读

使用 AI 探索

在本教程中,您将了解 DeepChecks,并学习如何用它进行数据验证和机器学习测试。我们还将使用 GitHub Actions 自动化模型测试,并将结果保存为制品(artifacts)。 

随着教程推进,我们将了解机器学习测试与 DeepChecks,运行 DeepChecks 的数据完整性套件并生成综合报告。我们还将通过运行模型评估套件生成机器学习测试报告,学习如何只运行单个测试而非完整套件,使用 GitHub Actions 自动化测试流程,并将机器学习测试报告保存为 GitHub Artifact。 

使用 DeepChecks 自动化机器学习测试 功能图

作者供图

什么是机器学习测试?

机器学习测试是一项关键流程,用于评估与验证机器学习模型的表现,以确保其公平性、准确性与稳健性。它不只是关于模型准确率与性能,我们还需要关注模型偏见、假阳性、假阴性、各类性能指标、模型吞吐量,以及模型与 AI 伦理的契合度。 

测试过程包含多种评估,如数据验证、交叉验证、F1 分数、混淆矩阵、预测漂移、数据漂移与稳健性测试等,分别用于检验模型性能与可靠性的不同方面。 

我们还会将数据集划分为三个子集,以便在训练过程中以及训练后在未见过的数据上评估模型。 

机器学习测试是 AI 应用的必要组成部分,将其与模型训练一同自动化能够为我们带来可靠、可用的 AI 系统。

如果您是机器学习新手,想系统学习基础知识,建议学习 Machine Learning Fundamentals with Python 技能路径。该课程将从使用 scikit-learn 进行监督学习开始,讲解 Python 机器学习基础。

开始使用 DeepChecks

DeepChecks 是一个开源的 Python 包,旨在促进对机器学习模型与数据的全面测试与验证。它提供了丰富的内置检查,用于识别模型性能、数据分布、数据完整性等方面的问题。DeepChecks 还支持持续验证功能,确保模型在部署并用于真实场景后依然可靠有效。

我们将先使用 pip 命令安装该 Python 包。

%pip install deepchecks --upgrade -q

加载数据集

在本教程中,我们使用 DataCamp 数据集中的 贷款数据(Loan Data)。它包含 9578 行,记录了贷款结构、借款人信息以及是否全额还款。

使用 Pandas 加载 CSV 文件并展示前 5 行。

import pandas as pd
loan_data = pd.read_csv("loan_data.csv")
loan_data.head()

贷款数据集的前 5 行

准备数据集

使用贷款数据集、标签列名和分类型特征名创建 DeepChecks 数据集。

from sklearn.model_selection import train_test_split
from deepchecks.tabular import Dataset

label_col = 'not.fully.paid'

deep_loan_data = Dataset(loan_data, label=label_col, cat_features=["purpose"])

运行 DeepChecks 数据完整性套件

我们将使用适用于表格数据的数据完整性套件。该套件将自主运行所有测试,并生成带结果的交互式报告。 

为此,我们将导入数据完整性套件,实例化后传入 DeepChecks 贷款数据运行套件,并最终显示结果。

from deepchecks.tabular.suites import data_integrity

integ_suite = data_integrity()
suite_result = integ_suite.run(deep_loan_data)
suite_result.show()

注意: 我们使用 DataLab 作为开发环境。ipywidgets 被禁用,导致无法直接显示结果。我们将使用 “show_in_iframe” 函数以 iframe 形式展示结果。各层级显示的结果是一致的。

suite_result.show_in_iframe()

我们的数据完整性报告包含以下测试结果:

  • 特征-标签 相关性
  • 特征-特征 相关性
  • 列中单一取值
  • 特殊字符
  • 混合空值
  • 混合数据类型
  • 字符串不匹配
  • 数据重复
  • 字符串长度越界
  • 冲突标签
  • 异常样本检测

数据完整性套件结果

Jupyter Notebook 中的数据完整性测试结果。 

您还可以将结果保存为 HTML 文件,与同事分享。 

suite_result.save_as_html()
'output.html'

运行单个测试

在大数据集上运行整个套件效率不高,因为生成结果会花费较长时间。相反,您可以只运行与数据相关的少量单项测试,并自行生成报告。

要运行单个测试,导入表格检查、初始化检查,并在 DeepCheck 贷款数据上运行。随后,使用 results.value 函数显示数值,而不是生成交互式报告。

from deepchecks.tabular.checks import IsSingleValue, DataDuplicates

result = IsSingleValue().run(deep_loan_data)
result.value

如您所见,它显示了每列中唯一值的数量。 

{'credit.policy': 2,
 'purpose': 7,
 'int.rate': 249,
 'installment': 4788,
 'log.annual.inc': 1987,
 'dti': 2529,
 'fico': 44,
 'days.with.cr.line': 2687,
 'revol.bal': 7869,
 'revol.util': 1035,
 'inq.last.6mths': 28,
 'delinq.2yrs': 11,
 'pub.rec': 6,
 'not.fully.paid': 2}

我们再来检查数据中的重复样本。 

result = DataDuplicates().run(deep_loan_data)
result.value

数据集中重复值为 0。 

0.0

使用 DeepChecks 进行机器学习测试

本节我们将集成多种模型并在处理后的贷款数据集上进行训练。随后,为生成模型测试报告,我们将在训练集与测试集上运行模型评估套件。 

数据处理与模型训练

  1. 从 Scikit-learn 导入必要函数。 
  2. 将数据集划分为训练集与测试集。 
  3. 使用标签编码器将分类型列“purpose”转换为数值。
  4. 定义 LogisticRegression、RandomForestClassifier 和 GaussianNB 模型。 
  5. 使用投票分类器集成模型。 
  6. 在训练集上训练集成模型。 
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import LabelEncoder

# Train test split
df_train, df_test = train_test_split(loan_data, stratify=loan_data[label_col], random_state=0)

# Encode the 'purpose' column
label_encoder = LabelEncoder()
df_train['purpose'] = label_encoder.fit_transform(df_train['purpose'])
df_test['purpose'] = label_encoder.fit_transform(df_test['purpose'])

# Define models
model_1 = LogisticRegression(random_state=1, max_iter=10000)
model_2 = RandomForestClassifier(n_estimators=50, random_state=1)
model_3 = GaussianNB()

# Create the VotingClassifier
clf_model = VotingClassifier(
    estimators=[('lr', model_1), ('rf', model_2), ('svc', model_3)],
    voting='soft'
)

# Train the model
clf_model.fit(df_train.drop(label_col, axis=1), df_train[label_col])

模型摘要

运行模型评估套件

我们将运行 DeepChecks 的模型评估套件来评估模型性能。 

  1. 将训练集与测试集都转换为 DeepCheck 数据集。 
  2. 初始化模型评估并在训练集、测试集与模型上运行。 
  3. 在 iframe 中展示结果。 
from deepchecks.tabular.suites import model_evaluation

deep_train = Dataset(df_train, label=label_col, cat_features=[])
deep_test =  Dataset(df_test,  label=label_col, cat_features=[])

evaluation_suite = model_evaluation()
suite_result = evaluation_suite.run(deep_train, deep_test, clf_model)
suite_result.show_in_iframe()

我们的模型评估报告包含以下测试结果:

  • ROC 报告
  • 弱分段表现
  • 未使用特征
  • 训练-测试性能
  • 预测漂移
  • 简单模型对比
  • 模型推理时间
  • 混淆矩阵报告
  • 以及更多

模型评估套件结果

  1. 如需以 JSON 格式查看结果,使用 to_json() 函数。 
suite_result.to_json()

运行单个测试

与数据验证类似,您也可以只运行单项的机器学习测试。这里我们将在训练集与测试集上运行标签漂移检查,以判断标签随时间是否发生变化。 

from deepchecks.tabular.checks import LabelDrift
check = LabelDrift()
result = check.run(deep_train, deep_test)
result.value

未检测到数据漂移。

{'Drift score': 0.0, 'Method': "Cramer's V"}

如果您在运行数据验证与模型评估套件时遇到问题,请参考 DataLab 工作区 Machine Learning Testing with DeepChecks。

如果您对“手动”的机器学习测试感兴趣,请查阅 Machine Learning Experimentation 教程,学习如何使用 Weights & Biases 来构建、记录并分析您的机器学习实验。

使用 GitHub Actions 与 DeepChecks 实现机器学习测试自动化

让我们使用 GitHub Actions 将数据验证、模型训练与模型评估阶段自动化,并将结果保存为 zip 文件。 

机器学习测试自动化是 MLOps 流水线不可或缺的一部分。您可以学习 MLOps Fundamentals 技能路径,进一步了解如何将机器学习模型投入生产并进行监控,从而创造业务价值。

环境设置

  1. 前往您的 GitHub 账号,创建一个包含必要信息的新仓库。 

创建新的 GitHub 仓库

  1. 在本地系统克隆该仓库。
  2. 进入仓库目录。 
  3. 创建新文件夹 “data”,并将“下载”文件夹中的贷款数据 CSV 移动到仓库文件夹。 
  4. 编写用于数据验证的 Python 脚本,并启动 VSCode(集成开发环境)。 
$ cd C:\Repository\GitHub\
$ git clone https://github.com/kingabzpro/Automating-Machine-Learning-Testing.git

$ cd .\Automating-Machine-Learning-Testing\
$ mkdir data
$ mv -v ".Downloads\loan_data.csv" ".\Automating-Machine-Learning-Testing\data"
$ code -r data_validation.py

数据验证文件

  1. 在数据验证文件中,您将加载 CSV、将其转换为 DeepChecks 数据集,初始化数据完整性套件并在贷款数据上运行。 
  2. 创建新文件夹 “results”,并将结果保存为 HTML 文件。 
import pandas as pd
from deepchecks.tabular import Dataset
from deepchecks.tabular.suites import data_integrity

# Load the loan data from a CSV file
loan_data = pd.read_csv("data/loan_data.csv")

# Define the label column
label_col = "not.fully.paid"

# Create a Deepchecks Dataset object with the loan data
deep_loan_data = Dataset(loan_data, label=label_col, cat_features=["purpose"])

# Initialize the data integrity suite
integ_suite = data_integrity()

# Run the data integrity suite on the dataset
suite_result = integ_suite.run(deep_loan_data)

# Save the results of the data integrity suite as an HTML file
suite_result.save_as_html("results/data_validation.html")

模型测试文件

  1. 创建一个用于数据验证的 Python 文件,包含数据处理、模型构建、训练与评估。文件还应包含将数据集转换为 DeepChecks 数据集、运行模型评估套件,并将其保存为 “results” 文件夹下的 HTML 文件。
$ code -r train_validation.py
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import LabelEncoder, StandardScaler
from deepchecks.tabular import Dataset
from deepchecks.tabular.suites import model_evaluation

# Load the loan data from a CSV file
loan_data = pd.read_csv("data/loan_data.csv")

# Define the label column
label_col = "not.fully.paid"

# Train test split
df_train, df_test = train_test_split(
    loan_data, stratify=loan_data[label_col], random_state=0
)

# Encode the 'purpose' column
label_encoder = LabelEncoder()
df_train["purpose"] = label_encoder.fit_transform(df_train["purpose"])
df_test["purpose"] = label_encoder.transform(df_test["purpose"])

# Standardize the features
scaler = StandardScaler()
df_train[df_train.columns.difference([label_col])] = scaler.fit_transform(df_train[df_train.columns.difference([label_col])])
df_test[df_test.columns.difference([label_col])] = scaler.transform(df_test[df_test.columns.difference([label_col])])

# Define models
model_1 = LogisticRegression(random_state=1, max_iter=10000)
model_2 = RandomForestClassifier(n_estimators=50, random_state=1)
model_3 = GaussianNB()

# Create the VotingClassifier
clf_model = VotingClassifier(
    estimators=[("lr", model_1), ("rf", model_2), ("gnb", model_3)], voting="soft"
)

# Train the model
clf_model.fit(df_train.drop(label_col, axis=1), df_train[label_col])

# Calculate the accuracy score using the .score function
accuracy = clf_model.score(df_test.drop(label_col, axis=1), df_test[label_col])

# Print the accuracy score
print(f"Accuracy: {accuracy:.2f}")

# Create Deepchecks datasets
deep_train = Dataset(df_train, label=label_col, cat_features=["purpose"])
deep_test = Dataset(df_test, label=label_col, cat_features=["purpose"])

# Run the evaluation suite
evaluation_suite = model_evaluation()
suite_result = evaluation_suite.run(deep_train, deep_test, clf_model)

# Save the results as HTML
suite_result.save_as_html("results/model_validation.html")

使用 GitHub Actions

如果您首次接触 GitHub Actions,建议在开始自动化前先完成“GitHub Actions and MakeFile: A Hands-on Introduction”教程。该教程将通过代码示例详细讲解 GitHub Actions 的工作方式。

  1. 要初始化 GitHub Actions,您需要暂存并提交更改,然后推送到远程 GitHub 仓库。 
$ git add .
$ git commit -m "Data and Validation files"  
$ git push
  1. 前往 GitHub 仓库,点击“Actions”标签,然后点击蓝色文字“set up a workflow yourself”。 

设置 GitHub Action 工作流

  1. 此时会跳转到工作流 main.yml 文件。请复制并粘贴以下代码。以下代码将先设置环境并安装 DeepChecks 包,随后创建文件夹,运行数据验证与模型评估,并将结果作为 GitHub Artifact 保存。
name: Model Training and Validation

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Set up Python 3.10
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install deepchecks
          
      - name: Create a folder
        run: |
          mkdir -p results
          
      - name: Validate Data
        run: |
          python data_validation.py
      - name: Validate Model Performance
        run: |
          python train_validation.py
      - name: Archive Deepchecks Results
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: deepchecks results
          path: results/*_validation.html
  1. 填写提交信息并提交更改。 

在 GitHub 中提交更改

将更改提交到 main 分支后,工作流运行将被触发。要查看运行日志,请进入 “Actions” 标签,并点击与提交信息对应的当前工作流运行。

监控工作流运行日志

  1. 工作流运行完成后,请向下滚动,在 “Artifacts” 区域下载 zip 文件。

运行时生成的 Artifact

  1. 在本地解压该 zip 文件,查看数据与模型验证结果。 

包含数据与模型验证 HTML 文件的 zip 压缩包

您也可参考 kingabzpro/Automating-Machine-Learning-Testing GitHub 仓库作为指南。它包含数据、Python 代码、工作流文件及其他运行全自动测试所需文件。 

要实现整个机器学习流水线的自动化,需要掌握多种流程与工具。若想系统学习,建议选修 MLOps Deployment and Lifecycle 课程。该课程将探讨现代 MLOps 框架,重点介绍机器学习模型的生命周期与部署。

总结

通过自动化测试流程,开发者可以快速高效地在大型、复杂数据集上验证模型的准确性与稳健性。自动化测试有助于及早发现诸如数据不一致、数据漂移与模型偏见等问题,这些问题在手动测试中可能并不明显。这既节省时间,也提升模型做出公平、准确预测的能力。

在本教程中,我们学习了机器学习测试,以及如何使用 DeepChecks 进行数据验证与机器学习测试。我们还借助 GitHub Actions 将数据与模型测试实现自动化,并将结果保存为制品。 

如果您喜欢本教程并有意开启机器学习职业生涯,建议报名 Machine Learning Scientist with Python 职业路径。完成全部课程(约 3 个月)即可获得从事机器学习科学家职位所需技能。

Abid Ali Awan

作者

Abid Ali Awan

作为一名持证的数据科学家,我热衷于利用前沿技术打造创新的机器学习应用。凭借在语音识别、数据分析与报告、MLOps、对话式人工智能以及自然语言处理方面的扎实背景,我不断打磨构建智能系统的能力,力求带来切实影响。除技术专长外,我也擅长沟通,能够将复杂概念提炼为清晰、简明的表述。因此,我成为数据科学领域备受关注的博主,与不断壮大的数据专业人士社区分享洞见与实践经验。目前,我专注于内容创作与编辑,借助大语言模型打造有力且吸引人的内容,帮助企业与个人更好地发挥数据价值。

主题