08-01 經過線性迴歸瞭解算法流程

更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython

經過線性迴歸帶你瞭解算法流程

1、1. 1 線性迴歸引入

相信咱們不少人可能都有去售樓處買房而無奈回家的行爲,就算你沒去過售樓處,相信你也應該據說過那使人嘆而驚止的房價吧?對於高房價你沒有想過這房價是怎麼算出來的呢?難道就是房地產商拍拍腦門,北京的一律1000萬,上海的一律800萬,杭州的一律600萬嗎?看到這相信你應該有動力想要學好機器學習走向人生巔峯了。算法

其實仔細想一想這房價大有來頭,首先房價不可能只和地區有關,北京有1000萬的房子,又會有800萬、600萬的房子,那這些房價不和地區有關還和什麼有關呢?若是你真的買過房就知道,房子的價格首先和地區是有着比較大的聯繫的,北京五環外的房子可能都高於杭州任何地區的房子,在同一個地區內,房子的價格大多和房子的佔地面積、戶型、採光度等等因素有關係。數組

這個時候就有某位聰明的投機者想到了,我是否是能夠找到一個方法來預測房價呢?若是這個房子的房價明顯小於這所房子該有的房價(注:房價可能在某段時間因爲某種鮮爲人知的因素有小幅波動),就把那所買過來了,等房價漲回去了再賣出去,這樣看起來也是生財之道。(注:純屬虛構)數據結構

但是若是去預測房價呢?上面講到了房價和房子所在地區\(x_1\)、佔地面積\(x_2\)、戶型\(x_3\)和採光度\(x_4\)有關,那麼我是否是能夠把這些因素假想成房子的特徵,而後給這些每一個特徵都加上一個相應的權重\(\omega\),既能夠獲得以下的決策函數
\[ \hat{Y} = \omega_1x_1 + \omega_2x_2 + \omega_3x_3 + \omega_4x_4 + b \]
其中\(b\)能夠理解爲誤差,你也能夠想成房子的這些特徵再差也可能會有一個底價。dom

基於上述給出房價的決策函數,咱們就能夠對一個某個不知名的房子輸入它的這些特徵,而後就能夠獲得這所房子的預測價格了。機器學習

理想老是美好的,即一條生財之道就在眼前,可是咱們如何去獲得這個決策函數呢?咱們能夠獲得這個特徵值,可是這個\(\omega\)怎麼獲得呢?這就是咱們的線性迴歸須要解決的問題,下面讓咱們一塊兒走向這條生財之道吧!函數

2、1. 2 決策函數

你能夠簡單的認爲線性迴歸就是找到一條曲線去擬合全部樣本點,上面說起買房的問題有四個特徵,所以咱們獲得的決策函數爲
\[ \hat{Y} = \omega_1x_1 + \omega_2x_2 + \omega_3x_3 + \omega_4x_4 + b \]工具

對於\(n\)個特徵的線性迴歸模型,你可能須要找到一條曲線,也能夠說成是一個決策函數
\[ \hat{Y}=f_\theta(X)=\theta_1x_1+\theta_2x_2+\cdots+\theta_nx_n+b=\theta^TX+b \]
擬合全部樣本點。其中\(b\)爲未知參數偏置(bias);\(\theta\)爲未知參數向量\([\theta_1,\theta_2,\cdots,\theta_n]\)\(X\)爲樣本在各個特徵上的特徵值,用向量表示爲\([x_1,x_2,\cdots,x_n]\)\(\theta^T\)爲向量\(\theta\)的轉置
\[ \begin{bmatrix} \theta_1 \\ \theta_2 \\ \vdots \\ \theta_n \end{bmatrix} \]

\[ \theta^TX= \begin{bmatrix} \theta_1 \\ \theta_2 \\ \vdots \\ \theta_n \end{bmatrix} * [x_1,x_2,\cdots,x_n] = \theta_1x_1+\theta_2x_2+\cdots+\theta_nx_n \]
若是你對矩陣運算不熟悉,牢記\(f_\theta(X)=\theta_1x_1+\theta_2x_2+\cdots+\theta_nx_n+b=\theta^TX+b\)便可。性能

若是把未知參數\(b\)當作\(\theta_0\),曲線爲
\[ \hat{Y}=f_\theta(X)=\theta_0x_0+\theta_1x_1+\theta_2x_2+\cdots+\theta_nx_n+b=\theta^TX \]
其中\(x_0=1\)

