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

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

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

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

一、問題引入

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

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

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

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

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

體質(zhì)有關(guān)系。

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

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

二、脂肪含量和年齡相關(guān)嗎?

兩個(gè)變量的線性相關(guān):

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

年齡脂肪含量

年齡

脂肪含量

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ù),人體的脂肪含量與年齡之間有怎么樣的關(guān)系呢?

對問題的描述:

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

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

SparkMllib如何解決回歸問題1

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

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

SparkMllib如何解決回歸問題2

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

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

SparkMllib如何解決回歸問題3

當(dāng)你拿到這樣一個(gè)任務(wù)的時(shí)候,你可能會采用測量的做法,先畫出一條直線,測量各點(diǎn)與它的距離,然后移動直線,到達(dá)一個(gè)使得距離的和最小的位置,測量出此時(shí)的斜率和截距,既可以得到回歸方程了。

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


三、問題的求解

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

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

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

四、Execl繪制相關(guān)圖形

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

(1)準(zhǔn)備數(shù)據(jù),首先繪制散點(diǎn)圖

(2)在散點(diǎn)圖基礎(chǔ)上點(diǎn)”趨勢預(yù)測”即可看到擬合的直線。


SparkMllib如何解決回歸問題6

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


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


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

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

代碼部分:

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是回歸問題的考量標(biāo)準(zhǔn),越接近于1效果越好,這里r2為0.94效果能夠達(dá)到預(yù)期,因此能夠證明隨著年齡的增長脂肪含量會隨著增長,在回歸問題中此類問題常稱之為一元線性回歸或簡單線性回歸,當(dāng)然可以考慮更多的變量因素存在對脂肪含量的影響,這里不再一一列舉。

六、總結(jié)

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


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