背景介紹
最近看了很多MLflow相關的內容,做一個簡單的分享。MLFlow是一款管理機器學習工作流程的工具,核心由以下4個模塊組成:
-
MLflow Tracking:如何通過API的形式管理實驗的參數、代碼、結果,並且通過UI的形式做對比。
-
MLflow Projects:代碼打包的一套方案
-
MLflow Models:一套模型部署的方案
-
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
訓練完後數據會在本地做一個存儲,以每次任務的實例名稱爲文件夾名
每個任務下面有四個內容,分別是params、metrics、artifacts、tags
-
Artifacts:存儲輸出的model
-
Metrics:存儲了模型的評估指標,比如mae、r2、rmse
-
Params:存儲的是一些參數
-
Tags:存儲的是一些任務的meta,就是用戶、日誌等等
(4)可視化管理
在terminal中運行命令:mlflow run
然後在瀏覽器輸入localhost:5000,可以打開mlflow的UI
experiments是實驗對照組,在選擇對照組後可以選擇不同的任務進行比較。
可以看到不同任務的效果比對:
也可以圖形化的展示: