spark 模型選擇與超參調優
機器學習可以簡單的歸納為 通過數據訓練
y = f(x)
的過程,因此定義完訓練模型之后,就需要考慮如何選擇最終我們認為最優的模型。
如何選擇最優的模型,就是本篇的主要內容:
- 模型驗證的方法
- 超參數的選擇
- 評估函數的選擇
模型驗證的方法
在《統計學習方法》這本書中,曾經講過模型驗證的方法有三種,分別是簡單的交叉驗證
,S折交叉驗證
,留一交叉驗證
簡單的交叉驗證
即把全部數據按照比例分割成兩部分,分別是訓練集和測試集。在訓練集訓練模型,在測試集測試效果,最終選擇一個代價比較小的結果。一般是0.75。
S折交叉驗證
設置S為一個數,一般是3或者10居多。如果是3,那么前2份作為訓練集,最后一份作為測試集。
留一交叉驗證
如果S的個數正好是樣本的容量,就是留一交叉驗證。
PS:
訓練集是用於訓練模型,測試集適用於判斷此次訓練效果。
在Spark MLLib中,為我們提供了兩種驗證方法,分別是
Cross-Validation
: S折交叉驗證Train-ValidationSplit
:簡單交叉驗證
超參數的選擇
在Spark MLLib中,超參數可以通過上面的驗證方法,作為參數傳進去:
// 定義超參數集合
val paramGrid = new ParamGridBuilder()
.addGrid(hashingTF.numFeatures, Array(10, 100, 1000))
.addGrid(lr.regParam, Array(0.1, 0.01))
.build()
// 定義驗證器
val cv = new CrossValidator()
.setEstimator(pipeline)
.setEvaluator(new BinaryClassificationEvaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(2) // Use 3+ in practice
其中hashingTF給設置了3個參數、lr給了2個參數,如果正常我們想要驗證這6個參數的組合,應該需要驗證6次。但是在Spark中,基於Validator可以一次性驗證出來,並自動選擇最后代價最小的那個。
PS
上面S折交叉驗證中S的參數為2,因此內部只有一個訓練集;如果是3,那么最終運行的訓練次數將會是 (3*2)*2 = 12
次。
評估函數的確定
Spark提供了三種評估函數:
RegressionEvaluator
用於回歸預測的問題BinaryClassificationEvaluator
用於二分類問題MulticlassClassificationEvaluator
用於多分類問題
詳細的代碼,可以參考:
http://spark.apache.org/docs/latest/ml-tuning.html