迴歸模型2018-01-25

weixin_34185560發表於2018-01-30

Linear regression 線性迴歸

Machine Learning

  • Supervised 監督學習(有標籤)
  • UnSupervised 無監督學習 (沒有標籤)
  • reinforcement learning(與環境互動,不斷嘗試)

個人理解,現行迴歸就像是初中的數學題,給你幾組資料,求出先行迴歸方程,然後再帶入一個X求出相應的Y。有時候我們還會遇到這樣的題,就是在座標系上給你幾個點,老師讓我們劃出一條線,要求儘可能多得點落在這條線上,或者是要求這些點均勻的分佈在這條線的兩側,這條線就是你人工預測的迴歸模型。只不過我們現在需要運用一些數學方法,更精確的求出這條線,這只是一種預測方法,儘管預測結果會差強人意但是這個你入門的一個很好的突破口。

配置環境

Siraj 將在下節視訊中使用 Python 程式碼實現線性迴歸模型。如需在本機跟隨練習,可先使用下列命令配置新的 conda 環境:

  • 選擇 Python 2 版本
    • >> conda create -n siraj-regression python=2
  • 安裝 pandas, matplotlib, scikit-learn
    • >> conda install pandas matplotlib scikit-learn

參考資源

你或許不一定熟悉 Siraj 視訊中使用到的第三方庫:pandas、scikit-learn 和 matplotlib。如有興趣,可利用以下資源進行預習:

簡單線性迴歸

上面我們介紹瞭如何使用 線性迴歸模型 根據動物的大腦重量來預測對應體重。在下面練習中,將構建線性迴歸模型,根據各國男性人口的 身體質量指數 (BMI) 來預測該國人口平均壽命。在此之前,我們先來講解如何使用所需工具。

將使用 scikit-learn 庫中的 LinearRegression 類來建立線性迴歸模型,其提供的 fit() 方法可用於擬合模型。

>>> from sklearn.linear_model import LinearRegression
>>> model = LinearRegression()
>>> model.fit(x_values, y_values)

在上述示例中,新建的線性迴歸模型被賦於 model 變數,然後根據 x_valuesy_values 資料進行了擬合。模型擬合在這裡是指通過訓練資料求取最優擬合線的步驟。然後我們使用模型的 predict() 方法進行兩組預測。

>>> print(model.predict([ [127], [248] ]))
[[ 438.94308857, 127.14839521]]

預測結果最終以陣列形式返回,每個元素對應各自的輸入陣列。第一項輸入陣列 [127] 的預測結果為 438.94308857。第二項輸入陣列 [248] 的預測結果為 127.14839521。輸入資料採取陣列形式 [127] 而非 127 的原因是, 線性迴歸模型可以接受多個特徵。多元線性迴歸模型將在課程稍後部分講解,本節練習中的模型僅使用單個特徵。

線性迴歸練習

本節練習提供的資料為各國男性人口的 BMI 與該國人口平均壽命。資料來自 Gapminder

資料檔案位於頁面下方練習中的 "bmi_and_life_expectancy.csv" 標籤。其中 "Country" 列記錄出生國家,"Life expectancy" 列記錄該國平均壽命,"BMI" 列記錄該國男性 BMI 資料。你將使用 BMI 資料來預測平均壽命。

任務步驟:

1. 載入資料

  • 資料檔名為 "bmi_and_life_expectancy.csv"。
  • 使用 pandas 中的 read_csv 函式以 DataFrame 形式載入資料。
  • 將得到的 DataFrame 賦於 bmi_life_data 變數。

2. 構建線性迴歸模型

  • 使用 scikit-learn 中的 LinearRegression 建立線性迴歸模型,並賦於 bmi_life_model 變數。
  • 根據資料擬合模型。

3. 使用模型進行預測

  • 輸入 BMI 資料值 21.07931 進行預測,並將結果賦於 laos_life_exp 變數。
  • gapminder1.py
# TODO: Add import statements
import pandas as pd
from sklearn.linear_model import LinearRegression

# Assign the dataframe to this variable.
# TODO: Load the data
bmi_life_data = pd.read_csv("bmi_and_life_expectancy.csv")

# Make and fit the linear regression model
#TODO: Fit the model and Assign it to bmi_life_model
bmi_life_model = LinearRegression()
bmi_life_model.fit(bmi_life_data[['BMI']], bmi_life_data[['Life expectancy']])

# Mak a prediction using the model
# TODO: Predict life expectancy for a BMI value of 21.07931
laos_life_exp = bmi_life_model.predict(21.07931)

  • bmi_and_life_expectancy.csv
