Spark 交叉驗證選擇引數集

2021-09-07 18:21:25 字數 3224 閱讀 2383

spark的交叉驗證和python sklearn庫的交叉驗證不太一樣,python sklearn庫cross_validation用來交叉驗證選擇模型,然後輸出得分,而模型引數的選擇同交叉驗證是分開的模組。

而spark的org.apache.spark.ml.tuning包下的crossvalidator交叉驗證類能夠同時選擇不同的引數組合來進行交叉驗證,然後輸出最好的模型(此模型是用最好的引數組合訓練的)。

crossvalidator(estimator)fit方法進行交叉驗證會輸出crossvalidatormodel(transformer)

import org.apache.spark.ml.tuning.crossvalidator

import org.apache.spark.ml.tuning.paramgridbuilder

import org.apache.spark.ml.feature.stringindexer

import org.apache.spark.ml.feature.vectorassembler

import org.apache.spark.ml.classification.decisiontreeclassifier

import org.apache.spark.ml.evaluation.multiclassclassificationevaluator

import org.apache.spark.ml.pipeline

val dataset = spark.

table

("cons_feature_clean"

)//這裡將資料分為兩部分,train部分用來進行交叉驗證選擇最佳模型,test部分進行模型測試

//要注意,雖然交叉驗證本身也會將資料進行訓練和測試的切分,但是和此處是不同的,交叉驗證本身會將train再進行切分然後比較模型得分。

val array

(train, test)

= dataset.

randomsplit

(array

(0.8

,0.2))

val labelindexer =

newstringindexer()

.setinputcol

("vehi_type").

setoutputcol

("label").

fit(dataset)

//根據原始資料將分類列建立索引,注意是用dataset不是用train

val vectorassem =

newvectorassembler()

.setoutputcol

("features"

)val estimator =

newdecisiontreeclassifier()

//返回以下引數的所有可能組合

val params =

newparamgridbuilder()

.addgrid

(vectorassem.inputcols,

array

(array

("sum_cast"

,"run_count"

,"sum_drive_hour"

,"max_per_line_count"))

).addgrid

(estimator.impurity,

array

("entropy"))

.addgrid

(estimator.maxbins,

array

(128

,256

,512))

.addgrid

(estimator.maxdepth,

array(10

,13,20

)).addgrid

(estimator.mininfogain,

array

(0.0

,0.001))

.addgrid

(estimator.mininstancespernode,

array(5

,10,20

)).build()

val pipeline =

newpipeline()

.setstages

(array

(labelindexer, vectorassem, estimator)

)val evaluator =

newmulticlassclassificationevaluator()

.setmetricname

("accuracy"

)val cv =

newcrossvalidator()

.setevaluator

(evaluator)

.setestimator

(pipeline)

.setestimatorparammaps

(params)

.setnumfolds(2

)//進行2folds交叉驗證

val model = cv.

fit(train)

val predictedtest = model.

transform

(test)

evaluator.

evaluate

(predictedtest)

//獲取最優引數:

import org.apache.spark.ml.pipelinemodel

val pipemodel = model.bestmodel.asinstanceof[pipelinemodel]

val bestva = pipemodel.

stages(1

).asinstanceof[vectorassembler]

bestva.getinputcols // array[string] = array(sum_cast, run_count, sum_drive_hour, max_per_line_count)

pipemodel.

stages(2

).extractparammap

/*org.apache.spark.ml.param.parammap =

*/

訓練集 測試集 驗證集與交叉驗證

當我們訓練好乙個模型時,我們不只希望這個模型只在訓練集上表現的好,更重要的是希望這個模型後續能表現的好,這時候就需要測試集,用於評估這個模型的泛化能力。通常情況下,我們將資料以8 2的比例分割訓練集和測試集。在演算法模型中,我們還要使用正則化技術,避免過擬合。其中乙個做法就是使用100個不同超引數訓...

訓練集 測試集 驗證集與交叉驗證

初學者對於訓練集 train set 測試集 test set 驗證集 validation set 這三個概念和應用非常容易搞混,這裡我結合各種博文和書籍上的講解進行總結 參與訓練,模型從訓練集中學習經驗,從而不斷減小訓練誤差。這個最容易理解,一般沒什麼疑惑。不參與訓練,用於在訓練過程中檢驗模型的...

訓練集,驗證集,測試集,K折交叉驗證

有了模型後,訓練集就是用來訓練引數的,說準確點,一般是用來梯度下降的。而驗證集基本是在每個epoch完成後,用來測試一下當前模型的準確率。因為驗證集跟訓練集沒有交集,因此這個準確率是可靠的。那麼為啥還需要乙個測試集呢?這就需要區分一下模型的各種引數了。事實上,對於乙個模型來說,其引數可以分為普通引數...