Julia 機器學習 ---- 線性迴歸(Linear regression)用於各國人民的預期壽命

線性迴歸是一種基本的機器學習算法,用於基於一個或多個自變量預測數字因變量,而因變量(Y)應該是連續的。這裏將描述如何在Julia中構建線性迴歸,構建模型後如何診斷。

1、線性迴歸概述

線性迴歸是一種最基本的機器學習算法,用於基於一個或多個自變量預測因變量。因變量(Y)應該是連續的。線性迴歸找到最能描述Y變量作爲X變量(特徵)函數的數學方程。方程一旦形成,就可以用來預測只有X已知時Y的值。 這一數學方程可概括如下:

𝑌=𝛽1+𝛽2𝑋+𝜖

其中,𝛽1爲截距,𝛽2爲斜率。如果只有一個X變量,則稱爲“簡單線性迴歸”。如果涉及多個預測因子(X),則稱爲“多元線性迴歸”。不管怎樣,它們的構建過程基本是相同。 𝛽i 稱爲迴歸係數,𝜖爲誤差項 且是  迴歸模型最不好解釋的部分。

2、數據準備

這將使用預期壽命的數據來做迴歸分析。目標是根據不同的特徵和人口統計數據預測各國人民的預期壽命。

數據集下載地址:預期壽命數據

using DataFrames
using CSV
using Plots
using Lathe
using GLM
using Statistics
using StatsPlots
using MLBase
ENV["COLUMNS"] = 1000

df = DataFrame(CSV.File("D:/Life-Expectancy-Data.csv"))

3、數據探索

在建模之前,首先要分析下數據,看下數據的矩陣大小,檢查下是否有missing 值或者異常值。

3.1簡單的數據清洗

去掉missing值,如果是線性迴歸,使用中值或者均值替代missing,會影響分析結果。

#數據框的規格檢查
println(size(df))
#(2938, 22)

#規範化列名,很多列名會帶有空格或者其他特殊字符
colnames = Symbol[]
for i in string.(names(df))
    push!(colnames,Symbol(replace(replace(replace(strip(i)," " => "_"),"-" => "_"), "/" => "_")))
end
rename!(df, colnames);

#數據概要統計分析,比如mean,min,max,median,
#當然還有幾個非常重要的信息 ,nunique:w唯一值統計數,nmissing,missing值統計數
ds = describe(df)
names(df)
gd = groupby(df, [:Life_expectancy,],sort= false,skipmissing=true)
fh = DataFrame(gd)
# dropmissing!(fh)

 

數據概要分析