Country,Life expectancy,BMI
Afghanistan,52.8,20.62058
Albania,76.8,26.44657
Algeria,75.5,24.5962
Andorra,84.6,27.63048
Angola,56.7,22.25083
Armenia,72.3,25.355420000000002
Australia,81.6,27.56373
Austria,80.4,26.467409999999997
Azerbaijan,69.2,25.65117
Bahamas,72.2,27.24594
Bangladesh,68.3,20.39742
Barbados,75.3,26.384390000000003
Belarus,70.0,26.16443
Belgium,79.6,26.75915
Belize,70.7,27.02255
Benin,59.7,22.41835
Bhutan,70.7,22.8218
Bolivia,71.2,24.43335
Bosnia and Herzegovina,77.5,26.611629999999998
Botswana,53.2,22.129839999999998
Brazil,73.2,25.78623
Bulgaria,73.2,26.542859999999997
Burkina Faso,58.0,21.27157
Burundi,59.1,21.50291
Cambodia,66.1,20.80496
Cameroon,56.6,23.681729999999998
Canada,80.8,27.4521
Cape Verde,70.4,23.515220000000003
Chad,54.3,21.485689999999998
Chile,78.5,27.015420000000002
China,73.4,22.92176
Colombia,76.2,24.94041
Comoros,67.1,22.06131
"Congo, Dem. Rep.",57.5,19.86692
"Congo, Rep.",58.8,21.87134
Costa Rica,79.8,26.47897
Cote d'Ivoire,55.4,22.56469
Croatia,76.2,26.596290000000003
Cuba,77.6,25.06867
Cyprus,80.0,27.41899
Denmark,78.9,26.13287
Djibouti,61.8,23.38403
Ecuador,74.7,25.58841
Egypt,70.2,26.732429999999997
El Salvador,73.7,26.36751
Eritrea,60.1,20.885089999999998
Estonia,74.2,26.264459999999996
Ethiopia,60.0,20.247
Fiji,64.9,26.53078
Finland,79.6,26.733390000000004
France,81.1,25.853289999999998
French Polynesia,75.11,30.867520000000003
Gabon,61.7,24.0762
Gambia,65.7,21.65029
Georgia,71.8,25.54942
Germany,80.0,27.165090000000003
Ghana,62.0,22.842470000000002
Greece,80.2,26.33786
Greenland,70.3,26.01359
Grenada,70.8,25.179879999999997
Guatemala,71.2,25.29947
Guinea,57.1,22.52449
Guinea-Bissau,53.6,21.64338
Guyana,65.0,23.68465
Haiti,61.0,23.66302
Honduras,71.8,25.10872
Hungary,73.9,27.115679999999998
Iceland,82.4,27.206870000000002
India,64.7,20.95956
Indonesia,69.4,21.85576
Iran,73.1,25.310029999999998
Iraq,66.6,26.71017
Ireland,80.1,27.65325
Israel,80.6,27.13151
Jamaica,75.1,24.00421
Japan,82.5,23.50004
Jordan,76.9,27.47362
Kazakhstan,67.1,26.290779999999998
Kenya,60.8,21.592579999999998
Kuwait,77.3,29.172109999999996
Latvia,72.4,26.45693
Lesotho,44.5,21.90157
Liberia,59.9,21.89537
Libya,75.6,26.54164
Lithuania,72.1,26.86102
Luxembourg,81.0,27.434040000000003
"Macedonia, FYR",74.5,26.34473
Madagascar,62.2,21.403470000000002
Malawi,52.4,22.034679999999998
Malaysia,74.5,24.73069
Maldives,78.5,23.219910000000002
Mali,58.5,21.78881
Malta,80.7,27.683609999999998
Marshall Islands,65.3,29.37337
Mauritania,67.9,22.62295
Mauritius,72.9,25.15669
Mexico,75.4,27.42468
Moldova,70.4,24.2369
Mongolia,64.8,24.88385
Montenegro,76.0,26.55412
Morocco,73.3,25.63182
Mozambique,54.0,21.93536
Myanmar,59.4,21.44932
Namibia,59.1,22.65008
Nepal,68.4,20.76344
Netherlands,80.3,26.01541
Nicaragua,77.0,25.77291
Niger,58.0,21.21958
Nigeria,59.2,23.03322
Norway,80.8,26.934240000000003
Oman,76.2,26.241090000000003
Pakistan,64.1,22.299139999999998
Panama,77.3,26.26959
Papua New Guinea,58.6,25.015060000000002
Paraguay,74.0,25.54223
Peru,78.2,24.770410000000002
Philippines,69.8,22.872629999999997
Poland,75.4,26.6738
Portugal,79.4,26.68445
Qatar,77.9,28.13138
Romania,73.2,25.41069
Russia,67.9,26.01131
Rwanda,64.1,22.55453
Samoa,72.3,30.42475
Sao Tome and Principe,66.0,23.51233
Senegal,63.5,21.927429999999998
Serbia,74.3,26.51495
Sierra Leone,53.6,22.53139
Singapore,80.6,23.83996
Slovak Republic,74.9,26.92717
Slovenia,78.7,27.43983
Somalia,52.6,21.969170000000002
South Africa,53.4,26.85538
Spain,81.1,27.49975
Sri Lanka,74.0,21.96671
Sudan,65.5,22.40484
Suriname,70.2,25.49887
Swaziland,45.1,23.16969
Sweden,81.1,26.37629
Switzerland,82.0,26.20195
Syria,76.1,26.919690000000003
Tajikistan,69.6,23.77966
Tanzania,60.4,22.47792
Thailand,73.9,23.008029999999998
Timor-Leste,69.9,20.59082
Togo,57.5,21.87875
Tonga,70.3,30.99563
Trinidad and Tobago,71.7,26.396690000000003
Tunisia,76.8,25.15699
Turkey,77.8,26.703709999999997
Turkmenistan,67.2,25.24796
Uganda,56.0,22.35833
Ukraine,67.8,25.42379
United Arab Emirates,75.6,28.053590000000003
United Kingdom,79.7,27.392490000000002
United States,78.3,28.456979999999998
Uruguay,76.0,26.39123
Uzbekistan,69.6,25.32054
Vanuatu,63.4,26.78926
West Bank and Gaza,74.1,26.5775
Vietnam,74.1,20.9163
Zambia,51.1,20.68321
Zimbabwe,47.3,22.0266

