如何用MLflow做機器學習實驗效果比對

背景介紹

最近看了很多MLflow相關的內容,做一個簡單的分享。MLFlow是一款管理機器學習工作流程的工具,核心由以下4個模塊組成:

  1. MLflow Tracking:如何通過API的形式管理實驗的參數、代碼、結果,並且通過UI的形式做對比。

  2. MLflow Projects:代碼打包的一套方案

  3. MLflow Models:一套模型部署的方案

  4. MLflow Model Registry:一套管理模型和註冊模型的方案

今天重點講講MLflow Tracking,也就是如何做機器學習不同模型下的實驗的管理以及效果的比對。

詳細流程

(1)安裝環境

肯定要首先安裝mlflow,可以通過pip install mlflow的方式進行安裝。

(2)訓練代碼

可以使用mlflow的官方demo做模型的訓練,具體代碼如下:

重點看下最後幾行:

mlflow.log_param("alpha", alpha)

mlflow.log_param("l1_ratio", l1_ratio)

mlflow.log_metric("rmse", rmse)

mlflow.log_metric("r2", r2)

mlflow.log_metric("mae", mae)

在這幾行代碼中,demo通過mlflow sdk註冊了參與訓練的參數,分別是alpha和l1_ratio,另外也註冊了metric(參與評估的指標)爲rmse、r2、mae

(3)執行訓練任務

import os

import warnings

import sys

 

import pandas as pd

import numpy as np

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

from sklearn.model_selection import train_test_split

from sklearn.linear_model import ElasticNet

import mlflow

import mlflow.sklearn

import logging

logging.basicConfig(level=logging.WARN)

logger = logging.getLogger(__name__)

 

def eval_metrics(actual, pred):

    rmse = np.sqrt(mean_squared_error(actual, pred))

    mae = mean_absolute_error(actual, pred)

    r2 = r2_score(actual, pred)

    return rmse, mae, r2

 

if __name__ == "__main__":

    warnings.filterwarnings("ignore")

    np.random.seed(40)

    # Read the wine-quality csv file from the URL

    csv_url =\

        'http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv'

    try:

        data = pd.read_csv(csv_url, sep=';')

    except Exception as e:

        logger.exception(

            "Unable to download training & test CSV, check your internet connection. Error: %s", e)

 

    # Split the data into training and test sets. (0.75, 0.25) split.

    train, test = train_test_split(data)

 

    # The predicted column is "quality" which is a scalar from [3, 9]

    train_x = train.drop(["quality"], axis=1)

    test_x = test.drop(["quality"], axis=1)

    train_y = train[["quality"]]

    test_y = test[["quality"]]

 

    alpha = float(sys.argv[1]) if len(sys.argv) > 1 else 0.5

    l1_ratio = float(sys.argv[2]) if len(sys.argv) > 2 else 0.5

 

    with mlflow.start_run():

        lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)

        lr.fit(train_x, train_y)

        predicted_qualities = lr.predict(test_x)

        (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)

        print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio))

        print("  RMSE: %s" % rmse)

        print("  MAE: %s" % mae)

        print("  R2: %s" % r2)

 

        mlflow.log_param("alpha", alpha)

        mlflow.log_param("l1_ratio", l1_ratio)

        mlflow.log_metric("rmse", rmse)

        mlflow.log_metric("r2", r2)

        mlflow.log_metric("mae", mae)

        mlflow.sklearn.log_model(lr, "model")

接下來就可以執行訓練任務,每次執行需要傳兩個參數,分別對應代碼裏的alpha和l1_ratio這兩個取值。

python train.py 0.4 0.4

python train.py 0.5 0.5

python train.py 0.6 0.6

訓練完後數據會在本地做一個存儲,以每次任務的實例名稱爲文件夾名

image.png

 

每個任務下面有四個內容,分別是params、metrics、artifacts、tags

  • Artifacts:存儲輸出的model

  • Metrics:存儲了模型的評估指標,比如mae、r2、rmse

  • Params:存儲的是一些參數

  • Tags:存儲的是一些任務的meta,就是用戶、日誌等等

(4)可視化管理

在terminal中運行命令:mlflow run

然後在瀏覽器輸入localhost:5000,可以打開mlflow的UI

image.png

experiments是實驗對照組,在選擇對照組後可以選擇不同的任務進行比較。

image.png

可以看到不同任務的效果比對:

image.png

也可以圖形化的展示:

image.png

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章