雖然其餘機器學習算法的決策函數不必定是線性迴歸的\(f_\theta(X)=\theta^T{X}\),可是決策函數中通常都會有一個未知參數\(\theta\),之後對於全部的機器學習算法都會逐一講解爲何會有這個參數。

3、1. 3 損失函數

# 損失函數圖例
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.datasets.samples_generator import make_regression
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

# 生成隨機數據
# X爲樣本特徵,y爲樣本輸出,coef爲迴歸係數,共100個樣本,5個噪聲,每一個樣本1個特徵,數據集隨機種子爲1
X, y, coef = make_regression(
    n_samples=100, n_features=1, noise=50, coef=True, random_state=1)

# 散點圖+直線
plt.scatter(X, y, color='g', s=50, label='房子信息')
plt.plot(X, X*coef, color='r', linewidth=2)

plt.xlabel('房子面積', fontproperties=font, fontsize=15)
plt.ylabel('房價', fontproperties=font, fontsize=15)
plt.title('房子面積-房價', fontproperties=font, fontsize=20)
# 去掉x,y軸尺度
plt.xticks(())
plt.yticks(())
plt.legend(prop=font)
plt.show()

png

如上圖所示,上圖假設每個綠點表示一所房子的信息,紅色的直線爲咱們經過某種方法獲得一個決策函數\(\hat{Y}=f_\theta(X)=\theta^T{X}+b=\theta_1x+b\)。對於監督模型中的經過房子面積預測房價例子,咱們是假設已知\(\theta_1=10,b=0\)

可是若是你眼力勁還不錯,你可能會發現咱們的這個決策函數並無徹底通過這些數據點,也能夠說是沒有徹底擬合這些數據點。通常咱們的決策函數都是沒法通過全部點的,你要知道機器學習是不可能作到預言的,而只能作到預測,預言有時候都會不許確,更別說預測了,也就是說機器學習對新數據的預測是有偏差的。一般咱們使用一個損失函數(loss function)或代價函數(cost function)度量模型預測錯誤的程度
\[ L(Y-\hat{Y})=L(Y-f_\theta(X)) \]
其中\(Y\)爲樣本的真實值,\(\hat{Y}\)爲樣本的預測值。

四種經常使用的損失函數:

  1. 平方損失函數(quadratic loss function)
    \[ L(Y,f_\theta(X))=(Y-f_\theta(X))^2 \]
  2. 絕對值損失函數(absolute loss fuction)
    \[ L(Y,f_\theta(X))=|Y-f_\theta(X)| \]
  3. 0-1損失函數(0-1 loss function)
    \[ L(Y,f_\theta(X)) \begin{cases} 1,&Y\neq{f_\theta(X)} \\ 0,&Y=f_\theta(X) \end{cases} \]
  4. 對數損失函數(logarithmic loss function)或對數似然損失函數(log-likelihood loss function)
    \[ L(Y,f_\theta(X))=-\log{P(Y|X)} \]

4、1. 4 目標函數

損失函數通常是對某個樣本損失的計算,可是咱們的模型很明顯不是由一個樣本生成的,而是由一組樣本生成的。因爲\(X\)\(Y\)咱們能夠經過數據得到,可是未知參數\(\theta\)是未知的,所以咱們在這裏給出關於\(\theta\)的目標函數(objective function),即全部樣本的偏差加和取平均
\[ J(\theta)= \sum_{i=1}^m L(y_i,f_{\theta_i}(x_i)) \]
其中\(m\)是樣本總數,\(\sum_{i=1}^m L(y_i,f_{\theta_i}(x_i))= L(y_1,f_{\theta_1}(x_1))+L(y_2,f_{\theta_2}(x_2))+\cdots+L(y_m,f_{\theta_m}(x_m))\)

5、1. 5 目標函數最小化

假設咱們獲得了目標函數,那麼咱們接下來要幹什麼呢?目標函數是全部樣本的偏差加和取平均,那麼是否是這個偏差越小越好呢?對,你暫時能夠這樣想,偏差越小,則咱們的預測值會愈來愈接近真實值,接下來咱們就是須要最小化目標函數,因爲目標函數在統計學中被稱爲經驗風險(empirical risk),因此有時候也會最小化目標函數也會被稱爲經驗風險最小化(empirical risk minimization)。
\[ \min{J(\theta)} = \min \frac{1}{m}\sum_{i=1}^m L(y_i,f_{\theta_i}(x_i)) \]
其中\(\min{J(\theta)}\)表示最小化\(J(\theta)\)函數。

