天天看點

帶你讀《Python機器學習》之三:線性回歸算法第3章

點選檢視第一章 點選檢視第二章

第3章

線性回歸算法

3.1 算法概述

簡單來說,回歸就是用一條曲線對資料點進行拟合,該曲線稱為最佳拟合曲線,這個拟合過程稱為回歸。回歸問題的求解過程就是通過訓練分類器采用最優化算法來尋找最佳拟合參數集。當該曲線是一條直線時,就是線性回歸。

對于一個擁有m個對象、n個屬性的樣本資料集而言,線性回歸的目的就是建立一個線性函數,它能對待測對象x,預測其對應的一個或者多個輸出結果。以銀行貸款為例,銀行會了解貸款人的年齡和工資等資訊,然後根據這些資料給出相應的貸款額度,工資和年齡都會最終影響貸款的額度,那麼它們各自有多大的影響呢?這就需要用到線性回歸的思想。

機器學習中,線性回歸思想示意圖如圖3-1所示。線性回歸是機器學習的基礎,“線性”指一次,“回歸”實際上就是拟合。線性回歸一般用來做連續值的預測,預測的結果是一個連續值。在訓練學習樣本時,不僅需要提供學習的特征向量X,還需要提供樣本的實際結果(标記label),是以線性回歸模型屬于監督學習裡的回歸模型。

帶你讀《Python機器學習》之三:線性回歸算法第3章

3.2 算法流程

線性回歸算法流程如圖3-2所示。

帶你讀《Python機器學習》之三:線性回歸算法第3章

3.3 算法步驟

1.模型建立

線上性回歸中,假定輸入x與輸出y之間具有線性相關的關系。當特征向量X中隻有一個特征時,需要學習的函數應是一個一進制線性函數

帶你讀《Python機器學習》之三:線性回歸算法第3章

。當情況複雜時,給定由d個屬性描述的示例

帶你讀《Python機器學習》之三:線性回歸算法第3章

,其中xi是X在第i個屬性上的取值,線性模型(linear model)試圖學得一個通過屬性的線性組合來進行預測的函數,考慮X存在n個特征的情形,我們往往需要得到更多的系數。将X到y的映射函數記作函數

帶你讀《Python機器學習》之三:線性回歸算法第3章

帶你讀《Python機器學習》之三:線性回歸算法第3章

其中,為了在映射函數hθ(X)中保留常數項,令x0為1,是以特征向量X={1, x1, x2,…,xn},

特征系數向量θ={θ0, θ1, θ2,…, θn}。

2.參數估計

用線性回歸拟合出來的模型hθ(X)給出的預測值f與真實值y(i)之間肯定存在差異

帶你讀《Python機器學習》之三:線性回歸算法第3章

,其中

帶你讀《Python機器學習》之三:線性回歸算法第3章

。對于每一個樣本而言,滿足:

帶你讀《Python機器學習》之三:線性回歸算法第3章

誤差

帶你讀《Python機器學習》之三:線性回歸算法第3章

互相獨立且具有相同的分布,服從均值為0、方差為0^2的高斯分布。由于誤差

帶你讀《Python機器學習》之三:線性回歸算法第3章

服從高斯分布,将

帶你讀《Python機器學習》之三:線性回歸算法第3章

代入高斯公式得

帶你讀《Python機器學習》之三:線性回歸算法第3章

将式(3-2)代入式(3-3)可得:

帶你讀《Python機器學習》之三:線性回歸算法第3章

為讓預測值成為真實值的可能性最大,進行最大似然估計:

帶你讀《Python機器學習》之三:線性回歸算法第3章

對該似然函數累乘不容易求解,且每項元素均大于零,對式(3-5)兩邊取對數,将乘法轉換成加法:

帶你讀《Python機器學習》之三:線性回歸算法第3章

對式(3-6)進行化簡得

帶你讀《Python機器學習》之三:線性回歸算法第3章

3.損失函數

對似然函數求對數以後,似然函數的值越大越好,前半部分屬于常數值部分,不做考慮,是以式(3-7)後半部分的取值越小越好。令

帶你讀《Python機器學習》之三:線性回歸算法第3章

運用最小二乘法對式(3-8)進行求解:

帶你讀《Python機器學習》之三:線性回歸算法第3章

對式(3-9)中的θ求偏導以得到極小值點:

帶你讀《Python機器學習》之三:線性回歸算法第3章

令偏導值為0,得θ:

帶你讀《Python機器學習》之三:線性回歸算法第3章

4.梯度下降

