在机器学习项目中,团队协作和模型管理是一个复杂的过程。每个模型可能具有独特的特征或参数,没有合适的性能监控和模型版本控制工具,评估和利用这些模型变得复杂。共享这些模型以供团队其他成员测试也是一个挑战。如果有一个工具可以跟踪模型,将变得更加方便。一个平台,使得团队能够简单协作开发有效的自动化机器学习流程。
集中数据存储:需要集中的数据存储,团队成员可以访问以保存和使用项目数据集。为了节省其他团队成员重复整个清洗过程的时间,所有清洗和预处理过的数据应该保存在一个位置。
数据验证:随着越来越多的样本添加,数据的统计属性可能会随时间变化。这是至关重要的,因为它可能会影响模型随时间的准确性。
模型的可访问性:训练好的模型必须存储在某个地方,以便在进行预测时加载。它应该方便其他团队成员用于他们项目中的实验。
模型监控:如数据验证中提到的,数据属性可能会随时间变化,影响模型的准确性。因此,应该持续监控模型的性能,以检测其性能的下降。
模型版本控制:在训练模型时,可能使用不同的特征、模型或超参数来创建不同的模型。因此,跟踪这些模型以衡量它们的性能并提高它们的可访问性变得至关重要。
Layer是一个构建生产级机器学习流程的平台。在将数据和模型上传到这个平台后,可以轻松地训练和重新训练模型。它无缝支持模型版本控制和性能跟踪。可以共享数据和模型,使其成为一个简单的协作机器学习平台。团队成员可以使用模型版本控制来审查和评估他们同行的模型开发周期。
由于缺乏协调,团队经常花费时间做重复的工作。Layer像一个中央存储库一样运作,用于数据和模型,让团队成员能够访问过程中使用的数据而无需再次预处理,减少重复劳动。自动化版本控制允许快速切换回模型的早期版本并重新创建之前获得的结果。
Layer的美妙之处在于不必修改现有的编程方法或平台。可以用几行代码就使用Layer的功能。
将使用水质数据集来训练一个分类模型,以探究水的可饮用性,使用pH、硬度和其他化学属性等因子在机器学习项目中。在重新训练模型时,将改变一些参数。在大多数情况下,模型的旧版本在此过程中丢失。然而,在这个案例中,将使用Layer平台来帮助模型版本控制并比较不同模型版本的性能。
!pip install -U layer -q
导入必要的库:
from layer.decorators import dataset, model,resources
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np
import layer
from layer import Dataset
注册和登录:
Layer要求首先注册并登录。当运行以下代码时,会提示粘贴一个密钥,密钥的链接也会出现。将URL复制到浏览器中,然后登录Layer账户以找到密钥;复制这个密钥并将其输入到提示中。
import layer
layer.login()
初始化第一个Layer项目:
是时候开始第一个Layer项目了。整个项目可以在https://app.layer.ai找到。
layer.init("new_project")
加载数据集:
要将数据加载到Layer项目中,将使用装饰器@dataset并使用装饰器@resources指定数据集的名称和路径。
@dataset("water_dataset")
@resources(path="./")
def create_dataset():
data = pd.read_csv('water_potability.csv')
return data
运行此代码以在Layer项目中构建数据集:
layer.run([create_dataset])
可以在项目中导航以访问数据集。
训练模型:
将向训练函数train()添加装饰器@model以将其注册到Layer。为此,函数必须返回模型对象。layer.log()函数将所有定义的参数记录到Layer仪表板上。
@model(name='classification_model',dependencies=[Dataset('water_dataset')])
def train():
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
from sklearn.metrics import average_precision_score, roc_auc_score, roc_curve,precision_recall_curve
parameters = {
"test_size": 0.20,
"random_state": 20,
"n_estimators": 150
}
layer.log(parameters)
# 从layer加载数据集
df = layer.get_dataset("water_dataset").to_pandas()
df.dropna(inplace=True)
features_x = df.drop(["Potability"], axis=1)
target_y = df["Potability"]
X_train, X_test, y_train, y_test = train_test_split(features_x, target_y, test_size=parameters["test_size"], random_state=parameters["random_state"])
random_forest = RandomForestClassifier(n_estimators=parameters["n_estimators"])
random_forest.fit(X_train, y_train)
y_pred = random_forest.predict(X_test)
layer.log({"accuracy":accuracy_score(y_test, y_pred)})
cm = confusion_matrix(y_test, y_pred, labels=random_forest.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=random_forest.classes_)
disp.plot()
layer.log({"Confusion metrics" : plt.gcf()})
probs = random_forest.predict(X_test)
# 计算ROC AUC
auc = roc_auc_score(y_test, probs)
layer.log({"AUC":f'{auc:.4f}'})
sample_preds = X_test
sample_preds["predicted"] = y_pred
layer.log({"Sample predictions":sample_preds.head(100)})
return random_forest
要记录参数并上传训练好的模型,将训练函数传递给Layer。
layer.run([train])
比较训练结果:
打开Layer项目,将看到上传的模型和数据集。所有记录的参数和图表都会在那里,以及模型版本。每次运行训练函数时,都会上传一个新的模型版本以及所有记录的参数。这使得比较所有模型的性能并使用早期版本变得容易。
可以比较记录的参数和结果,如测试数据大小、超参数、准确性和ROC-AUC分数。
以下显示了样本预测。
不同模型版本的记录图表也可以可视化和比较。
从Layer获取ML模型:
import layer
model = layer.get_model("san22/new_project/models/classification_model:2.1").get_train()