数据科学生命周期与机器学习项目管理

数据科学生命周期是一个迭代过程,每个阶段都会根据研究或实验的需求被多次访问。这是因为该领域要求的方法通常没有绝对的对错结果,每个结果都根据数据、方法、假设、考虑或忽略的因素等具有其相关性。最终,能够提供相对较好结果且符合商业逻辑的方法会被投入生产。但即使在生产之后,这个周期也不会停止,需要不断监控模型性能并适时进行修订。

随着商业意识到数据的重要性及其正确使用的好处,数据科学团队的规模逐年增加。更多的团队正在进行各种实验、修订和优化。如果没有一个流程来跟踪每个实验、测量结果并记录结果以供参考,很快就会变得非常复杂。这在避免冗余研究和实验方面大有帮助。

为了实现这一点,可复制性和可重现性扮演了重要角色,即能够执行数据分析并取得与他人相同的结果。本文将探讨如何使用配置文件构建和管理机器学习报告,并生成HTML报告。对于这个简单的机器学习项目,将使用乳腺癌威斯康星诊断数据集。这个ML项目的目标是预测一个人是否有良性或恶性肿瘤。

将首先传统地构建一个分类模型。然后,将使用YAML配置文件构建相同的模型。最后,将生成一个HTML报告并保存它。

分类模型 - 无配置文件

让创建一个名为notebook.ipynb的Jupyter笔记本,并在其中放入以下代码。使用VSCode作为编辑器,它提供了一个创建Jupyter笔记本的便捷方式。

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier import joblib # 数据集路径 filename = "./Data/breast-cancer-wisconsin.csv" # 加载数据 data = pd.read_csv(filename) # 将"?"替换为-99999 data = data.replace('?', -99999) # 删除id列 data = data.drop(['id'], axis=1) # 定义X(自变量)和y(因变量) X = data.drop(['diagnosis','Unnamed: 32'], axis=1) y = data['diagnosis'] # 分割数据为训练和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 调用分类器并拟合数据 classifier = KNeighborsClassifier(n_neighbors=5, weights="uniform", algorithm = "auto", leaf_size = 25, p=1, metric="minkowski", n_jobs=-1) # 训练分类器 classifier.fit(X_train, y_train) # 测试分类器 result = classifier.score(X_test, y_test) print("Accuracy score is. {:.1f}".format(result)) # 保存分类器到模型目录 joblib.dump(classifier, './Model/knn.pkl')

如果注意到,上述代码中有各种硬编码的数字、文件名、模型参数、训练/测试分割百分比等。如果想进行实验,可以更改代码并重新运行它。

作为最佳实践,不建议直接更改代码,而是推荐使用配置文件。配置文件有各种类型,如YAML、JSON、XML、INI等,而在情况下,将使用YAML格式。YAML文件格式因其易读性而受欢迎。YAML相对容易编写,并且在简单的YAML文件中,没有数据格式化项,如大括号和方括号;大多数项目之间的关系是使用缩进来定义的。

YAML配置文件

让创建Config.YAML配置文件。

# 初始设置 data_directory: "./Data/" data_name: "breast-cancer-wisconsin.csv" drop_columns: ["id","Unnamed: 32"] target_name: "diagnosis" test_size: 0.3 random_state: 123 model_directory: "./Model" model_name: KNN_classifier.pkl #kNN参数 n_neighbors: 3 weights: uniform algorithm: auto leaf_size: 15 p: 2 metric: minkowski n_jobs: 1

现在已经用传统的方式构建了模型,让进入下一节,将稍微不同地做这件事。

分类模型 - 带配置文件

与上一个方法相比,有两个主要变化。加载和读取YAML文件。用YAML配置文件中的变量替换所有硬编码参数。让将以下代码块添加到notebook.ipynb中,以加载Config.yaml

# 文件夹加载配置文件 CONFIG_PATH = "./" # 函数加载yaml配置文件 def load_config(config_name): with open(os.path.join(CONFIG_PATH, config_name)) as file: config = yaml.safe_load(file) return config config = load_config("Config.yaml")

现在,让继续用配置文件中的变量替换硬编码参数。例如,将修改训练/测试分割代码。

# 分割数据为训练和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=config["test_size"], random_state=config["random_state"] )

所做的更改如下:

  • test_size = 0.2被替换为config[“test_size”]
  • 随机状态 = 42被替换为config[“random_state”]

在做出类似的更改后,最终文件将如下所示。

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier import joblib import os import yaml # 文件夹加载配置文件 CONFIG_PATH = "./" # 函数加载yaml配置文件 def load_config(config_name): with open(os.path.join(CONFIG_PATH, config_name)) as file: config = yaml.safe_load(file) return config config = load_config("Config.yaml") # 加载数据 data = pd.read_csv(os.path.join(config["data_directory"], config["data_name"])) # 将"?"替换为-99999 data = data.replace("?", -99999) # 删除id列 data = data.drop(config["drop_columns"], axis=1) # 定义X(自变量)和y(因变量) X = np.array(data.drop(config["target_name"], 1)) y = np.array(data[config["target_name"]]) # 分割数据为训练和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=config["test_size"], random_state=config["random_state"] ) # 调用分类器并拟合数据 classifier = KNeighborsClassifier( n_neighbors=config["n_neighbors"], weights=config["weights"], algorithm=config["algorithm"], leaf_size=config["leaf_size"], p=config["p"], metric=config["metric"], n_jobs=config["n_jobs"], ) # 训练分类器 classifier.fit(X_train, y_train) # 测试分类器 result = classifier.score(X_test, y_test) print("Accuracy score is. {:.1f}".format(result)) # 保存分类器到模型目录 joblib.dump(classifier, os.path.join(config["model_directory"], config["model_name"]))

可以在Github上找到完整的代码。到目前为止,已经成功构建了一个分类模型,构建了一个YAML配置文件,在Jupyter笔记本中加载了配置文件,并参数化了整个代码。现在,如果更改配置文件并运行notebook.ipynb,将看到模型结果与常规方法非常相似。

以下是生成报告的步骤:

  1. 以管理员身份打开终端并导航到项目文件夹。
  2. 将使用nbconvert库进行报告生成。如果没有安装,请执行pip install nbconvertconda install nbconvert
  3. 在终端中输入jupyter nbconvert –execute –to html notebook.ipynb。–execute执行Jupyter笔记本中的所有单元格。
  4. 将生成一个notebook.html文件,并保存在项目文件夹中。

如果想对模型进行实验,而不是直接在代码中进行更改,对Config.yaml进行更改,并按照上述步骤生成报告。

现在理解了在机器学习项目中使用配置文件的重要性。在本文中,学习了什么是配置文件,配置文件在机器学习项目中的重要性,如何创建YAML文件并在ML项目中使用它。现在可以开始在下一个机器学习项目中使用配置文件了。

如果学到了新东西或喜欢阅读本文,请分享它,以便其他人可以看到。

祝学习愉快!

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485