在求解極小值的過程中,當資料量比較小的時候,可以通過式(3-11)的方式來求解最優的θ值,但是當資料量和特征值非常大,例如有幾萬甚至上億的資料和特征值時,運用矩陣求逆的方法就變得不太現實,而梯度下降法給出了不錯的選擇。

梯度是一個向量,是一個n元函數f關于n個變量的偏導數,如三元函數f的梯度為

(fx, fy, fz),二進制函數f的梯度為(fx, fy),一進制函數f的梯度為fx。二進制函數梯度下降示意圖如圖3-3所示。梯度函數的方向就是上述案例中上山最陡峭的地方,是函數f增長最快的方向,而梯度的反方向就是f的函數值降低最快的方向,沿着該方向更容易找到函數的最小值。

帶你讀《Python機器學習》之三:線性回歸算法第3章

梯度下降法的基本思想可以類比為一個下山的過程。假設一個人站在山頂,由于濃霧使得他并不容易找到山谷(山的最低點),而必須利用自身周圍的資訊去找到下山的路徑。此時,就可以利用如下方法來找到下山的途徑:以他目前所處的位置為基準,尋找目前位置最陡峭的地方,然後朝着山的高度下降的地方走。反複采用該方法,最後就能成功抵達山谷。

線上性回歸算法中,損失函數如下:

帶你讀《Python機器學習》之三:線性回歸算法第3章

式中hθ(x(i))代表輸入為x(i)時,在當時θ參數下的輸出值:

帶你讀《Python機器學習》之三:線性回歸算法第3章

使用梯度下降法求取J(θ)的最小值,實作目标函數J(θ)按梯度下降的方向進行減少,有

帶你讀《Python機器學習》之三:線性回歸算法第3章

其中,j為特征值權重的編号,α為學習率或步長,需要人為指定,若取值過大則會導緻目标函數不收斂,若取值過小則會導緻總體疊代次數過多,收斂速度很慢。

當下降的高度小于某個設定的值時,停止下降。對線性回歸算法損失函數J(θ)求梯度,得

帶你讀《Python機器學習》之三:線性回歸算法第3章

據式(3-13)與式(3-14),單個特征的疊代式如下:

帶你讀《Python機器學習》之三:線性回歸算法第3章

由單個特征疊代式推得多特征疊代式,見式(3-16):

帶你讀《Python機器學習》之三:線性回歸算法第3章

對每個j疊代求值,再對式(3-16)疊代直至該式收斂。上述所講即為梯度下降算法(Gradient Descent),目前後兩次疊代的值不再發生變化時,說明它已收斂,退出疊代。在一般情況下,會設定一個具體的參數,目前後兩次的疊代內插補點小于該值時疊代結束。

總的來說,在梯度下降的參數中,初始值和學習率都是人工設定的,同時梯度下降法對這些參數又是敏感的。初始值的設定會影響到最終J(θ)的最小值,使得結果可能是局部最小值(Local Minima),也可能是全局最小值(Global Minima),如圖3-4所示。同時,學習率的設定也會影響梯度下降的性能和結果,當學習率值設定過小時,由于沿着最陡峭方向每次邁進的步伐太小,會導緻收斂時間過長,但最終會找到全局最優解;當學習率值設定過大時,很有可能會直接越過全局最小值,因而無法得到J(θ)的最小值。

帶你讀《Python機器學習》之三:線性回歸算法第3章

3.4 算法執行個體

下面是一個簡單的模型,是對3.3節提出的線性回歸梯度下降算法的實作,具體程式代碼如下。

#!/usr/bin/python
#coding=utf-8
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

# 構造訓練資料
x = np.arange(0., 10., 0.2)
m = len(x)  # 訓練資料點數目
print(m)
x0 = np.full(m, 1.0)
input_data = np.vstack([x0, x]).T  # 将偏置b作為權向量的第一個分量
target_data = 2 * x + 5 + np.random.randn(m)

# 兩種終止條件
loop_max = 10000  # 最大疊代次數(防止死循環)
epsilon = 1e-3

# 初始化權值
np.random.seed(0)
theta = np.random.randn(2)
alpha = 0.001  # 步長(注意取值過大會導緻振蕩即不收斂,過小收斂速度變慢)
diff = 0.
error = np.zeros(2)
count = 0  # 循環次數
finish = 0  # 終止标志

