教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

SparkMllib如何解決回歸問題?[大數(shù)據(jù)培訓]

更新時間:2019年10月10日18時29分 來源:傳智播客 瀏覽次數(shù):

一、問題引入

我們都參加過高考,據(jù)統(tǒng)計,高考的物理成績確實與數(shù)學成績有一定關系,但除此之外,還存在很多影響物理成績的因素,例如:是否喜歡物理,用在物理上的時間等。而當我們主要考慮數(shù)學成績對物理的影響時,就是要考察這兩者之間的相關關系。

現(xiàn)實生活中還有很多的相關關系,如

1.商品銷售輸入與廣告支出經(jīng)費之間的關系,銷售輸入與廣告支出有著密切的關系,但是還與商品質(zhì)量、居民收入等因素有關。

2.糧食產(chǎn)量與施肥量之間的關系。在一定范圍內(nèi),施肥量越大,糧食生產(chǎn)就越高。除此之外,糧食產(chǎn)量還受到土壤質(zhì)量、降雨量等的影響。

3.人體內(nèi)脂肪的含量與年齡之間的關系。在一定年齡段內(nèi),隨著年齡的增長,人體內(nèi)的脂肪含量會增加,但人體內(nèi)的脂肪含量還和飲食習慣,體育鍛煉有關系,可能還與先天

體質(zhì)有關系。

對于上述兩個變量之間的關系,應該說都可以根據(jù)經(jīng)驗做出相應的判斷,因為“經(jīng)驗當中有規(guī)律”,但是,不管你經(jīng)驗多么豐富,如果只憑借經(jīng)驗辦事,還是很容易出錯。因此在分析兩個變量之間的相關關系時,我們需要一些說服力的辦法。

在尋找變量之間的相關關系中,統(tǒng)計同樣發(fā)揮著非常重要的作用。因為上面提到的這種關系,并不像勻速直線運動中時間與速度的關系那樣是完全確定的,而是帶有不確定性,這就需要通過收集大量的數(shù)據(jù)(有時候通過調(diào)查、或?qū)嶒?,在對數(shù)據(jù)進行統(tǒng)計分析的基礎上,發(fā)現(xiàn)其中的規(guī)律,才能讓他們之間的關系做出判斷?!就扑]了解:大數(shù)據(jù)培訓課程

二、脂肪含量和年齡相關嗎?

兩個變量的線性相關:

如下表中描述了人體的脂肪百分比和年齡的關系圖表:

年齡脂肪含量

年齡

脂肪含量

23

9.5

27

17.8

39

21.2

41

25.9

45

27.5

49

26.3

50

28.2

53

29.6

54

30.2

56

31.4

57

30.8

58

33.5

60

35.2

61

34.6

問題:根據(jù)上述數(shù)據(jù),人體的脂肪含量與年齡之間有怎么樣的關系呢?

對問題的描述:

一般地,對于某個人來說,他的體內(nèi)脂肪不一定隨年齡增長而增加或減少,但是如果把很多個體放在一起,這時就可能表現(xiàn)出一定的規(guī)律性,各年齡對應的脂肪數(shù)據(jù)是這個年齡人群脂肪含量的樣本平均值。觀察上述表數(shù)據(jù),從大體上看,隨著年齡的增加,人體中脂肪的百分比也在增加。為了確定這一細節(jié),我們需要進行數(shù)據(jù)的分析,與以前一樣,我們可以做統(tǒng)計圖、表,通過作統(tǒng)計圖、表,可以使我們對兩個變量之間的關系有一個直觀的印象和判斷。

下面我們做一個散點圖,如圖,假設人的年齡影響體內(nèi)脂肪含量,于是,按照習慣,以x軸表示年齡,y軸表示脂肪含量,得到下圖:

SparkMllib如何解決回歸問題1

這些散分布的位置也是值得注意的,他們散布在從左上角到右下角的區(qū)域。對于兩個變量的這種相關關系,我們稱為正相關。還有一些變量,例如汽車的重量和汽車每消耗1L汽油所行駛的平均路程,是負相關,也就是汽車越重,每消耗1L汽油所行駛的平均路程就越短,這時的點如果繪制在畫布上 將會從左上角到右下角的區(qū)域內(nèi)。

接下來,需要進一步考慮的問題是,當人的年齡增加時,體內(nèi)脂肪含量到底是以什么方式增加的呢?

SparkMllib如何解決回歸問題2

從散點圖可以看出,這些點大致分布在通過散點圖中心的一條直線附近,如果散點圖中的點分布從整體上看大致是在一條直線附近,我們就稱這兩個變量之間具有線性相關關系,這條直線叫做回歸直線(regression line)。

