Sparkmllib scala線性迴歸

在統計學中,線性迴歸(Linear Regression)是利用稱爲線性迴歸方程的最小平方函數對一個或多個自變量因變量之間關係進行建模的一種迴歸分析。這種函數是一個或多個稱爲迴歸係數的模型參數的線性組合。只有一個自變量的情況稱爲簡單迴歸,大於一個自變量情況的叫做多元迴歸。(這反過來又應當由多個相關的因變量預測的多元線性迴歸區別,而不是一個單一的標量變量。)

在線性迴歸中,數據使用線性預測函數來建模,並且未知的模型參數也是通過數據來估計。這些模型被叫做線性模型。最常用的線性迴歸建模是給定X值的y的條件均值是X的仿射函數。不太一般的情況,線性迴歸模型可以是一箇中位數或一些其他的給定X的條件下y的條件分佈的分位數作爲X的線性函數表示。像所有形式的迴歸分析一樣,線性迴歸也把焦點放在給定X值的y的條件概率分佈,而不是X和y的聯合概率分佈(多元分析領域)。

線性迴歸是迴歸分析中第一種經過嚴格研究並在實際應用中廣泛使用的類型。這是因爲線性依賴於其未知參數的模型比非線性依賴於其位置參數的模型更容易擬合,而且產生的估計的統計特性也更容易確定。

線性迴歸模型經常用最小二乘逼近來擬合,但他們也可能用別的方法來擬合,比如用最小化“擬合缺陷”在一些其他規範裏(比如最小絕對誤差迴歸),或者在橋迴歸中最小化最小二乘損失函數的懲罰.相反,最小二乘逼近可以用來擬合那些非線性的模型.因此,儘管“最小二乘法”和“線性模型”是緊密相連的,但他們是不能劃等號的。

 

數據源準備:

position;square;price;direction;type;name;
0;190;20000;0;4室2廳2衛;中信城(別墅);
0;190;20000;0;4室2廳2衛;中信城(別墅);
5;400;15000;0;4室3廳3衛;融創上城;
0;500;15000;0;5室3廳2衛;中海萊茵東郡;
5;500;15000;0;5室3廳4衛;融創上城(別墅);
1;320;15000;1;1室1廳1衛;長江花園;
0;143;12000;0;3室2廳2衛;融創上城;
0;200;10000;0;4室3廳2衛;中海萊茵東郡(別墅);
0;207;9000;0;4室3廳4衛;中海萊茵東郡;
0;130;8500;0;3室2廳2衛;偉峯東第;
5;150;7000;0;3室2廳2衛;融創上城;
2;178;6000;0;4室2廳2衛;鴻城國際花園;
5;190;6000;0;3室2廳2衛;亞泰豪苑C棟;
1;150;6000;0;5室1廳2衛;通安新居A區;
2;165;6000;0;3室2廳2衛;萬科惠斯勒小鎮;
0;64;5500;0;1室1廳1衛;保利中央公園;
2;105;5500;0;2室2廳1衛;虹館;
1;160;5300;0;3室2廳1衛;昊源高格藍灣;
2;170;5100;0;4室2廳2衛;亞泰鼎盛國際;
0;155;5000;0;3室2廳2衛;中海水岸馨都;
5;128;5000;0;4室2廳1衛;長影世紀村;
0;145;4500;0;3室2廳2衛;富奧臨河灣;
2;92;4200;0;3室2廳1衛;御翠豪庭尚府一期;
0;75;4100;0;1室1廳1衛;恆大雅苑;
5;105;4000;0;2室1廳1衛;南湖名家;
2;93;4000;0;3室2廳1衛;御翠豪庭尚府一期;
5;121;4000;0;3室1廳1衛;萬達廣場;
0;104;4000;0;2室1廳1衛;棠棣;
1;135;4000;0;3室2廳2衛;萬科藍山;
5;98;4000;0;2室2廳1衛;華億紅府;
0;128;3800;0;3室2廳1衛;復地哥德堡森林;
2;154;3700;0;3室2廳2衛;長春明珠;
0;100;3700;0;2室2廳1衛;翡翠花溪;
4;66;3700;0;1室1廳1衛;長客廠南;
2;106;3600;0;2室2廳1衛;虹館;
5;132;3500;0;3室2廳1衛;大禹城邦;
1;135;3500;0;3室2廳1衛;昊源高格藍灣;
0;130;3500;0;3室2廳1衛;中海國際社區(AJ區);
2;70;3500;0;2室1廳1衛;中信御園;
0;145;3500;0;3室2廳2衛;萬盛東城;
5;132;3500;0;3室2廳2衛;大禹城邦;
5;100;3300;0;2室2廳1衛;國信南湖公館;
5;75;3200;0;1室1廳1衛;南湖祥水灣;
0;120;3200;0;3室3廳2衛;復地哥德堡森林;
2;95;3200;0;3室2廳1衛;萬科金域長春;
0;106;3200;0;2室2廳1衛;富騰天下城;
5;118;3200;0;3室2廳2衛;融創上城(別墅);
1;130;3200;0;3室2廳1衛;萬龍名城;
0;137;3200;0;3室2廳2衛;中海國際社區(AJ區);

Demo:


import org.apache.spark.SparkConf
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.regression.LinearRegression
import org.apache.spark.sql.SparkSession


/**
 * 線性迴歸
 */
object linner {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setMaster("local[*]").setAppName("linner")
    val spark = SparkSession.builder().config(conf).getOrCreate()
    val file = spark.read.format("csv").option("sep", ";").option("header", "true").load("house.csv")
    import spark.implicits._

    //生成隨機數
    val random = new util.Random()
    val data = file.select("square", "price").map(rows => (rows.getAs[String](0).toDouble, rows.getString(1)
      .toDouble, random.nextDouble())).toDF("square", "price", "random")
      .sort("random")

    //類似封裝成 數組
    val assembler = new VectorAssembler()
      .setInputCols(Array("square"))
      .setOutputCol("features")
    val frame = assembler.transform(data)

    //把數據集拆分2個部分
    val Array(train, test) = frame.randomSplit(Array(0.8, 0.2), 1L)

    //創建線性迴歸的示例
    val regression = new LinearRegression()
      .setMaxIter(10) //訓練輪次
      .setRegParam(0.3) //正則化
      .setElasticNetParam(0.8) //推薦值

    //Features 特徵向量     label 標籤
    val model = regression.setLabelCol("price").setFeaturesCol("features").fit(train)

    model.transform(test).count()
    model.transform(test).show(50, truncate = true)

    /**
     * fit   做訓練
     * transform   做預測
     */
    spark.stop()
  }
}

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章