while count < loop_max:
    count += 1

    # 标準梯度下降是在權值更新前對所有樣例彙總誤差,而随機梯度下降的權值是通過考察某個訓練樣例來更新的
    # 在标準梯度下降中,權值更新的每一步對多個樣例求和,需要更多的計算
    sum_m = np.zeros(2)
    for i in range(m):
        dif = (np.dot(theta, input_data[i]) - target_data[i]) * input_data[i]
        sum_m = sum_m + dif  # 當alpha取值過大時,sum_m會在疊代過程中溢出

    theta = theta - alpha * sum_m  # 注意步長alpha的取值,過大會導緻振蕩
    # theta = theta - 0.005 * sum_m  # alpha取0.005時産生振蕩,需要将alpha調小

    # 判斷是否已收斂
    if np.linalg.norm(theta - error) < epsilon:
        finish = 1
        break
    else:
        error = theta
    print( 'loop count = %d' % count, '\tw:', theta)
print ('loop count = %d' % count, '\tw:', theta)

# 用SciPy線性回歸檢查
slope, intercept, r_value, p_value, slope_std_error = stats.linregress(x, target_data)
print ('intercept = %s slope = %s' % (intercept, slope))

plt.plot(x, target_data, 'g*')
plt.plot(x, theta[1] * x + theta[0], 'r')
plt.xlabel("X")
plt.xlabel("Y")
plt.show()           

運作結果如圖3-5所示。

50
loop count = 1     w: [2.3221664  3.74752288]
loop count = 2     w: [2.03227017 1.54546032]
loop count = 3     w: [2.29637407 2.97515749]
loop count = 4     w: [2.19699697 2.02832888]
loop count = 5     w: [2.33456174 2.63686952]
loop count = 6     w: [2.31615581 2.22769658]
......
loop count = 300     w: [5.63766048 1.88345245]
loop count = 301     w: [5.63868679 1.88329572]
loop count = 302     w: [5.63970019 1.88314097]
loop count = 303     w: [5.64070083 1.88298817]
loop count = 304     w: [5.64168888 1.88283729]
intercept = 5.719194774079044    slope = 1.871001842016462           
帶你讀《Python機器學習》之三:線性回歸算法第3章

3.5 算法應用

線性回歸是機器學習中最基礎的算法,它研究的是樣本目标和特征變量之間是否存線上性關系。現有506條有關波士頓房價的綜合資料,包括每間住宅的平均房間數RM、一氧化氮濃度(每千萬份)NOX、房子所在區的犯罪率CRIM、城鎮的黑人比例B、高速公路條數RAD、城鎮的學生與教師比例PTRATIO等。每條資料就是一個樣本,房價就是目标變量,其他資料可看作特征變量。下面算法中選取房間數RM作為特征變量,房價PRICE作為目标變量,通過使用Scikit-learn中内置的回歸模型對“美國波士頓房價”資料進行預測,最終給出房價PRICE的預測。

import pandas as pd
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
 
#把資料轉化成Pandas的形式,在列尾加上房價PRICE
boston_dataset=datasets.load_boston()
data=pd.DataFrame(boston_dataset.data)
data.columns=boston_dataset.feature_names
data['PRICE']=boston_dataset.target
 
#取出房間數和房價并轉化成矩陣形式
x=data.loc[:, 'RM'].as_matrix(columns=None)
y=data.loc[:, 'PRICE'].as_matrix(columns=None)
 
#進行矩陣的轉置
x=np.array([x]).T
y=np.array([y]).T
 
#訓練線性模型
l=LinearRegression()
l.fit(x, y)
 
#畫圖顯示
plt.scatter(x, y, s=10, alpha=0.3, c='green')
plt.plot(x, l.predict(x), c='blue', linewidth='1')
plt.xlabel("Number of Rooms")
plt.ylabel("House Price")
plt.show()           

運作結果如圖3-6所示。

帶你讀《Python機器學習》之三:線性回歸算法第3章

3.6 算法的改進與優化

利用普通最小二乘法建立多元線性回歸模型(Multiple Linear Regression,MLR),當對回歸方程中的變量與樣本進行增減時,其他變量回歸系數可能有較大的變化,甚至改變符号,與實際問題産生沖突。然而,在實際問題中變量間存線上性關系的現象卻是普遍存在的,為消除這種現象給回歸模組化帶來的不良影響,化學家S. Wold于 1983年提出了一種偏最小二乘回歸(Partial Least Squares Regression,PLS)方法。

在偏最小二乘回歸中,設由觀測資料得到資料陣

帶你讀《Python機器學習》之三:線性回歸算法第3章

和y,記

帶你讀《Python機器學習》之三:線性回歸算法第3章

帶你讀《Python機器學習》之三:線性回歸算法第3章

分别是X和y經标準化處理後的觀測資料矩陣,其中

帶你讀《Python機器學習》之三:線性回歸算法第3章

。得到的預測模型效果優于普通最小二乘法。

