2.2 簡單一元線性迴歸

2.2 .0 abstract

  • 聲明:本文只爲我閒暇時候學習所做筆記,僅供我無聊時複習所用,若文中有錯,誤導了讀者,敬請諒解!!!

2.2.1 問題描述

簡單線性迴歸問題.mp4 (35.27MB)

  • 在表格裏我們給出了正常男生20歲時標準體重。第一列表示的是身高,第二列代表的是體重。我們希望通過這個數據來搭建迴歸模型(也就是要通過表格中已知的數據集,去構造(專業叫法:擬合)一個函數_f,_使得_f_能很好的把X【這裏的X是特徵,因爲在該例中爲單一特徵,所以X代表的就是一個值;而在多數情況下都是多特徵的所以用大X來表示是一個特徵向量】映射到y【y爲標籤】上)使得之後給定一個身高即可以預測出標準體重。
  • 數據集:爲整個表格
  • 樣本:爲每行數據
  • 樣本特徵:爲每一行的身高值
  • 樣本標籤:爲每一行的體重
  • 因爲體重這個標籤,對於所有的樣本構成的體重的值的集合,可以是一個連續的實數的集合,所以這個問題是一個迴歸問題,而不是分類問題。
  • 根據機器學習核心的步驟。
    1. 數據集收集
    2. 數據清洗
    3. 特徵工程
    4. 機器學習建模
    5. 模型驗證
    6. 上線
  • 那對於這個問題,哪一個環節是沒有必要的?
    • 這裏肯定不需要的環節是數據清洗,數據已經很規範,沒有必要做額外的清洗工作。 這裏需要注意的一點是,看似不需要做特徵工程,但實際上也可以做一些特徵方面的處理的,比如連續性變量轉換成離散型變量等。當然,這裏唯一的連續性變量是身高。

2.2.2 簡單線性迴歸預測身高與體重關係模型構建

模型訓練.mp4 (39.11MB)

2.2.2.1 概述

  • 建模的第一步,一般是對數據本身的理解。切忌不要急於直接套模型,因爲不理解數據的情況下做出來的模型是有着很大的不確定性。比如出現了異常情況,可能都不知道問題的根源是什麼。
  • 對於數據理解來說,最重要的一項技術叫做數據的可視化(data visualization)。千萬不要小看這部分的工作。不理解數據的前提下做模型是很不明智的事情。
  • 首先,我們對上述數據做個可視化。由於數據特徵只有一個,我們完全可以在二維空間裏展示特徵與預測值之間的關係。
  • 當我們遇到很多特徵的時候,最容易想到的方法就是特徵的降維,比如把原先10維的特徵降維到2維,3維空間裏,然後再做可視化。機器學習裏有很多可以用來降維的方法比如PCA, 我們先不用關心它的細節。

2.2.2.2 身高和體重數據的可視化

# 這裏我們導入了兩個庫,numpy是一個科學計算庫,matplotlib是用來做可視化的庫

# 這裏我們通過numpy庫創建了一個二維的數組,其中第一列是特徵(身高),第二列是(體重) 
# 我們可以看出這是(10,2)的大小,其中10代表的是數組的行數,也就是樣本的個數, 2代表的是列數。

# 這裏我們分別讀出x和y,其中x裏存儲的是特徵,y中存儲的是標籤。
# 需要注意的一點是data[:,0]中添加了一個reshape的函數
# 主要的原因是在之後調用fit函數的時候對特徵矩陣x是要求是矩陣的形式。

# 把生成的數據在二位空間裏面做了可視化,這裏調用的是matplotlib的庫 
# 從圖裏可以看出這些點具有一定的線性的關係


image.png

image.png
圖2.2-1 身高-體重數據可視化結果
從圖2.2-1中可以看出體重隨着身高的變大而變大,體現出來一中比較明顯的線性關係,這就意味着可以使用簡單的線性模型即可以很好的擬合這批數據。

2.2.2.3 身高和體重數據擬合過程,也就是模型訓練的過程

  • 我們接着來解決剛纔的問題,接下來的步驟就是根據給到的數據來擬合線性模型,這個過程也叫做訓練。然後通過擬合後的模型去預測身高。
  • 建模的時候,我們都會把給定的數據分成訓練數據和測試數據, 主要是爲了驗證模型的好壞。因爲只有通過測試數據才能看到模型訓練得到底行不行。

2.2.2.3.1 手寫線性迴歸模型實現

後面補充

2.2.2.3.2 通過sklearn的線性迴歸模型實現

  • 任務描述:

在這裏我們使用一個線性迴歸模型來擬合身高-體重的數據,也就是希望通過身高來預測標準體重。在已創建的數據集裏已經給出了部分樣本,所以一旦我們訓練出一個模型,則可以對任意的身高數據都可以給出一個體重的預測值。這裏需要分成3個部分。

  • 第一部分是數據的創建;
  • 第二部分是利用線性迴歸來擬合數據;
  • 第三部分是利用已經訓練好的模型去預測任意的體重並畫出對任意體重的預測值,這裏需要使用plot, 並且指定顏色爲藍色(color=“blue”)

  • 提示信息:

image.png 提示一
1.實例化的過程跟創建object的過程是類似的,這裏需要調用sklearn的線性模型模塊即可,暫時不需要指定任何的輸入參數。並把實例化後的線性迴歸模型命名爲regr
2.對於模型的訓練,可以直接使用模型自帶的fit函數
3.針對於所有給定的x,計算出在這個模型下的預測值,並把x和預測值通過matplotlib庫來去可視化。
image.png 提示二
1.在sklearn裏線性迴歸模型在linear_model模塊裏。可以參考https://scikit-learn.
org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
2.對於訓練數據(x,y),通常通過sklearn中的fit(x,y)來實現模型的訓練。這裏x可以看做是特徵部分,y可以看做是真實的值或者標籤。
3.調用plt.plot()函數即可以畫出一條線。

  • 我的代碼:
from sklearn import datasets, linear_model # 引用 sklearn庫,主要爲了使用其中的線性迴歸模塊

# 創建數據集,把數據寫入到numpy數組
import numpy as np  # 引用numpy庫,主要用來做科學計算
import matplotlib.pyplot as plt   # 引用matplotlib庫,主要用來畫圖
data = np.array([[152,51],[156,53],[160,54],[164,55],
                 [168,57],[172,60],[176,62],[180,65],
                 [184,69],[188,72]])

# 打印出數組的大小
# print(data.shape)

x,y = data[:,0].reshape(-1,1), data[:,1]

# TODO 1. 實例化一個線性迴歸的模型
regr = linear_model.LinearRegression()

# TODO 2. 在x,y上訓練一個線性迴歸模型。 如果訓練順利,則regr會存儲訓練完成之後的結果模型
regr.fit(x, y)

# TODO 3. 畫出身高與體重之間的關係
plt.scatter(x, y, color='red')

# 畫出已訓練好的線條
plt.plot(x, regr.predict(x), color='blue')

# 畫x,y軸的標題
plt.xlabel('height (cm)')
plt.ylabel('weight (kg)')
plt.show() # 展示

# 利用已經訓練好的模型去預測身高爲163的人的體重
print ("Standard weight for person with 163 is %.2f"% regr.predict([[163]]))
  • 參考代碼:

image.png

  • 實驗結果

image.png
圖2.2-2 身高-體重線性迴歸結果

從圖2.2-2中可以到通過線性迴歸擬合的曲線,以及該曲線所預測的163cm身高的體重爲55.77kg。

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