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完成後,用來測試一下當前模型的準確率。因為驗證集跟訓練集沒有交集,因此這個準確率是可靠的。那麼為啥還需要乙個測試集呢?這就需要區分一下模型的各種引數了。事實上,對於乙個模型來說,其引數可以分為普通引數...