經過線性迴歸舉例,因爲\(f_{\theta}(X)=\theta^TX\),則它的損失函數是
\[ L(Y,f_\theta(X)) = L(Y,\theta^TX) \]
它的目標函數是
\[ J(\theta)=\frac{1}{m} \sum_{i=1}^m L(y_i,\theta_i{x_i}) \]

假設上述目標函數使用了平方損失函數,則目標函數變成
\[ J(\theta) = \frac{1}{m} \sum_{i=1}^m (y_i-\theta_i{x_i})^2 \]
最小化目標函數爲
\[ \begin{align} \min{J(\theta)} & = \min \frac{1}{m} \sum_{i=1}^m (y_i-\theta_i{x_i})^2 \\ & = \min \frac{1}{m} [(y_1-\theta_1{x_1})^2+(y_2-\theta_2{x_2})^2+\cdots+(y_m-\theta_m{x_m})^2] \end{align} \]
其中\(\{x_1,x_2,\cdots,x_m\}\)\(\{y_1,y_2,\cdots,y_m\}\)\(m\)都是已知的,即咱們能夠把他們當作一個常數。

若是咱們考慮一個極端狀況,即假設\(x_i=1,\,(i=1,2,\cdots,m)\)\(y_i=2,\,(y=1,2,\cdots,m)\)\(m=100\)\(\theta_1=\theta_2=\cdots=\theta_m=\theta_j\),則最小化目標函數變爲
\[ \begin{align} \min{J(\theta)} & = \min \frac{1}{100} \underbrace{[(2-\theta_j*1)^2+(2-\theta_j*1)^2+\cdots+(2-\theta_j*1)^2]}_{100} \\ & = \min \frac{1}{100} 100*[(2-\theta_j*1)^2] \\ & = \min (2-\theta_j*1)^2 \end{align} \]

# 目標函數最小化圖例
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# 生成一個數組(-4.98,-4.96,...,4.98,5)
theta_j = np.arange(-5, 5, 0.02)
# 構造J_theta曲線
J_theta_j = (2-theta_j)**2

# 描繪曲線
plt.plot(theta_j, J_theta_j, color='r', linewidth=2)

plt.xlabel('$θ$', fontproperties=font, fontsize=15)
plt.ylabel('$min{J(θ)}$', fontproperties=font, fontsize=15)
plt.title('$\min{J(θ)}=(2-θ_j*1)^2$', fontproperties=font, fontsize=20)
plt.show()

png

上圖即咱們假設的目標函數的圖像,從上圖能夠看出,若是要最小化目標函數則須要找到能使目標函數最小化的參數向量\(\theta\),經過公式能夠表示爲
\[ \underbrace{arg\,\min}_\theta{J(\theta)}=\frac{1}{m}\sum_{i=1}^m L(y_i,f_{\theta_i}(x_i)) \]
其中\(\underbrace{arg\,\min}_\theta{J(\theta)}\)表示找到能使\(J(\theta)\)最小化的參數向量\(\theta\)

因爲這裏只介紹目標函和目標函數最小化問題,怎麼找能使得目標函數最小化的\(\theta\)不在此處介紹範圍,之後會詳細介紹。相信你對目標函數的構造、目標函數最小化(目標函數優化問題)有了一個明確的認知,至於目標函數中埋下的幾處伏筆,之後都會詳細介紹,目前的你只須要了解這個流程,之後咱們會經過具體的機器學習算法來再一次解釋這個過程。而且之後你會發現其實咱們接下來要介紹的全部機器學習算法都是基於這個流程,因此你會反覆再反覆接觸這個流程,若是如今能有個明確的認知很好,若是不能夠等把這個流程與某個機器學習算法聯繫在一塊兒的時候相信你能理解他。

6、1. 6 過擬合

在這裏我必須得明確告訴你,理論上模型多是越小越好,可是在工業上模型並非偏差越小越好。你能夠這樣想一想,假設咱們有一個數據集,這個數據集難道不會有噪音(noise)或噪聲嗎?首先我能夠很明確的告訴你,通常的工業上的數據都會有噪聲,若是咱們的模型通過了包括噪聲的全部樣本點,也就是說模型對咱們的訓練集作到了完美擬合,這就是咱們常說的過擬合(over-fitting),而且過擬合時模型也會變得相對複雜。

產生噪聲的緣由:

  1. 訓練數據的標籤錯誤,即A類的數據標記爲B類;B類的數據標記爲A類
  2. 輸入數據某一維特徵值不許確的,下圖所示的紅點
# 過擬合圖例
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
%matplotlib inline