│ Row │ variable                        │ mean      │ min         │ median    │ max        │ nunique │ nmissing │ eltype                  │
│     │ Symbol                          │ Union…    │ Any         │ Union…    │ Any        │ Union…  │ Union…   │ Type                    │
├─────┼─────────────────────────────────┼───────────┼─────────────┼───────────┼────────────┼─────────┼──────────┼─────────────────────────┤
│ 1   │ Country                         │           │ Afghanistan │           │ Zimbabwe   │ 183     │          │ String                  │
│ 2   │ Year                            │ 2007.52   │ 2000        │ 2008.0    │ 2015       │         │          │ Int64                   │
│ 3   │ Status                          │           │ Developed   │           │ Developing │ 2       │          │ String                  │
│ 4   │ Life_expectancy                 │ 69.319    │ 44.3        │ 72.1      │ 89.0       │         │ 0        │ Union{Missing, Float64} │
│ 5   │ Adult_Mortality                 │ 163.921   │ 1           │ 144.0     │ 723        │         │ 0        │ Union{Missing, Int64}   │
│ 6   │ infant_deaths                   │ 30.3879   │ 0           │ 3.0       │ 1800       │         │          │ Int64                   │
│ 7   │ Alcohol                         │ 4.62009   │ 0.01        │ 3.77      │ 17.87      │         │ 193      │ Union{Missing, Float64} │
│ 8   │ percentage_expenditure          │ 742.76    │ 0.0         │ 66.5539   │ 19479.9    │         │          │ Float64                 │
│ 9   │ Hepatitis_B                     │ 80.968    │ 1           │ 92.0      │ 99         │         │ 544      │ Union{Missing, Int64}   │
│ 10  │ Measles                         │ 2423.73   │ 0           │ 17.0      │ 212183     │         │          │ Int64                   │
│ 11  │ BMI                             │ 38.3002   │ 1.0         │ 43.5      │ 77.6       │         │ 32       │ Union{Missing, Float64} │
│ 12  │ under_five_deaths               │ 42.1162   │ 0           │ 4.0       │ 2500       │         │          │ Int64                   │
│ 13  │ Polio                           │ 82.6002   │ 3           │ 93.0      │ 99         │         │ 19       │ Union{Missing, Int64}   │
│ 14  │ Total_expenditure               │ 5.91715   │ 0.37        │ 5.73      │ 17.6       │         │ 226      │ Union{Missing, Float64} │
│ 15  │ Diphtheria                      │ 82.4039   │ 2           │ 93.0      │ 99         │         │ 19       │ Union{Missing, Int64}   │
│ 16  │ HIV_AIDS                        │ 1.71779   │ 0.1         │ 0.1       │ 50.6       │         │          │ Float64                 │
│ 17  │ GDP                             │ 7523.47   │ 1.68135     │ 1779.5    │ 119173.0   │         │ 443      │ Union{Missing, Float64} │
│ 18  │ Population                      │ 1.27937e7 │ 34.0        │ 1.37887e6 │ 1.29386e9  │         │ 644      │ Union{Missing, Float64} │
│ 19  │ thinness__1_19_years            │ 4.84456   │ 0.1         │ 3.3       │ 27.7       │         │ 32       │ Union{Missing, Float64} │
│ 20  │ thinness_5_9_years              │ 4.8755    │ 0.1         │ 3.3       │ 28.6       │         │ 32       │ Union{Missing, Float64} │
│ 21  │ Income_composition_of_resources │ 0.628373  │ 0.0         │ 0.678     │ 0.948      │         │ 160      │ Union{Missing, Float64} │
│ 22  │ Schooling                       │ 12.012    │ 0.0         │ 12.4      │ 20.7       │         │ 160      │ Union{Missing, Float64} │

 

3.2 圖形分析數據

3.2.1 盒形圖的離羣點分析,需要根據四分位距去掉部分數據點。

想來看下概念解析:

四分位距(interquartile range, IQR),又稱四分差,四分位距通常是用來構建箱形圖,以及對概率分佈的簡要圖表概述。是描述統計學中的一種方法,以確定第三四分位數和第一四分位數的區別。與方差、標準差一樣,表示統計資料中各變量分散情形,但四分差更多爲一種穩健統計(robust statistic)。

分位數是將總體的全部數據按大小順序排列後,處於各等分位置的變量值。如果將全部數據分成相等的兩部分,它就是中位數;如果分成四等分,就是四分位數;八等分就是八分位數等。四分位數也稱爲四分位點,它是將全部數據分成相等的四部分,其中每部分包括25%的數據,處在各分位點的數值就是四分位數。四分位數有三個,第一個四分位數就是通常所說的四分位數,稱爲下四分位數,第二個四分位數就是中位數,第三個四分位數稱爲上四分位數,分別用Q1、Q2、Q3表示 [2] 

第一四分位數 (Q1),又稱“較小四分位數”,等於該樣本中所有數值由小到大排列後第25%的數字。

第二四分位數 (Q2),又稱“中位數”,等於該樣本中所有數值由小到大排列後第50%的數字。

第三四分位數 (Q3),又稱“較大四分位數”,等於該樣本中所有數值由小到大排列後第75%的數字。

第三四分位數與第一四分位數的差距又稱四分位距(InterQuartile Range,IQR)。公式:IQR = Q3 − Q1,

 

#####基於盒形圖的離羣點分析
# Box Plot
boxplot(fh.Life_expectancy, title = "Box Plot - Life Expectancy", ylabel = "Life Expectancy (years)", legend = false)

#很明顯的看到有一些 異常值,需要刪除這些數據點。
#第25百分位數又稱第一個四分位數
first_percentile = percentile(fh.Life_expectancy, 25)
#公式:IQR = Q3 − Q1,四分位距(interquartile range, IQR),又稱四分差,四分位距通常是用來構建箱形圖,以及對概率分佈的簡要圖表概述。是描述統計學中的一種方法,以確定第三四分位數和第一四分位數的區別。與方差、標準差一樣,表示統計資料中各變量分散情形,但四分差更多爲一種穩健統計(robust statistic)。
iqr_value = iqr(fh.Life_expectancy)
df = fh[fh.Life_expectancy .>  (first_percentile - 1.5*iqr_value),:];

 