當資料間存線上性關系時,用普通最小二乘方法模組化得到的結果誤差會很大,甚至會出現和實際相悖的情況,在這種情況下,普通最小二乘方法是失效的。偏最小二乘回歸在某種程度上改善了普通最小二乘法對變量間存線上性關系時模組化的弊端。

3.7 本章小結

本章主要介紹了機器學習中的線性回歸算法。首先,對線性回歸算法進行簡要介紹,該算法通過對曆史資料的學習得到估計函數,運用該函數可以對新的資料産生新的估計。其次,以流程圖的形式對該算法從整體上進行講解,然後對算法流程中的各環節進行簡要介紹并給出相關公式的推導過程,之後,在算法執行個體部分給出了該算法的實作過程。最後,在算法應用部分,結合實際情況通過波士頓房價預測的執行個體加深讀者對線性回歸算法的了解,并給出對該算法的改進與優化。學完本章之後,讀者應該對線性回歸算法有深刻的了解,掌握并熟練地使用它。

3.8 本章習題

1. 選擇題

(1)在下面的兩個圖中,右圖給出關于θ0和θ1的損失函數J(θ0, θ1),左圖給出相同損失函數的等值線圖。根據該圖,選擇正确的選項(多選題)。(  )

帶你讀《Python機器學習》之三:線性回歸算法第3章

A. 如果從B點開始,具有良好學習率的梯度下降最終幫助我們到達或接近A點,因為損失函數J(θ0, θ1)的值在A點處最小

B. 點P(右圖的全局最小值)對應于左圖中的點A

C. 如果從B點開始,具有良好學習率的梯度下降最終幫助我們到達或接近C點,因為損失函數J(θ0, θ1)的值在C點處最小

D. 如果從B點開始,具有良好學習率的梯度下降最終幫助我們到達或接近A點,因為損失函數J(θ0, θ1)的值在A點處最大

E. 點P(右圖的全局最小值)對應于左圖中的點C

(2) 假設對于某些線性回歸問題(例如預測住房價格)我們有一些訓練集,對于訓練集,設法找到θ0、θ1,使得J(θ0, θ1)=0。下面哪個叙述是正确的?(  )

A. 即使對于尚未看到的新例子,我們也可以完美地預測y的值(例如,可以完美地預測我們還沒有看到的新房子)

B. 為使上式成立,我們必須令θ0=0和θ1=0進而使得hθ(x)=0

C. 對于滿足J(θ0, θ1)的θ0和θ1的值,對每個訓練樣本(x(i), y(i))都有hθ(x(i))=y(i)

D. 這是不可能的,根據J(θ0, θ1)=0的定義,不可能存在θ0和θ1使得J(θ0, θ1)=0

2. 填空題

(1)已知小張在大學一年級的學習成績,預測一下她在大學二年級的學習成績。具體來說,讓x等于小張在大學第一年(新生年)收到的A等級(包括A-、A和A+等級)的數量。我們要預測y的值,将其定義為她在第二年(大二)獲得的A等級的數量。線上性回歸中,假設,使用m來表示訓練樣本數量。根據下面給出的訓練集,m的值為   。

帶你讀《Python機器學習》之三:線性回歸算法第3章

(2)假設使用題(1)中的訓練集,定義損失函數

帶你讀《Python機器學習》之三:線性回歸算法第3章

,則J(0,1)=   。

(3)假設θ0=-1,θ1=0.5,則hθ(5)=   。

3.判斷題

(1) 機器學習線性回歸模型是一種有監督的學習方式。(  )

(2) 梯度下降算法是一種求解全局最優解的方法。(  )

(3) 使用最小二乘法求解損失函數時,将資料點代入假設方程求得觀測值,求使得實際值與觀測值相減的平方和最小的參數。(  )

4.程式設計題

據美國疾病預防中心資料顯示,美國約1/7的成年人患有糖尿病,到2050年,這個比例将會快速增長至高達1/3。在UCL機器學習資料庫裡面有一個糖尿病資料集,該資料集由768條資料組成,每條資料有9個特征,分别是懷孕次數、血糖、血壓、皮脂厚度、胰島素、BMI身體品質指數、糖尿病遺傳函數、年齡和結果(0代表未患糖尿病,1代表患有糖尿病)。部分資料如下表所示。利用該資料集的第一個特征,編寫一段Python代碼,運用線性回歸的思想建立懷孕與是否患糖尿病之間的聯系,繪制一條直線,使得資料集中所有樣本到直線上的距離的剩餘平方和最小,并且與相應預測線逼近,最終給出回歸方程相關系數值。

帶你讀《Python機器學習》之三:線性回歸算法第3章