如果能求出這條回歸直線的方程,那么我們就可以清晰的了解年齡與體內(nèi)脂肪含量的相關性,就像平均值可以作為一個變量的數(shù)據(jù)的代表一樣,這條直線可以作為兩個變量具有線性相關性的代表。

SparkMllib如何解決回歸問題3

當你拿到這樣一個任務的時候,你可能會采用測量的做法,先畫出一條直線,測量各點與它的距離,然后移動直線,到達一個使得距離的和最小的位置,測量出此時的斜率和截距,既可以得到回歸方程了。

也可能會采用平均方法,也就是在散點圖中多取幾組點,確定出幾條直線的方程,在分別求出各條直線的斜率、截距的平均數(shù),將這兩個平均數(shù)作為回歸方程的斜率和截距。


三、問題的求解

上面方法雖然有一定道理,但是總讓人感覺可靠性不強。實際上,求回歸方程的關鍵是如何用數(shù)學的方法來刻畫“從整體上,各點與此直線的距離最小”。

SparkMllib如何解決回歸問題4
SparkMllib如何解決回歸問題5

總結(jié):這種通過求解Q關系式的最小值而得到回歸直線的方法,即求回歸直線,使得樣本數(shù)據(jù)的點到它的距離的平方和最小的方法,叫做最小二乘法(Least square)。

四、Execl繪制相關圖形

Execl畫回歸擬合直線如下方法:

(1)準備數(shù)據(jù),首先繪制散點圖

(2)在散點圖基礎上點”趨勢預測”即可看到擬合的直線。


SparkMllib如何解決回歸問題6

(3)在圖示區(qū)域顯示擬合直線的方程


(3)在圖示區(qū)域顯示擬合直線的方程7


四、SparkMl代碼實戰(zhàn)

這里采用基于DataFrame的SparkMl完成實驗,并與Execl的結(jié)果進行對比分析:

代碼部分:

import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.ml.regression.{LinearRegression, LinearRegressionModel}
import org.apache.spark.sql.SparkSession
object testFat {
  def main(args: Array[String]): Unit = {
  val spark: SparkSession = SparkSession.builder().master("local[*]").appName("traintestSplitTest").getOrCreate()
    spark.sparkContext.setLogLevel("WARN")
    val data = spark.createDataFrame(Seq(
      (9.5, Vectors.dense(23)),
      (17.8, Vectors.dense(27)),
      (21.2, Vectors.dense(39)),
      (25.9, Vectors.dense(41)),
      (27.5, Vectors.dense(45)),
      (26.3, Vectors.dense(49)),
      (28.2, Vectors.dense(50)),
      (29.6, Vectors.dense(53)),
      (30.2, Vectors.dense(54)),
      (31.4, Vectors.dense(56)),
      (30.8, Vectors.dense(57)),
      (33.5, Vectors.dense(58)),
      (35.2, Vectors.dense(60)),
      (34.6, Vectors.dense(61))
    )).toDF("label", "features")
    //1-data split
    val Array(train, test): Array[Dataset[Row]] = data.randomSplit(Array(0.9, 0.1), seed = 120L)
    //2-training model
    val lr: LinearRegression = new LinearRegression()
    val lrModel: LinearRegressionModel = lr.fit(data)
    //3- Print the coefficients and intercept for linear regression
    println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")
    // 4-Summarize the model over the training set and print out some metrics
    val trainingSummary = lrModel.summary
    println(s"numIterations: ${trainingSummary.totalIterations}")
    println(s"objectiveHistory: [${trainingSummary.objectiveHistory.mkString(",")}]")
    trainingSummary.residuals.show()
    println(s"RMSE: ${trainingSummary.rootMeanSquaredError}")
    println(s"r2: ${trainingSummary.r2}")
    //    Coefficients: [0.5764772505370067] Intercept: -0.44779925795753567
    //    numIterations: 1
    //    objectiveHistory: [0.0]
    //    +---------------------------------------------+
    //    |           residuals|
    //    +--------------------------------------------+
    //    |  -3.311177504393619|
    //    |   2.682913493458356|
    //    .............................
    //    RMSE: 1.629890205389517
    //    r2: 0.9423379190667397
  }
}

這里得到的R2是回歸問題的考量標準,越接近于1效果越好,這里r2為0.94效果能夠達到預期,因此能夠證明隨著年齡的增長脂肪含量會隨著增長,在回歸問題中此類問題常稱之為一元線性回歸或簡單線性回歸,當然可以考慮更多的變量因素存在對脂肪含量的影響,這里不再一一列舉。

六、總結(jié)

通過對脂肪含量和年齡的關系問題猜想、定義、Execl繪圖分析、SparkMl建模分析得到我們猜測和數(shù)學上可證明的結(jié)論,同學們可以借助SparkMl技術解決更多的回歸問題。加油!


0 分享到:
和我們在線交談!