# 自定義數據並處理數據
data_frame = {'x': [2, 1.5, 3, 3.2, 4.22, 5.2, 6, 6.7],
              'y': [0.5, 3.5, 5.5, 5.2, 5.5, 5.7, 5.5, 6.25]}
df = pd.DataFrame(data_frame)
X, y = df.iloc[:, 0].values.reshape(-1, 1), df.iloc[:, 1].values.reshape(-1, 1)

# 線性迴歸
lr = LinearRegression()
lr.fit(X, y)


def poly_lr(degree):
    """多項式迴歸"""
    poly = PolynomialFeatures(degree=degree)
    X_poly = poly.fit_transform(X)
    lr_poly = LinearRegression()
    lr_poly.fit(X_poly, y)
    y_pred_poly = lr_poly.predict(X_poly)

    return y_pred_poly


def plot_lr():
    """對線性迴歸生成的圖線畫圖"""
    plt.scatter(X, y, c='k', edgecolors='white', s=50)
    plt.plot(X, lr.predict(X), color='r', label='lr')
    # 噪聲
    plt.scatter(2, 0.5, c='r')
    plt.text(2, 0.5, s='$(2,0.5)$')

    plt.xlim(0, 7)
    plt.ylim(0, 8)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()


def plot_poly(degree, color):
    """對多項式迴歸生成的圖線畫圖"""
    plt.scatter(X, y, c='k', edgecolors='white', s=50)
    plt.plot(X, poly_lr(degree), color=color, label='m={}'.format(degree))
    # 噪聲
    plt.scatter(2, 0.5, c='r')
    plt.text(2, 0.5, s='$(2,0.5)$')

    plt.xlim(0, 7)
    plt.ylim(0, 8)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()


def run():
    plt.figure()
    plt.subplot(231)
    plt.title('圖1(線性迴歸)', fontproperties=font, color='r', fontsize=12)
    plot_lr()
    plt.subplot(232)
    plt.title('圖2(一階多項式迴歸)', fontproperties=font, color='r', fontsize=12)
    plot_poly(1, 'orange')
    plt.subplot(233)
    plt.title('圖3(三階多項式迴歸)', fontproperties=font, color='r', fontsize=12)
    plot_poly(3, 'gold')
    plt.subplot(234)
    plt.title('圖4(五階多項式迴歸)', fontproperties=font, color='r', fontsize=12)
    plot_poly(5, 'green')
    plt.subplot(235)
    plt.title('圖5(七階多項式迴歸)', fontproperties=font, color='r', fontsize=12)
    plot_poly(7, 'blue')
    plt.subplot(236)
    plt.title('圖6(十階多項式迴歸)', fontproperties=font, color='r', fontsize=12)
    plot_poly(10, 'violet')
    plt.show()


run()

png

如上圖所示每張圖都有相同分佈的8個樣本點,紅點明顯是一個噪聲點,接下來將講解上述8張圖。暫時不用太關心線性迴歸和多項式迴歸是什麼,這兩個之後你都會學習到,此處引用只是爲了方便舉例。

  • 圖1:線性迴歸擬合樣本點,能夠發現樣本點距離擬合曲線很遠,這個時候通常稱做欠擬合(underfitting)
  • 圖2:一階多項式迴歸擬合樣本點,等同於線性迴歸
  • 圖3:三階多項式迴歸擬合樣本點,表現還不錯
  • 圖4:五階多項式迴歸擬合樣本點,明顯過擬合
  • 圖5:七階多項式迴歸擬合樣本點,已經擬合了全部的樣本點,毋庸置疑的過擬合
  • 圖7:十階多項式迴歸擬合樣本點,擬合樣本點的曲線和七階多項式已經沒有了區別,能夠想象十階以後的曲線也相似於七階多項式的擬合曲線

從上圖能夠看出,過擬合模型將會變得複雜,對於線性迴歸而言,它可能須要更高階的多項式去擬合樣本點,對於其餘機器學習算法,也是如此。這個時候你也能夠想象,過擬合雖然對擬合的樣本點的偏差接近0,可是對於將來新數據而言,若是新數據的\(x=2\),若是使用過擬合的曲線進行擬合新數據,那麼會給出\(y=0.5\)的預測值,也就是說把噪聲的值給了新數據,這樣明顯是不合理的。

7、1. 7 正則化

