轉載請標明出處http://www.cnblogs.com/haozhengfei/p/24cb3f38b55e5d7516d8059f9f105eb6.html
保序回歸
1.線性回歸VS保序回歸
• 線性回歸->線性擬合
• 保序回歸->保序的分段線性擬合,保序回歸是擬合原始數據最佳的單調函數
1.1保序回歸

保序回歸是特殊的線性回歸,如果業務上具有單調性,這時候就可以用保序回歸,而不是用線性回歸。
1.2保序回歸應用場景
葯劑和中毒的預測,劑量和毒性呈非遞減函數
1.3保序回歸模型使用
• 預測規則:
– 如果預測輸入能准確匹配訓練特征,那么返回相關預測,如果有多個
預測匹配訓練特征,那么就返回其中之一。
– 如果預測輸入比所有的訓練特征低或者高,那么最低和最高的訓練特
征各自返回。如果有多個預測比所有的訓練特征低或者高,那么都會
返回。
– 如果預測輸入介於兩個訓練特征,那么預測會被視為分段線性函數和
從最接近的訓練特征中計算得到的插值。
1.4保序回歸code
IsotonicRegression_new


1 import org.apache.log4j.{Level, Logger} 2 import org.apache.spark.rdd.RDD 3 import org.apache.spark.{SparkConf, SparkContext} 4 import org.apache.spark.mllib.regression.{IsotonicRegressionModel, IsotonicRegression} 5 6 /** 7 * Created by hzf 8 */ 9 object IsotonicRegression_new { 10 // F:\額外項目\pensionRisk\data\IsR\train\sample_isotonic_regression_data.txt F:\額外項目\pensionRisk\data\IsR\model true local 11 def main(args: Array[String]) { 12 Logger.getLogger("org.apache.spark").setLevel(Level.ERROR) 13 if (args.length < 4) { 14 System.err.println("Usage: LRwithLGD <inputPath> <modelPath> Isotonic <master> [<AppName>]") 15 System.err.println("eg: hdfs://192.168.57.104:8020/user/000000_0 hdfs://192.168.57.104:8020/user/model true spark://192.168.57.104:7077 IsotonicRegression") 16 System.exit(1) 17 } 18 val appName = if (args.length > 4) args(4) else "IsotonicRegression" 19 val conf = new SparkConf().setAppName(appName).setMaster(args(3)) 20 val sc = new SparkContext(conf) 21 var isotonic = true 22 isotonic = args(2) match { 23 case "true" => true 24 case "false" => false 25 } 26 val data = sc.textFile(args(0)) 27 val parsedData: RDD[(Double, Double, Double)] = data.map { line => 28 val parts = line.split(',').map(_.toDouble) 29 (parts(0), parts(1), 1.0) 30 } 31 32 val splitRdd: Array[RDD[(Double, Double, Double)]] = parsedData.randomSplit(Array(1.0, 9.0)) 33 val testData = splitRdd(0) 34 val realTrainData: RDD[(Double, Double, Double)] = splitRdd(1) 35 36 val model: IsotonicRegressionModel = new IsotonicRegression().setIsotonic(isotonic).run(realTrainData) 37 val predictionAndLabel = testData.map { point => 38 val predictedLabel = model.predict(point._2) 39 (predictedLabel, point._1) 40 } 41 42 val meanSquaredError = predictionAndLabel.map { case p => math.pow((p._1 - p._2), 2) }.mean() 43 println("meanSquaredError = " + meanSquaredError) 44 model.boundaries.zip(model.predictions).foreach(println(_)) 45 model.save(sc, args(1)) 46 47 } 48 }
設置運行參數
E:\IDEA_Projects\mlib\data\IsR\train\sample_isotonic_regression_data.txt E:\IDEA_Projects\mlib\data\IsR\model true local