3.2.2 密度圖進行分佈分析

density(df.Life_expectancy , title = "Density Plot - Life Expectancy", ylabel = "Frequency", xlabel = "Life Expectancy", legend = false)

當y變量爲正態分佈或接近正態分佈時,線性迴歸效果良好。下面是y變量的分佈,即預期壽命。分佈確實有幾個轉折點,這說明分佈是混合的。然而,總體分佈確實像正太分佈的曲線, 爲了更好的理解,繼續看下一個分析。

 

3.2.3 散點圖相關分析

當y變量與x變量線性相關時,線性迴歸效果比較好。下面有幾個概念需要先理解下,然後再看相關係數和散點圖,

VAR(方差) 、COR(相關係數)  、COV(協方差)
方差:體現的是一組數據的波動情況,值越小波動越小。詳細參閱:方差

協方差:兩種不同數據的方差,體現兩組數據的變化趨勢如何,正值變化趨勢一致,負值變化趨勢相反,0不相關。詳細參閱:協方差

相關係數:從概率論的角度,分析兩組不同數據的相關程度,取值範圍[-1,1],越接近與0越不相關,0時卻不意味着兩組數據獨立,相關係數是兩個變量之間的線性關聯的一個度量,不一定有因果關係的含義。詳細參閱:相關係數

println("Correlation of Life Expectancy with Adult Mortality Rate is ", cor(df.Adult_Mortality,df.Life_expectancy), "\n\n")
# Scatter plot
train_plot = scatter(df.Adult_Mortality,df.Life_expectancy, title = "Scatter Plot Life Expectancy vs Adult Mortality Rate", ylabel = "Life Expectancy", xlabel = "Adult Mortality Rate",legend = false)

這兩個特徵看起來是線性相關的,但仍然有一些點分佈在其他位置。在後面我們構建具有多個特性的迴歸模型時,也許其他一些特徵能解釋這種關係。

4、數據預處理

數據預處理是建模的重要步驟之一,在前面的步驟中,已經處理了部分異常數據。這裏主要針對帶有分類的列進行分析。

4.1、獨熱編碼(One Hot Encoding

獨熱編碼是將類別變量轉換爲多個數字列的過程,因爲有類別。這樣,變量就可以被輸入到ML算法中,從而更好地進行預測。對於每一個特徵,如果它有m個可能值,那麼經過獨熱編碼後,就變成了m個二元特徵(如成績這個特徵有好,中,差變成one-hot就是100, 010, 001)。數據集中存在兩個分類列需要處理。Country列有183個獨特的值,分類太多了,只能放棄。相反,對Status列進行獨熱編碼。

scaled_feature = Lathe.preprocess.OneHotEncode(df,:Status)
select!(df, Not([:Status,:Country]))
first(df,5)

4.2、按照比例分割爲“測試集”和“訓練集”

#安裝比例拆分爲“測試集”和“訓練集”
using Lathe.preprocess: TrainTestSplit
train, test = TrainTestSplit(df,.75)

5、建立模型

這裏使用GLM軟件包建立線性迴歸模型,它與R中的“GLM”包非常相似。先從單個變量開始。要使用GLM訓練線性迴歸模型,需要使用lm()函數,它接受公式對象作爲第一個參數,使用@formula創建所需的公式對象。

fm = @formula(Life_expectancy ~ Adult_Mortality)
linearRegressor = lm(fm, train)
# StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}
# 
# Life_expectancy ~ 1 + Adult_Mortality
# 
# Coefficients:
# ──────────────────────────────────────────────────────────────────────────────────
#                   Estimate  Std. Error   t value  Pr(>|t|)   Lower 95%   Upper 95%
# ──────────────────────────────────────────────────────────────────────────────────
# (Intercept)      78.1938    0.245709    318.237     <1e-99  77.7119     78.6757
# Adult_Mortality  -0.053974  0.00119445  -45.1874    <1e-99  -0.0563164  -0.0516316
# ──────────────────────────────────────────────────────────────────────────────────

6、模型診斷

 

。。。。。待續

 

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