机器学习项目是迭代过程。您不仅会在jupyter笔记本中取得成功的模型。在模型在线之后,您甚至都不会停止,人们可以访问它。即使在部署后,您也必须不断照顾它,以便它与在开发阶段一样工作。
> Zillow的丑闻是如果您不会发生的情况,会发生什么。 2021年,Zillow由于其机器学习模式估计房价而损失了3.04亿美元。 Zillow超过7000户房屋,不得不以更低的价格卸载它们。该公司被自己的模型“剥夺”,不得不将其劳动力减少25%。这些类型的静音模型故障在现实世界模型中很常见,因此需要在生产性能下降之前不断更新。不这样做会损害公司的声誉,对利益相关者的信任以及最终的口袋。
目标代表我们模型的目标或目标。
>我们可以说这是一个回归问题,因为得分是根据箭头射向公牛眼的近距离计算的 - 中心中的红点。
想象一下,我们已经仔细准备了弓,箭头和目标(如数据准备)。我们的机器人配备了许多传感器和相机,在训练过程中射击了10000次。随着时间的流逝,它开始以令人印象深刻的频率吸引公牛的眼睛。我们对性能感到兴奋,并开始将机器人及其副本出售给射箭爱好者(部署模型)。
,但是很快,我们会收到一系列的投诉。一些用户报告机器人完全缺少目标。惊讶的是,我们聚集了一个团队讨论出了什么问题。我们发现的是一个经典案例的
输入功能中的这种现实世界转移已经脱离了机器人的准确性,类似于机器学习模型在输入数据(尤其是功能之间的关系,随时间变化)时的表现如何。 概念漂移
解决这些问题后,我们发布了一批新的机器人。然而,在几周内,类似的投诉流动。困惑,我们更深入地挖掘,发现目标经常被用户取代。
的教科书示例。
在机器学习术语中,概念漂移在输入变量与目标结果之间的关系发生变化时会发生概念漂移。对于我们的机器人而言,新的目标类型意味着它们现在需要以不同的方式适应拍摄,就像机器学习模型需要大量训练的数据动态时需要调整。
要将积分驱动回家,让我们探索一些现实世界中的数据和概念漂移的发生方式。
第一步当然是密切关注部署中的模型性能。但这说起来容易做起来难。
延迟地面真相
的一个示例,在现实世界的机器学习系统中最常见。如果监视系统检测到性能下降,无论该系统是否分析了实现的性能(以地面真相)或估计的性能(没有地面真相),ML工程师必须确定下降背后的原因。
这通常涉及单独检查功能或组合数据(功能漂移)并检查概念漂移目标的目标。 根据他们的发现,他们采用了各种问题解决技术。3。问题分辨率
这是一项非排他性的技术列表,可以减轻遗传后绩效降级造成的损害:
数据重新平衡:
如果性能下降是由于数据漂移引起的,则调整训练数据集以反映当前条件是一个不错的选择。
导入模块后的第一步是从Seaborn加载钻石数据集。但是,我们将使用我专门为本文准备的数据集的特殊版本来说明监视的样子。您可以使用下面的摘要将数据集加载到环境中:
>
这个数据集的特殊版本具有一个名为“ Set”的列,我们将在第二秒中获取。
>>目前,我们将提取所有功能名称,分类特征名称和目标名称:
import warnings import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.preprocessing import OneHotEncoder warnings.filterwarnings("ignore")
钻石数据集相当干净。因此,我们执行的唯一预处理是将文本功能投放到PANDAS类别数据类型中。这是通过XGBoost启用自动分类数据预处理的要求。
dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv" diamonds_special = pd.read_csv(dataset_link) diamonds_special.head()
>
将数据分为四组>
为此,我在“集合”列中标记了具有四个类别的钻石的行:
>训练集代表70%,其余IARE分别为总数据中的10%。让我们将其拆分:
# Extract all feature names all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist() # Extract the columns and cast into category cats = diamonds_special.select_dtypes(exclude=np.number).columns # Define the target column target = "price"
但是,现实世界中的数据集不带有内置的设置标签,因此您必须自己手动将数据分为四组。这是一个使用Train_test_split从Sklearn中完成任务的函数
for col in cats: diamonds_special[col] = diamonds_special[col].astype("category")
>
注意:diamonds_special.set.unique() ['train', 'val', 'test', 'prod'] Categories (4, object): ['prod', 'test', 'train', 'val']
> 现在,让我们继续进行模型培训。
训练模型>在训练XGBoost模型之前,我们需要将数据集转换为DMATRICES。这是代码:
现在,这是用已经调整过的超参数训练回归器的代码:
tr = diamonds_special[diamonds_special.set == "train"].drop("set", axis=1) val = diamonds_special[diamonds_special.set == "validation"].drop("set", axis=1) test = diamonds_special[diamonds_special.set == "test"].drop("set", axis=1) prod = diamonds_special[diamonds_special.set == "prod"].drop("set", axis=1) tr.shape (37758, 10)
def split_into_four(df, train_size=0.7): """ A function to split a dataset into four sets: - Training - Validation - Testing - Production train_size is set by the user. The remaining data will be equally divided between the three sets. """ # Do the splits training, the_rest = train_test_split(df, train_size=train_size) validation, the_rest = train_test_split(the_rest, train_size=1 / 3) testing, production = train_test_split(the_rest, train_size=0.5) # Reset the indices sets = (training, validation, testing, production) for set in sets: set.reset_index(inplace=True, drop=True) return sets tr, val, test, prod = split_into_four(your_dataset)
创建一个参考集
dtrain = xgb.DMatrix(tr[all_feature_names], label=tr[target], enable_categorical=True) dval = xgb.DMatrix(val[all_feature_names], label=val[target], enable_categorical=True) dtest = xgb.DMatrix( test[all_feature_names], label=test[target], enable_categorical=True ) dprod = xgb.DMatrix( prod[all_feature_names], label=prod[target], enable_categorical=True )
>
>参考集是模型监视上下文中使用的测试集的另一个名称。 Nannyml在测试集上使用该模型的性能作为生产性能的基准。参考集必须具有两列,除了:>现在,我们的测试集包含功能和目标,但缺少y_test_pred:
import warnings import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.preprocessing import OneHotEncoder warnings.filterwarnings("ignore")
>让我们添加:
dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv" diamonds_special = pd.read_csv(dataset_link) diamonds_special.head()
现在,我们将将测试集重命名为参考:
# Extract all feature names all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist() # Extract the columns and cast into category cats = diamonds_special.select_dtypes(exclude=np.number).columns # Define the target column target = "price"
我们部署了钻石定价模型后,我们收到了一个消息,即大量钻石即将到来。在货物到达之前,钻石的物理测量已作为产品发送给我们(我们仍在想象中),以便我们可以为它们创造价格并在我们的网站上开始营销。因此,让我们生成。
在实际的钻石到达之前,
>人类专家验证了我们的模型产生的价格,我们必须检查模型是否表现良好。我们不想在我们的网站上展示以不准确的价格显示钻石。for col in cats: diamonds_special[col] = diamonds_special[col].astype("category")
要执行此任务,Nannyml需要一个分析集 - 包含模型预测的生产数据的数据。
创建分析集类似于创建参考:现在,我们准备估计回归器的性能。
>
步骤2:估计Nannyml的性能
Nannyml提供了两种主要算法,用于估计回归和分类模型的性能: > (CBPE)用于分类 >让我们解释图 - 它具有两个部分,可以在参考和分析集中显示性能。如果估计的生产RMSE超出了阈值,则Nannyml将其标记为警报。 >
>当我们绘制估计绩效时,货物已经到来,我们的钻石专家计算了他们的实际价格。我们将它们作为价格存储在产品中。 现在,我们可以将模型的实现性能(实际性能)与估计的性能进行比较,以查看我们的监视系统是否运行良好。diamonds_special.set.unique()
['train', 'val', 'test', 'prod']
Categories (4, object): ['prod', 'test', 'train', 'val']
(DLE)的回归
>
基于置信的性能估计
我们有一个可以绘制的nannyml结果对象。让我们看看它产生了什么:
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
warnings.filterwarnings("ignore")
我们的监视系统告诉我们,模型性能在生产中下降了大约一半。但这只是一个估计 - 我们不能肯定地说。
dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv" diamonds_special = pd.read_csv(dataset_link) diamonds_special.head()
>
y_true:标签是什么?>好吧,看起来估计的RMSE(紫色)非常接近实际性能(已实现的RMSE,蓝色)。
>这告诉我们一件事 - 我们的监视系统运行良好,但是我们的模型并非如此,正如损失上升所表明的那样。那么,原因是什么?
我们现在将深入研究。# Extract all feature names all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist() # Extract the columns and cast into category cats = diamonds_special.select_dtypes(exclude=np.number).columns # Define the target column target = "price"
>步骤4:漂移检测方法
>
漂移检测是模型监视工作流程的根本原因分析步骤的一部分。它通常从多变量漂移检测开始。多变量漂移检测
>最佳的多元漂移检测方法之一是使用PCA计算数据重建误差。它的运行效果非常好,甚至可以在特征分布中遇到丝毫漂移。这是此方法的高级概述:
在此步骤中,由于PCA的性质而丢失了有关原始数据集的一些信息。
2。然后将Reference_lower解压缩到其原始维度 - reference_reconstructed。
数据重建错误 - reconstruct_error。
如果生产数据的重建误差高于基线,我们说这些功能已经漂移。
>>一旦我们有每个数据块的错误(每个数据250行),我们就可以绘制它:
import warnings import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.preprocessing import OneHotEncoder warnings.filterwarnings("ignore")
dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv" diamonds_special = pd.read_csv(dataset_link) diamonds_special.head()
如我们所见,所有损失中的尖峰都与重建错误中的警报相对应。
# Extract all feature names all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist() # Extract the columns and cast into category cats = diamonds_special.select_dtypes(exclude=np.number).columns # Define the target column target = "price"
单变量漂移检测
这就是我们使用单变量漂移检测方法的地方。 Nannyml提供了多种,具体取决于功能类型:
分类特征:
>我们可以看到最有问题的特征是颜色和深度。这并不令我感到惊讶,因为是我在写这篇文章之前人为地使他们漂流了。
>
>
不幸的是,我们停止了问题解决方案。监视工作流程的最后一步超出了本文的范围。但是,我有一些很好的建议,可以涵盖它,更多地涉及模型监视:
>
for col in cats:
diamonds_special[col] = diamonds_special[col].astype("category")
>我发现模型监视引人入胜,因为它破坏了一旦拥有良好的模型完成机器学习的幻想。随着地球的转变和用户模式的变化,很长一段时间都没有模型保持相关。这使得模型监视成为任何ML工程师技能集的关键部分。
>
以上是Python中使用Nannyml的端到端ML模型监视工作流程的详细内容。更多信息请关注PHP中文网其他相关文章!