使用動態時間扭曲和MLflow檢測銷售趨勢
2019年4月30日 在工程的博客
這個博客是我們由兩部分組成的係列文章的第2部分<強>使用動態時間扭曲和MLflow檢測銷售趨勢。
“動態時間扭曲,”在第一次讀,可能聯想的馬蒂McFly駕駛他的汽車以每小時88英裏的速度在《回到未來係列。唉,動態時間扭曲不涉及時間旅行;相反,它是一種技術用於動態時間序列數據進行比較的時候指數之間的比較數據點並不完全同步。
如下我們將探索,其中最突出的使用動態時間扭曲的語音識別,確定是否一個短語匹配另一個,即使這句話是快或慢於其口語的比較。你可以想象這方便識別”後“用來激活你的穀歌家裏或亞馬遜Alexa設備——即使你的說話語速很慢,因為你還沒有日常的咖啡。
動態時間扭曲是一個有用的、強大的技術,可以應用在許多不同的領域。一旦你了解動態時間扭曲的概念,很容易看到在日常生活中的應用的例子,和它的激動人心的未來的應用。考慮以下用途:
- 金融市場——比較股票交易數據類似的時間框架,即使他們並不完全匹配。例如,比較月度貿易數據(28天)2月和3月(31天)。
- 可穿戴健身追蹤器——更準確地計算沃克的速度和數量的步驟,即使他們的速度不同。
- 路徑計算——計算更準確的司機的埃塔的信息,如果我們知道一些關於他們的駕駛習慣(例如,他們開車很快馬上但花費更多的時間比平均左轉彎)。
數據科學家,數據分析師,以及任何處理時間序列數據應該熟悉這個技術,考慮到完全一致的時間序列數據可以比較,很少看到在野外完全“整潔”數據。
在這個博客係列中,我們將探討:
- 動態時間彎曲的基本原則
- 運行動態時間扭曲音頻數據樣本
- 運行動態時間扭曲示例使用MLflow銷售數據
更多背景動態時間扭曲,參考以前的文章理解動態時間扭曲。
背景
想象一下你自己的一個公司,創建3 d印刷產品。去年,你知道無人機螺旋槳顯示非常一致的需求,所以你生產和銷售這些,前年你出售手機的情況。新年很快到達,你坐下來與製造團隊找出你的公司應該為明年生產。購買的3 d打印機倉庫讓你陷入債務之中,所以你必須確保你的打印機運行達到或接近100%的容量,為了使支付。
因為你是一個聰明的CEO,你知道你的生產能力在未來一年將漲落——將會有幾個星期當你的生產能力比其他人高。例如,你的能力可能是夏季高(當你雇傭季節性工人),和更低的在每個月的第三周(因為與3 d打印機燈絲供應鏈問題)。看看下麵的圖表看到貴公司的生產能力評估:
你的工作是選擇一個產品,每周要求盡可能滿足您的生產能力。你還在尋找一個目錄的產品,包括去年的銷售數據為每一個產品,你認為今年的銷量將是相似的。
如果你選擇的產品每周要求超過你的生產能力,那麼你將不得不取消客戶訂單,這並不是對企業有利。另一方麵,如果你選擇一個產品沒有足夠的每周需求,你不能把你的打印機滿負荷運轉,可能無法支付債務。
動態時間扭曲進場,因為有時你選擇的產品供給和需求將略不同步。會有幾個星期,當你沒有足夠的能力滿足你所有的需求,但隻要你很近,你可以彌補它通過生產更多的產品在兩個星期之前或之後,客戶不會介意的。beplay体育app下载地址如果我們限製自己比較使用歐幾裏德匹配銷售數據與我們的生產能力,我們可以選擇不占這個產品,,把錢放在桌子上。相反,我們將使用動態時間扭曲選擇適合貴公司的產品。
加載產品銷售數據集
我們將使用每周銷售事務數據集中發現的UCI數據集的存儲庫執行我們的sales-based時間序列分析。(源歸因:詹姆斯·譚jamestansc suss.edu.sg“@”,新加坡大學社會科學)
進口熊貓作為pd#使用熊貓來讀取這個數據sales_pdf = pd。read_csv (sales_dbfspath頭=“推斷”)#檢查數據顯示器(spark.createDataFrame (sales_pdf))
每個產品由行,每周由一列表示。值代表的數量單位每周每個產品出售。有811個產品的數據集。
通過產品代碼計算距離最優時間序列
#計算距離通過動態時間扭曲產品代碼和最佳時間序列之間的關係進口numpy作為np進口_ucrdtwdefget_keyed_values(年代):返回(s (0,年代1:])defcompute_distance(行):返回(行0),_ucrdtw.ucrdtw (列表(行1][0:52]),列表(optimal_pattern),0.05,真正的)[1])ts_values = pd.DataFrame (np.apply_along_axis (get_keyed_values1,sales_pdf.values))距離= pd.DataFrame (np.apply_along_axis (compute_distance,1,ts_values.values))距離。列= [“pcode”,“dtw_dist”]
使用計算動態時間扭曲“距離”專欄中,我們可以把DTW距離的分布直方圖。
從那裏,我們可以找出最接近最優產品代碼(即銷售趨勢。,那些最小的DTW距離計算)。因為我們使用磚,我們可以很容易地選擇使用一個SQL查詢。讓我們顯示那些親密。
%sql——十大產品代碼最接近最優的銷售趨勢選擇pcode,投(dtw_dist作為浮動)作為dtw_dist從距離訂單通過投(dtw_dist作為浮動)限製10
運行該查詢後,連同相應的查詢的產品代碼最遠的從最佳的銷售趨勢,我們能夠識別2產品最近和最遠的趨勢。情節讓我們這兩個產品,看看他們是如何不同。
正如您可以看到的,產品# 675(如圖所示橙色三角形)代表了最佳匹配最佳的銷售趨勢,盡管絕對每周銷售低於我們希望(稍後我們會解決)。這個結果是有意義的,因為我們希望產品DTW距離最接近高峰和低穀,有些鏡子我們比較的指標。(當然,確切的時間指數產品會在日複一日的基礎上變化由於動態時間扭曲)。相反,產品# 716(如圖所示綠色明星)是最差的產品匹配,顯示幾乎沒有變化。
尋找最優產品:小型DTW距離和相似絕對銷售數字
現在我們已經開發了一係列的產品離我們工廠的預計產量(我們的“最優銷售趨勢”),我們可以過濾到那些小DTW距離,以及類似的絕對的銷售數字。一個好的候選人將產品# 202,DTW距離6.86與人口平均距離為7.89,密切跟蹤我們的最優的趨勢。
#審查P202每周銷售y_p202 = sales_pdf [sales_pdf [“Product_Code”)= =“P202”). values (0][1:53]
使用MLflow追蹤最好和最差的產品,隨著工件
MLflow機器學習是一個開源的平台管理生命周期Beplay体育安卓版本,包括試驗、重現性和部署。磚筆記本電腦提供一個完全集成MLflow環境,允許您創建實驗,記錄參數和指標,並保存結果。關於開始使用MLflow的更多信息,看一下好文檔。
MLflow的設計是圍繞日誌的所有輸入和輸出我們所做的每個實驗係統,可再生的方法。每通過數據,稱為“,”我們可以記錄我們的實驗:
- 參數——輸入到我們的模型。
- 指標——我們的模型的輸出,或者我們的模型成功的措施。
- 工件——我們的模型創建的任何文件——例如,PNG情節或CSV數據輸出。
- 模型模型本身,我們可以稍後重新加載和使用預測。
在我們的例子中,我們可以使用它來運行的動態時間規整算法好幾次我們的數據而改變”因素,“最大的變形量可以應用於時間序列數據。發起一個MLflow實驗,允許簡單的日誌使用mlflow.log_param ()
,mlflow.log_metric ()
,mlflow.log_artifact ()
,mlflow.log_model ()
,我們將主要功能使用:
與mlflow.start_run ()作為運行:…
如以下縮寫代碼所示。
進口mlflowdefrun_DTW(ts_stretch_factor):#計算DTW距離和z分數為每個產品<強>與mlflow.start_run ()作為運行:< /強>#日誌模型使用自定義的味道dtw_model = {“stretch_factor”:浮動(ts_stretch_factor),“模式”:optimal_pattern}<強> mlflow_custom_flavor。log_model (dtw_model artifact_path =“模型”)< / >#日誌MLflow伸展因子參數<強> mlflow.log_param (“stretch_factor”ts_stretch_factor) < /強>#日誌中位數DTW距離運行<強> mlflow.log_metric (“中間的距離”distance_median) < /強>#日誌構件- CSV文件和PNG情節——MLflow<強> mlflow.log_artifact (“zscore_outliers_”+str(ts_stretch_factor) +. csv”)mlflow.log_artifact (“DTW_dist_histogram.png”)返回run.info < /強>stretch_factors_to_test = [0.0,0.01,0.025,0.05,0.1,0.25,0.5]為n在stretch_factors_to_test:run_DTW (n)
每次運行通過的數據,我們已經創建了一個日誌“伸展因子”參數的使用,和日誌我們的產品歸類為離群值基於DTW距離度量的z分數。我們甚至能夠拯救一個工件(文件)的直方圖DTW距離。這些實驗仍保存在本地數據磚,可以在未來如果你決定把實驗的結果在稍後的日期。
既然MLflow已經拯救了每個實驗的記錄,我們可以通過並檢查結果。從你的磚筆記本,選擇圖標在右上角查看和比較每個運行的結果。
https://www.youtube.com/watch?v=62PAPZo-2ZU
毫不奇怪,當我們增加我們的距離度量”延伸的因素,“我們減少。直觀地說,這是有道理的:當我們給扭曲算法更靈活的時間指標向前或向後,它會找到一個更適合的數據。從本質上講,我們已經交易的一些偏差為方差。
測井模型MLflow
MLflow不僅有能力記錄實驗參數、指標、和工件(比如情節或CSV文件),而且還記錄機器學習模型。MLflow模型隻是一個文件夾結構符合一致的API,確保與其他MLflow工具和特性的兼容性。這種互操作性非常強大,允許任何Python模型能夠快速部署到許多不同類型的生產環境。
MLflow預置了一些常見模型的“口味”對許多最受歡迎的機器學習庫,包括scikit-learn火花MLlib、PyTorch TensorFlow等等。這些模型口味可以輕鬆地記錄並重新加載模型最初建立後,作為證明博客。例如,當使用MLflow scikit-learn,測井模型一樣容易運行下麵的代碼在一個實驗:
mlflow.sklearn。log_model(模型= sk_model artifact_path =“sk_model_path”)
MLflow還提供了“Python函數”的味道,它允許您保存任何模型從一個第三方庫(如XGBoost或寬大的),甚至一個簡單的Python函數本身,作為一個MLflow模型。模型使用Python函數創建的味道生活在相同的生態係統,並能與其他MLflow工具通過推理API進行交互。雖然是不可能的計劃對於每個用例,味道Python函數模型設計成盡可能通用和靈活。它允許自定義處理和邏輯評估,這對ETL程序可以派上用場。即使更多的口味上線“官方”模型,通用的Python函數的味道仍將作為一個重要的“抓住,”提供任何形式的Python代碼之間的一座橋梁和MLflow強勁的跟蹤工具。
日誌使用Python函數模型味道是一個簡單的過程。任何模型或函數可以被保存為一個模型,有一個要求:必須接受熊貓Dataframe作為輸入,並返回一個DataFrame或NumPy數組。一旦需求滿足,拯救你的函數作為一個MLflow模型包括定義一個Python類,繼承自PythonModel,和覆蓋.predict ()
方法與定製函數,如描述在這裏。
從我們的一個運行加載記錄模型
既然我們已經通過我們的數據和幾個不同的因素,自然的下一步是檢查我們的結果,尋找一個模型,根據指標的表現尤其出色,我們記錄。MLflow便於重載登錄模型,並使用它對新數據進行預測,使用以下指令:
- 點擊的鏈接你想運行負荷模型。
- 複製運行ID。
- 值得注意的文件夾的名稱存儲在模型。在我們的例子中,它隻是叫“模型”。
- 輸入文件夾名稱和運行ID模型如下所示:
進口custom_flavor作為mlflow_custom_flavorloaded_model = mlflow_custom_flavor.load_model (artifact_path =“模型”run_id =“e26961b25c4d4402a9a5a7a679fc8052”)
按照預定的計劃表明,我們的模型,我們現在可以加載模型,用它來衡量DTW距離內的兩個新產品,我們已經創建了變量new_sales_units
:
#使用模型來評估新產品中發現“new_sales_units”輸出= loaded_model.predict (new_sales_units)打印(輸出)
下一個步驟
正如你所看到的,我們的MLflow模型預測新輕鬆和看不見的價值。因為它符合推理API,我們可以部署在任何服務平台(如我們的模型Beplay体育安卓版本微軟Azure毫升,或亞馬遜Sagemaker),部署它當地的REST API端點,或創建一個用戶定義函數(UDF)這可以很容易地用於Spark-SQL。最後,我們演示了如何使用動態時間扭曲使用磚預測銷售趨勢統一的分析平台。Beplay体育安卓版本嚐試的使用動態時間扭曲和MLflow預測銷售趨勢筆記本磚運行時機器學習今天。