数据科学生命周期是一个迭代过程,每个阶段都会根据研究或实验的需求被多次访问。这是因为该领域要求的方法通常没有绝对的对错结果,每个结果都根据数据、方法、假设、考虑或忽略的因素等具有其相关性。最终,能够提供相对较好结果且符合商业逻辑的方法会被投入生产。但即使在生产之后,这个周期也不会停止,需要不断监控模型性能并适时进行修订。
随着商业意识到数据的重要性及其正确使用的好处,数据科学团队的规模逐年增加。更多的团队正在进行各种实验、修订和优化。如果没有一个流程来跟踪每个实验、测量结果并记录结果以供参考,很快就会变得非常复杂。这在避免冗余研究和实验方面大有帮助。
为了实现这一点,可复制性和可重现性扮演了重要角色,即能够执行数据分析并取得与他人相同的结果。本文将探讨如何使用配置文件构建和管理机器学习报告,并生成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文件中,没有数据格式化项,如大括号和方括号;大多数项目之间的关系是使用缩进来定义的。
让创建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"]
)
所做的更改如下:
在做出类似的更改后,最终文件将如下所示。
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
,将看到模型结果与常规方法非常相似。
以下是生成报告的步骤:
pip install nbconvert
或conda install nbconvert
。jupyter nbconvert –execute –to html notebook.ipynb
。–execute执行Jupyter笔记本中的所有单元格。notebook.html
文件,并保存在项目文件夹中。如果想对模型进行实验,而不是直接在代码中进行更改,对Config.yaml
进行更改,并按照上述步骤生成报告。
现在理解了在机器学习项目中使用配置文件的重要性。在本文中,学习了什么是配置文件,配置文件在机器学习项目中的重要性,如何创建YAML文件并在ML项目中使用它。现在可以开始在下一个机器学习项目中使用配置文件了。
如果学到了新东西或喜欢阅读本文,请分享它,以便其他人可以看到。
祝学习愉快!