我運行一個三倍交叉驗證的ML管道利用“GBTClassifier”的最後一步。運行需要18個小時和我在尋找反饋到如何提高性能,因為我希望這個更快。
上下文是集群配置:
{"自動定量":{“min_workers”: 1、“max_workers”: 4},“cluster_name”:“model_training”、“spark_version”:“10.3.x-cpu-ml-scala2.12”、“spark_conf”: {spark.databricks.io.cache“spark.conf.set (\”。啟用\”,“:“\”真正的\“)”,"spark.databricks.delta.preview.enabled": "true" }, "azure_attributes": { "first_on_demand": 1, "availability": "ON_DEMAND_AZURE", "spot_bid_max_price": -1 }, "node_type_id": "Standard_E8_v3", "driver_node_type_id": "Standard_E8_v3", "ssh_public_keys": [], "custom_tags": {}, "spark_env_vars": {}, "autotermination_minutes": 60, "enable_elastic_disk": true, "cluster_source": "UI", "init_scripts": [], "cluster_id": "0224-222219-94q7zutd" }
下麵定義了管道:
#定義功能組裝彙編= VectorAssembler (inputCols = feature_layers outputCol =“組裝”,handleInvalid =“保持”)#定義多項式的擴張特性px = PolynomialExpansion (= 3, inputCol =“組裝”,outputCol =“擴大”)#定義標準定標器standardScaler = standardScaler (withMean = True, withStd = True, inputCol =“擴大”,outputCol =“特性”)# Define梯度增加樹分類器gbt = GBTClassifier (stepSize = 0.3,麥克斯特= 50)= # Define管道管道管道(階段=[彙編,px, standardScaler gbt])
參數網格包含的maxDepth的3參數值。交叉驗證器使用3折疊和並行性。
paramGrid = (ParamGridBuilder ()。addGrid (gbt。maxDepth, [7、10、15])。build ()) crossval = CrossValidator(估計量=管道,estimatorParamMaps = paramGrid,評估者= BinaryClassificationEvaluator (metricName = ' areaUnderPR '), numFolds = 3, collectSubModels = False,並行性= 3)gbt_pipe = crossval.fit(火車)
火車從一個數據集,重新分區成500個分區,然後“緩存”:
df = df.na.drop () .repartition (500) df.cache () df_label = df \ .withColumn(“標簽”,F。當(df (“threshold_runoff”) < runoff_amount, 1) .otherwise (0)) .drop (threshold_runoff)火車、測試= df_label.randomSplit ([0.95, 0.05])
這是其中一個的屏幕截圖的工作:
工作總結:
上半部分的存儲選項卡:
你會如何診斷這個問題呢?性能改進的任何建議嗎?
我試著增加和減少分區的數量但不同算法(邏輯回歸)和500個分區相同數據集似乎工作得很好。我欣賞你的輸入!
你好@Assaad Mrad,
這看起來像試圖決定將管道之間的交叉驗證器或管道中的交叉驗證器。因為你是做多項式擴張作為管道的一部分,你可能想要考慮把簡曆的管道,因為它不需要每次改裝。
所以類似:
簡曆= CrossValidator(估計量= gbt,評估者=評估者,estimatorParamMaps = paramGrid numFolds = 3,並行性= 3,種子= 42)stagesWithCV = =(彙編,px, standardScalar cv)管道管道(階段= stagesWithCV) pipelineModel = pipeline.fit (trainDF)
最安全的方法是將管道內CV防止數據泄漏。但如果這不是一個問題然後你可以得到一些性能改進。
你好@Assaad Mrad,
這看起來像試圖決定將管道之間的交叉驗證器或管道中的交叉驗證器。因為你是做多項式擴張作為管道的一部分,你可能想要考慮把簡曆的管道,因為它不需要每次改裝。
所以類似:
簡曆= CrossValidator(估計量= gbt,評估者=評估者,estimatorParamMaps = paramGrid numFolds = 3,並行性= 3,種子= 42)stagesWithCV = =(彙編,px, standardScalar cv)管道管道(階段= stagesWithCV) pipelineModel = pipeline.fit (trainDF)
最安全的方法是將管道內CV防止數據泄漏。但如果這不是一個問題然後你可以得到一些性能改進。