上面給你們介紹了機器學習中避不開的一個話題,即模型頗有可能出現過擬合現象,出現了問題就應該解決,我講講機器學習中最經常使用的解決過擬合問題的方法——正則化(regularization)。給目標函數加上正則化項(regularizer)或懲罰項(penalty term),即新的目標函數變成
\[ J(\theta)=\frac{1}{m} \sum_{i=1}^m L(y_i,f_{\theta_i}(x_i)) + \lambda(R(f)) \]
其中\(\lambda\geq0\)爲超參數,相似於參數,可是參數能夠經過算法求解,超參數須要人工手動調整;\(\lambda(R(f))\)爲正則化項。

這個時候你可能在想爲何加上正則化項就能夠解決過擬合問題呢?對於線性迴歸而言,因爲涉及線性迴歸、梯度降低法、最小角迴歸法等概念,此處很少贅述,講線性迴歸時會詳細講述。下面將經過線性迴歸中正則化的兩種形式L1正則化和L2正則化作簡單解釋。

7.1 1. 7.1 L1正則化

L1正則化(Lasso)是在目標函數上加上L1正則化項,即新的目標函數爲
\[ J(\theta) =\frac{1}{m} \sum_{i=1}^m L(y_i,f_{\theta_i}(x_i)) + \lambda||\theta||_1 \]
其中\(||\theta||_1\)爲參數向量\(\theta\)的1範數。

假設樣本有\(n\)特徵,則\(\theta\)\(n\)維向量,1範數爲
\[ ||\theta||_1=\sum_{j=1}^n|\theta_j| \]

7.2 1. 7.2 L2正則化

L2正則化(Ridge)是在目標函數上加上L2正則化項,即新的目標函數爲
\[ J(\theta)=\frac{1}{m} \sum_{i=1}^m L(y_i,f_{\theta_i}(x_i)) + \frac{\lambda}{2}||\theta||_2^2 \]
其中\(||\theta||_2^2\)爲參數向量\(\theta\)的2範數的平方。

假設樣本有\(n\)特徵,則\(\theta\)\(n\)維向量,2範數爲
\[ ||\theta||_2=\sqrt{\sum_{j=1}^n{\theta_j}^2} \]

多說一嘴,假設樣本有\(n\)特徵,則\(\theta\)\(n\)維向量,p範數爲
\[ ||\theta||_p=\sqrt[p]{\sum_{j=1}^n{\theta_j}^p} \]

8、1. 8 訓練集、驗證集、測試集

一般狀況下咱們不會使用數據集中的全部數據做爲訓練數據訓練模型,而是會按照某種比例,將數據集中的數據隨機分紅訓練集、驗證集、測試集學得一個較優模型,如能夠把數據集按照7:2:1的比例分紅訓練集、驗證集、測試集,對於不一樣的問題通常分配的比例不一樣,下面將介紹這三者各自的做用。

8.1 1. 8.1 訓練集

通常狀況下咱們都會使用帶有正則項的目標函數去構建模型,即咱們的目標函數爲
\[ J(\theta)=\frac{1}{m} \sum_{i=1}^m L(y_i,f_{\theta_i}(x_i)) + \lambda(R(f)) \]
通常會經過訓練集獲得參數\(\theta\)。如線性迴歸的目標函數中有兩個參數\(\theta\)\(b\),通常會經過訓練集獲得這兩個參數\(\theta\)\(b\)

8.2 1. 8.2 驗證集

通常狀況下咱們都會使用帶有正則項的目標函數去構建模型,即咱們的目標函數爲
\[ J(\theta)=\frac{1}{m} \sum_{i=1}^m L(y_i,f_{\theta_i}(x_i)) + \lambda(R(f)) \]
通常會經過給定一組超參數,而後經過驗證集獲得最優超參數\(\lambda\),有時候會把驗證集獲得超參數的步驟劃分到訓練集中。如線性迴歸的目標函數有一個超參數\(\lambda\),通常會經過驗證集獲得該超參數\(\lambda\)

8.3 1. 8.3 測試集

測試集通常被當作將來新數據集,而後經過度量模型性能的工具測試模型的偏差大小。

9、1. 9 本章小結

本章主要經過線性迴歸介紹了決策函數、四種損失函數、目標函數及目標函數的問題,其實其餘的機器學習算法也是這樣的套路,在在一部分算法原理時咱們會細講,此處你有一個大概的概念便可。

最小化目標函數咱們假設偏差越小越好,然而工業上數據老是會有噪聲,也就是說\(0\)偏差也許並非最好的,所以引出了咱們的過擬合問題,以後講解了解決過擬合問題的兩個方法,一個是在目標函數上加上正則化項,另外一個則把訓練集分紅訓練集、驗證集和測試集。

相關文章
相關標籤/搜索