全文共4873字,預計學習時長13分鐘
實話說,筆者花在管理和追蹤機器學習實驗上的時間,比花在開發機器學習模型上的時間要多得多。筆者最開始用Excel工作表標出正在試驗的所有參數和指標、用不同顏色來編碼、手動輸入結果,等等。筆者知道自己需要一次性調整工作流程。
本文首先將介紹追蹤實驗的重要性,然後將概述MLFlow如何讓生活變得簡單,最後通過一個常見的代碼示例來解釋如何自己進行整合。在此之後,保證你可以像個專家一樣整合機器學習流(ML flow)和優化工作流!
為什麼要追蹤實驗
不論你是老手還是新手,都不可能一次性開發出性能最好的模型。最佳性能模型的關鍵是對手頭業務的指標優化進行迭代。在數據科學的生命周期中,進行實驗只是模型開發環節中一個必要的步驟。
當涉及到產品研發時,實驗是數據科學生命周期中最關鍵的一步。在這類研究任務繁重的問題中,僅僅找到最佳解決方案是不夠的,還需要概述如何獲得最佳性能解決方案,並確保該解決方案的可複製性。
這一切都是以實驗階段為底線。我們只能建立有效高效的工作流來創建實驗、追蹤實驗、評估結果、存儲模型,最後重複這一過程。
用MLflow來擺脫困境
當筆者請教經驗豐富的專家時,他們只推薦了寥寥幾個工具以供嘗試。筆者的基本要求是:
· 幾乎不更改對現有代碼。
· 開源且免費。
· 不限制平臺,可以選擇最適合當前問題的平臺。
MLflow滿足了所有這些要求,並且還要更加強大。
MLflow是一個管理機器學習生命周期的開源平臺,包括實驗、可重複性、部署和中央模型註冊。沒錯,它所提供的不僅僅是實驗跟蹤,而是覆蓋了完整的機器學習生命周期。它包含以下功能:
· MLflow 追蹤——實驗追蹤,來記錄和比較參數和結果。
· MLflow 項目——以可重用、可複製的形式打包機器學習代碼,以便與其他數據科學家共享或用於生產中。
· MLFlow 模型——管理和部署模型,從各種機器學習庫到各種模型服務和推理平臺。
· MLFlow 模型存儲——中央模型存儲,協同管理MLflow模型的整個生命周期,包括模型版本控制、階段轉換和注釋。
雖然MLflow具有所有這些高級功能,但本文將重點討論MLflow追蹤以及它如何幫助我們有序地追蹤機器學習實驗。
理解典型工作流
還有什麼比通過一個著名的示例進行演練更有助於理解典型工作流的呢?這裡將使用著名的安德森鳶尾花數據集,並構建一個分類算法來預測該鳶尾植物的種類。選擇這個數據集沒有什麼特別的原因,只是因為它很容易從scikit-learn庫中獲得,並且可以立即嘗試。
fromsklearn.datasetsimport load_irisfromsklearn import metricsfromsklearn.model_selection importtrain_test_splitfromsklearn.tree importDecisionTreeClassifierdefload_iris_data():data = load_iris()X = data.datay = data.targetX_train,X_test, y_train, y_test = train_test_split(X,y, test_size =0.25, random_state = 10)input_data = (X_train, X_test, y_train, y_test)returninput_datadeftrain_predict_evaluate_dtree(input_data,params):X_train,X_test, y_train, y_test = input_dataclf = DecisionTreeClassifier(random_state=42,max_leaf_nodes=params['leaf_nodes'],max_depth=params['max_depth'])clf.fit(X_train,y_train)y_pred = clf.predict(X_test)test_accuracy = metrics.accuracy_score(y_test, y_pred)test_f1_score = metrics.f1_score(y_test, y_pred, average='weighted')test_metrics = (test_accuracy, test_f1_score)returnclf, test_metricsinput_data = load_iris_data()params = {'leaf_nodes': 3, 'max_depth' :2}model,test_metrics =train_predict_evaluate_dtree(input_data, params)
分解該分類問題的簡單代碼如下:
· 1–4行:導入全部所需庫。
· 6–12行: 定義一個函數,加載鳶尾花數據,拆分得到訓練集和測試集,然後返回這兩個數據集。
· 14–24行:定義一個函數,輸入數據和模型參數,建立決策樹分類器,預測測試數據,評估準確率和F1得分。這個函數最終返回模型和評估指標。
· 26–28行:設置模型參數,通過調用load_iris_data()函數加載數據,並將數據和參數傳遞給train_predict_evaluate_dtree()函數。
如果必須運行多個實驗來找到性能最好的模型,那就只能讓函數循環運行,然後在excel工作表中手動輸入這些參數和指標。這是筆者在整個項目時間線上記錄所有實驗的唯一方法。
即刻整合MLflow
本例僅增加6行代碼。這一點讓筆者非常驚喜,現在筆者再也不用Excel工作表了。代碼如下:
from sklearn.datasets import load_irisfrom sklearn import metricsfrom sklearn.model_selection importtrain_test_splitfrom sklearn.tree importDecisionTreeClassifierimport mlflowimport mlflow.sklearnmlflow.sklearn.autolog() defload_iris_data(): data = load_iris() X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X,y, test_size =0.25, random_state = 10) input_data = (X_train, X_test, y_train, y_test) return input_data deftrain_predict_evaluate_dtree(input_data, params): with mlflow.start_run(run_name = "Decision Tree ClassifierExperiments"): X_train, X_test, y_train, y_test = input_data clf = DecisionTreeClassifier(random_state=42,max_leaf_nodes=params['leaf_nodes'], max_depth=params['max_depth']) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) test_accuracy = metrics.accuracy_score(y_test, y_pred) test_f1_score = metrics.f1_score(y_test, y_pred, average='weighted') test_metrics = (test_accuracy, test_f1_score) mlflow.log_metric('test_accuracy' , test_accuracy) mlflow.log_metric('test_f1_score', test_f1_score) return clf, test_metrics input_data = load_iris_data()params = {'leaf_nodes': 3, 'max_depth' :2}model, test_metrics =train_predict_evaluate_dtree(input_data, params)
改動之處如下:
· 第5行:導入mlflow庫
· 第6行:此處還導入了相關的MLFlow.skLearn模塊。這完全取決於模型建立在哪個安裝包上。也可以用mlflow.tensorflow,mlflow.pytorch,mlflow.xgboost等等。
· 第7行:自動掃描是最近引入的一個實驗性能,它減少整合MLflow的麻煩。該函數自動記錄所有參數和指標,並將模型構件保存在一起,因此能夠重現運行或檢索已經訓練好的模型文件以備以後使用。
· 第18行:MLflow Tracking圍繞運行的概念,後者指的是數據科學代碼片段的運行。如果想找到輸入分類器模型的最佳參數,可以使用不同的參數創建多個運行,找出哪一個運行給出了最好的結果。因此,這一行實際上是用mlflow.start_run()函數啟動一個運行,由此將記錄的所有內容與該特定運行相關聯。
· 28–29行:autolog()當前記錄與訓練相關聯的指標,如僅記錄測試精度。然而,本例希望比較其他測試指標,例如測試精度和測試F1分數。因此,使用log_metric()函數來記錄所有自定義指標。
你可以自行決定如何多次運行或實驗。你可以選擇在需要時多次運行代碼,或者一次執行多次運行。筆者通常用想要實驗的參數創建一個小循環,並一次運行,代碼如下:
forparams indifferent_combinations_of_parameters: model,metrics =train_predict_evaluate_dtree(input_data, params)
可以用面板來跟蹤機器學習實驗吧?當然可以。到目前為止,記錄的所有內容都可以通過MLflow UI伺服器訪問。只需在終端上(從正確的目錄)運行mlflow ui,並在瀏覽器上打開http://localhost:5000/即可。
你可以比較幾個運行實例,可視化地分析參數的變化如何改變指標,甚至可以將數據下載為CSV格式文件以備需要作為報告提交。模型文件與YAML環境一起保存為構件,以後也可以利用。
你可能需要花一些時間來了解MLflow概念,以便更多地了解實驗、運行、構件、自動日誌記錄和其他性能,最終一定會掌握訣竅的。
當筆者第一次將它合成到工作流程大概花了5天時間(大部分時間是在研究和探索性能上),但現在筆者只花了幾分鐘就可以完成。筆者認為這件事再簡單不過了,它確實遵循了最佳實踐,並節省了很多時間。
本文介紹了追蹤實驗的重要性,以及如何將MLflow輕鬆地整合到工作流中,就像示例一樣專業且輕鬆地解決問題。希望它能幫到你。
留言點讚關注
我們一起分享AI學習與發展的乾貨
如轉載,請後臺留言,遵守轉載規範