scala機械学習実戦(二)保険データ予測分析(コードパラメータ詳細解)


scala機械学習実戦(二)保険データ予測分析(コードパラメータ詳細解)
前言を述べる
前回のコンテンツ共有は主に保険データに基づく3種類の機械学習アルゴリズムに不要な応用フローを与えた.主にコード展示と結果対比を主とし,本稿では,コードに現れる各パラメータの意義を詳細に説明する.
  コードインスタンス(アルゴリズム適用部分のみを示し、すべてのコードを移動してください)
object ScalaLR {
  def main(args: Array[String]): Unit = {
    val ss: SparkSession = SparkSessionCreate.createSession()
    import ss.implicits._

    //    
    val numFolds = 10
    val MaxIter: Seq[Int] = Seq(1000)
    val Regparam: Seq[Double] = Seq(0.001)
    val Tol: Seq[Double] = Seq(1e-6)
    val ElasticNetParam: Seq[Double] = Seq(0.001)

    //    LR    
    val model = new LinearRegression()
      .setFeaturesCol("features")
      .setLabelCol("label")
    //    ML pipeline
    val pipeline = new Pipeline()
      .setStages((Preproessing.stringIndexerStages :+ Preproessing.assembler) :+ model)
    //        ,            ,      paramGrid       
    val paramGrid: Array[ParamMap] = new ParamGridBuilder()
      .addGrid(model.maxIter, MaxIter)
      .addGrid(model.regParam, Regparam)
      .addGrid(model.tol, Tol)
      .addGrid(model.elasticNetParam, ElasticNetParam)
      .build()
    //           ,      ,      ,       numFolds = 10

    val cv: CrossValidator = new CrossValidator()
      .setEstimator(pipeline)
      .setEvaluator(new RegressionEvaluator())
      .setEstimatorParamMaps(paramGrid)
      .setNumFolds(numFolds)
    //            ,         LR   
    val cvModel = cv.fit(Preproessing.trainData)
    //      fit   ,      predict   ,  ,           train   test         
    val trainPredictionsAndLabels: RDD[(Double, Double)] = cvModel
      .transform(Preproessing.trainData)
      .select("label", "prediction")
      .map { case Row(label: Double, prediction: Double) => (label, prediction) }.rdd
    val validPredictionsAndLabels: RDD[(Double, Double)] = cvModel
      .transform(Preproessing.validationData)
      .select("label", "prediction")
      .map { case Row(label: Double, prediction: Double) => (label, prediction) }.rdd
    val trainRegressionMetrics = new RegressionMetrics(trainPredictionsAndLabels)
    val validRegressionMetrics: RegressionMetrics = new RegressionMetrics(validPredictionsAndLabels)
    //  train   test           predict,          
    val bestModel = cvModel.bestModel.asInstanceOf[PipelineModel]
    //     train            
    val results =
      "=====================================================================================\r
" + s"Param trainSample: ${Preproessing.trainSample}\r
" + s"TrainData count : ${Preproessing.trainData.count}\r
" + s"ValidationData count : ${Preproessing.validationData.count}\r
" + s"TestData count : ${Preproessing.testData.count}\r
" + "\r
===================================================================================\r
" + s"Param maxIter = ${MaxIter.mkString(",")}\r
" + s"Param numFolds = ${numFolds}\r
" + "\r
===================================================================================\r
" + s"Train data MSE = ${trainRegressionMetrics.meanSquaredError}\r
" + s"Train data RMSE = ${trainRegressionMetrics.rootMeanSquaredError}\r
" + s"Train data R-squared = ${trainRegressionMetrics.r2}\r
" + s"Train data MEA = ${trainRegressionMetrics.meanAbsoluteError}\r
" + s"Train data Explained variance = ${trainRegressionMetrics.explainedVariance}\r
" + "\r
===================================================================================\r
" + s"Validation data MSE = ${validRegressionMetrics.meanSquaredError}\r
" + s"Validation data RMSE = ${validRegressionMetrics.rootMeanSquaredError}\r
" + s"Validation data R-squared = ${validRegressionMetrics.r2}\r
" + s"Validation data MEA = ${validRegressionMetrics.meanAbsoluteError}\r
" + s"Validation data explained variance = ${validRegressionMetrics.explainedVariance}\r
" + "\r
===================================================================================\r
" + s"CV params explained : ${cvModel.explainParams}n" + s"LR params explained : ${bestModel.stages.last.asInstanceOf[LinearRegressionModel].explainParams}n" + "\r
==================================THE END===========================================" println(results) println("Run this prediction on test set") cvModel.transform(Preproessing.testData) .select("id", "prediction") .withColumnRenamed("prediction", "loss") .coalesce(1) .write.format("com.databricks.spark.csv") .save("file:\\C:\\Users\\PC\\Desktop\\ \\Word \\ \\spark\\ \\ \\ \\output\\res_LR.csv") } }

 パラメータの詳細
  入力パラメータ
パラメータを指定するためのパラメータリストであるパラメータリストAPIは、[k,v]タイプのParamMapである. -numFolds:検証を実行する回数は、数値が大きいほど精度が高くなりますが、より多くの計算リソース -maxIter:最大反復回数 -regParam:正規化パラメータ(>=0)、doubleタイプ -tol:反復アルゴリズムの収束性 -elasticNetParam:フレックスネットワーク混合パラメータ、範囲[0,1]-FeaturesCol:フィーチャー列名-LabelCol:ラベル列名-Pipeline:pipelineは、複数のTransformerとEstimatorを接続して、1つのMLワークフロー-CrossValidator:クロス検証-Estimatorを決定します.例えば、学習アルゴリズムはEstimatorであり、DFの訓練とモデルの生成を担当する.Evaluator:モデル評価器、モデルのテストデータ上の最終的なあなたと程度を測定し、評価結果を与える.
  出力パラメータ
出力内容
=====================================================================================
Param trainSample: 1.0
TrainData count : 140977
ValidationData count : 47341
TestData count : 125546

===================================================================================
Param maxIter = 1000
Param numFolds = 10

===================================================================================
Train data MSE = 4523266.93398241
Train data RMSE = 2126.797342010378
Train data R-squared = -0.16181596223081596
Train data MEA = 1358.4888709703798
Train data Explained variance = 8415946.47720863

===================================================================================
Validation data MSE = 4651416.497204879
Validation data RMSE = 2156.714282700627
Validation data R-squared = -0.19498670604587942
Validation data MEA = 1358.6436775990019
Validation data explained variance = 8486835.155155173

===================================================================================
CV params explained : estimator: estimator for selection (current: pipeline_c5ad4ff638f1)
estimatorParamMaps: param maps for the estimator (current: [Lorg.apache.spark.ml.param.ParamMap;@17228435)
evaluator: evaluator used to select hyper-parameters that maximize the validated metric (current: regEval_1d803bd7fa7f)
numFolds: number of folds for cross validation (>= 2) (default: 3, current: 10)
seed: random seed (default: -1191137437)nLR params explained : aggregationDepth: suggested depth for treeAggregate (>= 2) (default: 2)
elasticNetParam: the ElasticNet mixing parameter, in range [0, 1]. For alpha = 0, the penalty is an L2 penalty. For alpha = 1, it is an L1 penalty (default: 0.0, current: 0.001)
featuresCol: features column name (default: features, current: features)
fitIntercept: whether to fit an intercept term (default: true)
labelCol: label column name (default: label, current: label)
maxIter: maximum number of iterations (>= 0) (default: 100, current: 1000)
predictionCol: prediction column name (default: prediction)
regParam: regularization parameter (>= 0) (default: 0.0, current: 0.001)
solver: the solver algorithm for optimization. If this is not set or empty, default value is 'auto' (default: auto)
standardization: whether to standardize the training features before fitting the model (default: true)
tol: the convergence tolerance for iterative algorithms (>= 0) (default: 1.0E-6, current: 1.0E-6)
weightCol: weight column name. If this is not set or empty, we treat all instance weights as 1.0 (undefined)n
==================================THE END===========================================

ジルコニウム出力の重要なパラメータの解釈
平均二乗誤差-MSE:平均二乗誤差フィット線とデータ点の距離を測定します.MSEが小さいほど、フィッティングは、予測方向を考慮せずに、予測中の誤差の平均サイズのセットを測定するために、データに近い.これは,すべての個体差の重みが等しい絶対差を予測し,実際に観測した試験試料の平均値である.ジルコニウム−R^2:rの二乗は、統計的測定データがフィッティングされた回帰線にどのように近づくかである.rの二乗は常に0〜100%である.Rsquaredが大きいほど、モデルはデータに適しています.統計学では、所与のデータセットの変化に対する変差メトリック数学モデルの割合を説明します.
パラメータのまとめ
結論
    spark MLプロセスにおけるこれらのパラメータは、データセットの特徴数と自身が備えるリソース数に応じて、合理的に構成する.リソースが少ない場合は、一部のパラメータ(反復回数、検証回数など)を小さいパラメータに設定し、実行時間が長すぎる(精度の損失を代価として)ことを防止し、自身が備えている計算リソースが大きい場合は、これらのパラメータを大きくして、より正確な結果を得ることができます.同時に、1つのモデルの良し悪しを評価して、上述の出力パラメータを通じて直感的に判断することができて、これらのパラメータを通じて、あなたは自分の必要に応じて、適切なパラメータのモデルを選んであなたに使用することができます.
次の記事の内容
  後続文章はコードの中で使う3種類のアルゴリズムの原理と対比分析を紹介して、引き続き関心を持つことを歓迎して、もし問題があれば作者の微信を追加することを歓迎します:ljelzl 416108、いっしょにビッグデータと機械の学習の知識を交流します!!