線性迴歸注意事項

線性迴歸隱含一系列前提假設,並非適合所有情形,因此應當注意以下兩個問題。

最適用於線性資料
線性迴歸會根據訓練資料生成直線模型。如果訓練資料包含非線性關係,你需要選擇:調整資料(進行資料轉換)、增加特徵數量(參考下節內容)或改用其他模型。

容易受到異常值影響
線性迴歸的目標是求取對訓練資料而言的 “最優擬合” 直線。如果資料集中存在不符合總體規律的異常值,最終結果將會存在不小偏差。
在第一個圖表中,模型與資料相當擬合。
但若新增若干不符合規律的異常值,會明顯改變模型的預測結果。
在大多數情況下,模型需要基本上能與大部分資料擬合,所以要小心異常值!

多元線性迴歸

我們在上節練習中使用 BMI 來預測平均壽命。這裡的 BMI 是預測變數,也稱為自變數。預測變數被用來預測其他變數,而被預測的則稱為因變數。在本例中,因變數為平均壽命。

假設我們又獲取了各國人口的心率資料。那麼可以同時使用 BMI 和心率來預測平均壽命嗎?

當然可以!只需使用多元線性迴歸即可。

如果預測結果取決於多個變數,則需相應建立更加複雜的模型。只要所選自變數/預測變數適合當前場景,增加變數有助於改善預測結果。

在只有單個預測變數時,線性迴歸模型是一條直線,而增加預測變數,相當於增加影像維度。
此時需要使用三維影像來進行展示,線性迴歸模型也變成了平面:
預測變數的數量可以超過兩個,甚至在合適的情況下多多益善!若使用 <n 個預測變數,那麼模型公式則為:

y=m1​x1​+m2​x2​+m3​x3​+...+mn​xn​+b

模型中的預測變數越多,就越難以通過影像展示。幸好線性迴歸的其他環節不發生變化,仍然可以用相同方式擬合模型和做出預測。下面來試試吧!

程式設計測驗:多元線性迴歸

在本測驗中,你將使用到波士頓房價資料集。資料集中包含 506 棟房屋的 13 個特徵與房價中值(單位為 1000 美元)。你將根據這 13 個特徵擬合模型,並預測房價。(波士頓房價資料集來自於 UCI機器學習資料集, 但現已下線。你還可以檢視我們的波士頓房價專案中的資料集來對資料集有更多瞭解。

你需要完成以下步驟:

1. 構建線性迴歸模型

  • 使用 scikit-learn 的 LinearRegression 建立迴歸模型,然後賦於 model 變數。
  • 根據資料擬合模型。

2. 使用模型進行預測

  • 輸入 sample_house 資料進行預測。
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

# Load the data from the the boston house-prices dataset 
boston_data = load_boston()
x = boston_data['data']
y = boston_data['target']

# Make and fit the linear regression model
# TODO: Fit the model and Assign it to the model variable
model = LinearRegression()
model.fit(x, y)

# Mak a prediction using the model
sample_house = [[2.29690000e-01, 0.00000000e+00, 1.05900000e+01, 0.00000000e+00, 4.89000000e-01,
                6.32600000e+00, 5.25000000e+01, 4.35490000e+00, 4.00000000e+00, 2.77000000e+02,
                1.86000000e+01, 3.94870000e+02, 1.09700000e+01]]
# TODO: Predict housing price for the sample_house
prediction = model.predict(sample_house)

相關文章