系好安全带,因为我们即将踏上从 Jupyter 丛林到 ZenML 涅槃的旅程。不,ZenML 不会让您成为冥想大师,但它会让您成为管道专家。所以,抛开你那 100 行意大利面条式的代码吧;是时候拿出大枪了。
要继续操作,请安装 ZenML(相信我,这比向你的老板解释为什么你的上一个模型坏了更容易)。 类型在这里很重要,所以没有自由式编码;我们边走边讨论这个问题。
创建一个名为 pipelines.py 的新文件。在这部杰作中,我们将构建我们的管道——比混乱的数据处理更干净的东西。从 ZenML 的管道装饰器开始:
from zenml import pipeline @pipeline(name="used_car_price_predictor") def ml_pipeline(): # We’ll fill in these dots soon. ...
这是我们的第一个 ZenML 步骤,我们将从 .zip 文件中读取数据(当然,因为数据永远不会以简单的 CSV 形式出现)。来认识一下我们的 data_ingestion_step 函数,我们在其中导入数据并将其放入一个工件中——ZenML 术语,意思是“我们将把这个混乱的事情传递到下一步,但现在在技术上很奇特。”
from zenml import step import pandas as pd from typing import Tuple @step(enable_cache=False) def data_ingestion_step(file_path: str) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: # Extract zip files and read data with pd.read_csv() ... return train, test, sample # This tuple is now an “Artifact” – no fancy unboxing needed
在 ml_pipeline 中,我们从工件中提取实际数据,如下所示:
raw_data_artifacts = data_ingestion_step(file_path="data/playground-series-s4e9.zip") train, test, sample = raw_data_artifacts
这些步骤相对轻松,但不要骄傲。使用 ZenML 的步骤装饰器,我们处理缺失值、设计特征并清理异常值。
@step(enable_cache=False) def handle_missing_values_step(df: pd.DataFrame) -> pd.DataFrame: # Code to fill missing values ... @step(enable_cache=False) def feature_engineering_step(df: pd.DataFrame, strategy: str, features: list) -> pd.DataFrame: # Log-transform and other fancy tricks ... @step(enable_cache=False) def outlier_detection_step(df: pd.DataFrame, feature: str, strategy: str, method: str) -> pd.DataFrame: # Outlier removal or adjustment ...
正在准备中:
filled_train = handle_missing_values_step(train) engineered_train = feature_engineering_step(filled_train, strategy='log', features=['price']) cleaned_train = outlier_detection_step(df=engineered_train, feature='price', strategy='IQR', method='remove')
我们的数据终于干净了。现在是时候将其分为训练集和测试集了。您可能认为这会是简单的部分,但您错了——类型转换是关键。
X_train, X_test, y_train, y_test = data_splitter(cleaned_train)
这就是事情变得棘手的地方。 Sklearn 的 RegressorMixin 对于可移植性很有用,但 ZenML 工件并不总是很好用。因此,我们通过创建自定义 PipelineRegressor 类来破解它:
from sklearn.pipeline import Pipeline from sklearn.base import RegressorMixin class PipelineRegressor(Pipeline, RegressorMixin): pass
现在,我们在 model_building_step 中使用此类。您需要初始化 mlflow、记录列并结束该过程:
from zenml import pipeline @pipeline(name="used_car_price_predictor") def ml_pipeline(): # We’ll fill in these dots soon. ...
构建模型后,我们会进行一些预测并记录评估指标 - 如果只是像“看,它是准确的!”那么简单就好了!这是 ZenML 版本:
from zenml import step import pandas as pd from typing import Tuple @step(enable_cache=False) def data_ingestion_step(file_path: str) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]: # Extract zip files and read data with pd.read_csv() ... return train, test, sample # This tuple is now an “Artifact” – no fancy unboxing needed
恭喜你,你成功了!现在,运行 ml_pipeline() 并前往 ZenML 仪表板查看流程的 DAG 视图。 MLFlow UI 将显示指标、模型详细信息和使用中的功能。
有用链接
以上是驯服机器学习管道野兽:ZenML 版的详细内容。更多信息请关注PHP中文网其他相关文章!