機器學習基石作業04:交叉驗證,正則化線性迴歸

本文總結了機器學習基石的第四次作業,主要包括交叉驗證,帶正則化的線性迴歸。


問題1-2:關於過擬合和Deterministic noise的問題。
假設期望輸出爲:y=f(x+ϵ)Gaussian(f(x),σ2)y=f(\mathbb{x}+\epsilon)\sim Gaussian(f(x),\sigma^2)
noise主要分爲兩大類:

  • ① Stochastic noise:來自於外界的“干擾”,屬於不可消除性noise;
  • ② Deterministic noise:來自於潛在目標函數ff與假設空間中最優假設函數 hHh^{\star}\in \mathcal{H} 的差異,即最優假設函數能力不夠,無法逼近目標函數。

在這裏插入圖片描述
Deterministic noise取決於假設函數集H\mathcal{H},假設HH\mathcal{H}^` \subset \mathcal{H},且ff固定,則一般而言,採用H\mathcal{H}^`取代H\mathcal{H},deterministic noise將如何變化?

由於Deterministic noise可以理解爲假設函數集能夠“逼近”目標函數的能力(能力越強,值越小),因此對於越大的假設函數集,其能力越強,所以一般而言,deterministic noise在此種情況下會增加。


在這裏插入圖片描述
多項式模型可以視爲線性模型在Z\mathcal{Z}空間上的運用,即採用非線性轉換 Φ:XZ\Phi:\mathcal{X}\to\mathcal{Z},此問題中將標量xx轉換爲向量zz,採用的轉換規則爲z=(1,L1(x),L2(x),...,LQ(x))z=(1,L_1(x),L_2(x),...,L_Q(x))(關於Li(x)L_i(x)的詳細表達式見PPT)。

將假設函數集表示爲HQ={hh(x)=wTz=q=0Qw1Lq(x)}H_Q=\big\{h|h(x)=w^Tz=\sum_{q=0}^{Q}w_1L_q(x)\big\},其中L0(x)=1L_0(x)=1。定義H(Q,c,Q0)=hh(x)=qTzHQ;wq=c for qQ0\mathcal{H}(Q,c,Q_0)={h|h(x)=q^Tz\in H_Q;w_q=c\ for\ q\ge Q_0},則下述表達式中哪條是正確的?

H(10,0,3)=h(x)=[w0 w1 w2 0 0 0 0 0 0 0 0][z0 z1 z2 z3 z4 z5 z6 z7 z8 z9 z10]=w0z0+w1z1+w2z2H(10,0,3)= {h(x) = [w_0 \ w_1 \ w_2 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0] * [ z_0 \ z_1 \ z_2 \ z_3 \ z_4 \ z_5 \ z_6 \ z_7 \ z_8 \ z_9 \ z_10] = w_0*z_0 + w_1*z_1 + w_2*z_2}

H(10,0,4)=h(x)=[w0 w1 w2 w3 0 0 0 0 0 0 0][z0 z1 z2 z3 z4 z5 z6 z7 z8 z9 z10]=w0z0+w1z1+w2z2+w3z3H(10,0 ,4) = {h(x) = [w_0 \ w_1 \ w_2 \ w_3 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0] * [z_0 \ z_1 \ z_2 \ z_3 \ z_4 \ z_5 \ z_6 \ z_7 \ z_8 \ z_9 \ z_10] = w_0*z_0+w_1*z_1+w_2*z_2+w_3*z_3}

可以看出 A 對。


在這裏插入圖片描述
含權值懲罰項的正則項,具體表達式如下所示(其中λ>0\lambda\gt 0)
Eaug(w)=Ein(w)+λNwTw E_{aug}(w)=E_{in}(w)+\frac{\lambda}{N}w^Tw
如果我們希望通過以學習率爲 η\eta 的梯度下降法來最小化增廣誤差 Eaug(w)E_{aug}(w),具體的參數更新表達式是什麼?

Eaug\nabla E_{aug}Ein+2λNw\nabla E_{in}+\frac{2\lambda}{N}w,易得:
w(t+1)(12ληN)w(t)ηEin(w(t)) w(t+1)\gets \big(1-\frac{2\lambda\eta}{N}\big)w(t)-\eta\nabla E_{in}(w(t))


在這裏插入圖片描述
在這裏插入圖片描述
wlinw_{lin}爲普通線性迴歸問題的最優解,wregw_{reg}是加入了正則項之後的最優解,則兩者之間有什麼關係?

根據課程可知,正則項表達式本質上是通過下述表達式“推導”而來的(兩者等價)
min Ein(w)=1N(Zwy)T(Zwy)   s.t.  wTwC min\ E_{in}(w)=\frac{1}{N}(Zw-y)^T(Zw-y)\ \ \ s.t.\ \ w^Tw\le C
從上式顯然可見,若wlinw_{lin}滿足wTwCw^Tw\le C這個條件,則wlin=wregw_{lin}=w_{reg},否則,wlinwreg\|w_{lin}\|\ge \|w_{reg}\|,且隨着CC的減小(對應λ\lambda增大)相應的似然函數集滿足$w的值域(小C)\subset w的值域(大C) 。易知|w_{reg}(\lambda)|是關於\lambda$的非增函數。所以選C項。


留一交叉驗證(leave one out cross validation)的思路是:可以在一定程度上反映EoutE_{out}Eloocv(H,A)E_{loocv}(\mathcal{H},A)的數學期望能夠近似Eout(g)E_{out}(g^-)的數學期望,推導表達式如下(其中①E\mathcal{E}表示數學期望②Dn=DtrainDn+(xn,yn)=DD_n=D_{train},D_n+(x_n,y_n)=Den=err(gn(xn),yn)e_n=err(g_n^-(x_n),y_n)):
EDEloocv(H,A)=ED1Nn=1Nen=1Nn=1NEDen=1Nn=1NEDnE(xn,yn)err(gn(xn),yn)=1Nn=1NEDnEout(gn)=1Nn=1NEˉout(gn)=Eˉout(gn)=Eˉout(N1) \mathcal{E}_{D}E_{loocv}(\mathcal{H},A)=\mathcal{E}_D\frac{1}{N}\sum_{n=1}^Ne_n=\frac{1}{N}\sum_{n=1}^N\mathcal{E}_De_n=\frac{1}{N}\sum_{n=1}^N\mathcal{E}_{D_n}\mathcal{E}_{(x_n,y_n)}err(g_n^-(x_n),y_n)\\ =\frac{1}{N}\sum_{n=1}^N\mathcal{E}_{D_n}E_{out}(g^-_n)=\frac{1}{N}\sum_{n=1}^N\bar{E}_{out}(g^-_n)=\bar{E}_{out}(g^-_n)=\bar{E}_{out}(N-1)
根據EoutE_{out}的定義,可推知上式中E(xn,yn)err(gn(xn),yn)=Eout(gn)\mathcal{E}_{(x_n,y_n)}err(g_n^-(x_n),y_n)=E_{out}(g_n^-)。上式說明了可以用leave-one-out來近似Eout(g)E_{out}(g),代價是運算開銷增大。

在這裏插入圖片描述
有三個數據點(1,0),(1,0),(ρ,1),ρ0(-1,0),(1,0),(\rho,1),\rho\ge0,則對於兩個模型:①h0(x)=b0h_0(x)=b_0h1(x)=a1x+b1h_1(x)=a_1x+b_1,在ρ\rho取何值時,兩者的Eloocv(in)E_{loocv}(in)相等?
在這裏插入圖片描述
通過E=13(e12+e22+e32)E=\frac{1}{3}(e_1^2+e_2^2+e_3^2)計算,容易發現e1e_1兩者等價,且對於情況①e2=e3=1/4e_2=e_3=1/4,所以只需情況②中e2+e3=1/2e_2+e_3=1/2便可,從而問題可以轉換爲(線性方程求解代入等過程略):
(2ρ+1)2+(2ρ1)2=12ρ=9+46 \big(\frac{2}{\rho+1}\big)^2+\big(\frac{-2}{\rho-1}\big)^2=\frac{1}{2}\to\rho=\sqrt{9+4\sqrt{6}}


關於學習的三大準則:

  • a). Occam’s Razor:能夠擬合數據的模型中,越簡單的模型越具有說服力;
  • b). Sampling Bias:如果訓練樣本和測試樣本(以及後續的預測問題)的數據不是來自於同一分佈,則訓練的結果往往是不可信的;
  • c). Data Snooping(偷窺數據):要儘可能的避免或減少對數據的“偷窺”,在很多情況下,會有意無意的間接加入了“人的預處理”而對資料產生污染。
    在這裏插入圖片描述
    一封包含接下來5周每週一棒球比賽勝負的結果的郵件,這封郵件告訴你如果你想看第6周比賽的勝負,需支付1000元,下述哪條分析是對的?

如果要保證至少有一封郵件對5周棒球比賽預測結果是對的,至少要發出64封郵件(在5場比賽出結果之前)。在第一場比賽結果出來後,郵件發送者應該再發幾封郵件給剩下的人。

5場都沒出結果時:25=322^5=32。1場出了結果:24=162^4=16,之後依次除以2即可。


在這裏插入圖片描述
如果發送一封郵件需10元,如果5周過後有一位收件人寄來1000元,則該發件人的這次騙局能賺多少錢?

A7:總共花費cost=10(25+24+23+...,21+1)=630cost=10(2^5+2^4+2^3+...,2^1+1)=630,所以get=1000630=370get=1000-630=370


銀行一開始有一個非常簡陋的“評判標準”a(x)a(x)來確定是否對某人xx發放信用卡,對N=10,000N=10,000個人採用a(x)a(x)標準決定是否發放信用卡,因此,現在手頭的數據有(x1,y1),...,(xN,yN)(x_1,y_1),...,(x_N,y_N)。在你看到這些數據之前,厲害的你已經通過數學推導等手段建立了一個信用卡發放與否的評價函數gg,然後你將其用到這些有的數據上,發現結果幾乎完美。
在這裏插入圖片描述
你的假設空間/似然函數集MM是多少?
由於通過數學推導建立了一個評價函數,即假設函數已經確定了,因此,似然函數集M=1M=1


在這裏插入圖片描述
Hoeffding不等式:P[EinEout>ϵ]2Mexp(2ϵ2N)P[|E_{in}-E_{out}|\gt\epsilon]\le2 Mexp(-2\epsilon^2N),將具體數值代入可解得:P0.271P\leq0.271


在這裏插入圖片描述
銀行採用你的評價函數gg,結果發現在後續人中效果很差,超過半數辦理信用卡的人存在欺詐行爲。則如何“搭配”a(x)a(x)和你的g(x)g(x)作爲評價體系會有較好的效果?

A10:g(x)g(x)效果很差的根本原因在於使用了“污染”的數據,因爲DataData全部都是來自於a(x)a(x)獲得的標籤yy,並不是真實可信的。但是g(x)g(x)又能夠很好的預測來自a(x)a(x)的數據,因此一種好的預測方式是,如果能通過a(x)a(x)的測試,則再進一步進行g(x)g(x)的測試(因爲g(x)g(x)a(x)a(x)的結果預測效果好)。因此a(x) AND g(x)a(x)\ AND\ g(x),即兩者都說“可信”的情況下,真實情況一般而言是好的。


Q11~Q12:虛擬樣本和正則化:考慮線性迴歸問題,如果我們加入K個虛擬樣本(x~1,y~1),...,(x~K,y~K)(\tilde{x}_1,\tilde{y}_1),...,(\tilde{x}_K,\tilde{y}_K),然後我們解下述方程:
minw1N+K(n=1N(ynwTxn)2+k=1K(y~kwTx~n)2) min_w \frac{1}{N+K}\big(\sum_{n=1}^N(y_n-w^Tx_n)^2+\sum_{k=1}^K(\tilde{y}_k-w^T\tilde{x}_n)^2\big)
這些虛擬樣本可以視爲一種“另類”的正則化。
在這裏插入圖片描述

使得上述問題得到最優解的ww是多少?

對上式求導,再令其導數= 0求出ww,求解的結果爲w=(XTX+X~TX~)1(XTY+X~TY~)w=(X^TX+\tilde{X}^T\tilde{X})^{-1}(X^TY+\tilde{X}^T\tilde{Y})


在這裏插入圖片描述
X~,Y~\tilde{X},\tilde{Y}取何值時,上述表達式獲得的ww與下述0正則化完全一樣?
wreg=argminwλNw2+1NXwy2 w_{reg}=argmin_w\frac{\lambda}{N}||w||^2+\frac{1}{N}||Xw-y||^2
正則化邏輯迴歸的解爲:wreg=(ZTZ+λI)1ZTyw_{reg} = (Z^TZ+\lambda I)^{-1}Z^Ty

將上一題的結果與上式對比可知:X~=λI,Y~=0\tilde{X}=\sqrt{\lambda}I,\tilde{Y}=0


問題13-20:主要考察加入正則項後的線性迴歸問題,超參數的選擇問題和交叉驗證方法。

加入正則項的線性迴歸問題(基本原理與線性迴歸一致,也存在閉式解):
wreg=argminwλNw2+1NXwY2=(XTX+λI)1XTY w_{reg}=argmin_w\frac{\lambda}{N}||w||^2+\frac{1}{N}||Xw-Y||^2=(X^TX+\lambda I)^{-1}X^TY
(對 ww 求偏導,令其等於零,推知上式最後結果)

超參數的選擇:

一系列超參數的集合L=λ1,...λKL=\lambda_1,...\lambda_K
For i=1,2,…K:
①計算每一種超參數下的wregw_{reg}
②利用此wregw_{reg}求解EinE_{in}EoutE_{out}(有時還加上EvalE_{val}
③根據一定評價標準(常用EvalE_{val}來進行選擇)
返回最佳的λ\lambda

交叉驗證方法:

將數據劃分爲K份
For t=1,2,…,K:
①將第t份作爲驗證集,其他的作爲訓練集
②通過訓練集訓練求出wregw_{reg}
③求解該wregw_{reg}情況下訓練集和驗證集的誤差
將所有訓練集和驗證集的誤差取均值
返回誤差

交叉驗證往往被用來作爲超參數選擇的策略。也是評價假設函數集好壞的有效方法。
在這裏插入圖片描述


在這裏插入圖片描述
λ=10\lambda=10的情況下時,對應的EinE_{in}EoutE_{out}分別是多少?(採用0/1判據)

Ein:  0.05
Eout:  0.045

分別採用log10λ={2,1,0,1,...,8,9,10}log_{10}\lambda=\{2,1,0,-1,...,-8,-9,-10\},對應最小EinE_{in}和最小EoutE_{out}情況下的λ\lambda是多少?(如果存在多個相同答案時,選擇相同情況下最大的λ\lambda)。
在這裏插入圖片描述

  lambda	Ein	Eout
[[1.00e-10 1.50e-02 2.00e-02]
 [1.00e-09 1.50e-02 2.00e-02]
 [1.00e-08 1.50e-02 2.00e-02]
 [1.00e-07 3.00e-02 1.50e-02]
 [1.00e-06 3.50e-02 1.60e-02]
 [1.00e-05 3.00e-02 1.60e-02]
 [1.00e-04 3.00e-02 1.60e-02]
 [1.00e-03 3.00e-02 1.60e-02]
 [1.00e-02 3.00e-02 1.60e-02]
 [1.00e-01 3.50e-02 1.60e-02]
 [1.00e+00 3.50e-02 2.00e-02]
 [1.00e+01 5.00e-02 4.50e-02]
 [1.00e+02 2.40e-01 2.61e-01]]

在這裏插入圖片描述


將訓練集劃分爲Dtrain:120D_{train}:120Dval:80D_{val}:80。通過DtrainD_{train}獲得gλg_{\lambda}^-,再通過DvalD_{val}對其進行驗證。求不同超參數λ\lambda情況下使得Etrain(gλ)E_{train}(g_\lambda^-)最小的λ\lambda和使得Eval(gλ)E_{val}(g_\lambda^-)最小的λ\lambda
在這裏插入圖片描述

	lambda  	Ein  	    Eval  	  Eout
[[1.00000000e-10 8.33333333e-03 1.25000000e-01 4.00000000e-02]
 [1.00000000e-09 0.00000000e+00 1.00000000e-01 3.80000000e-02]
 [1.00000000e-08 0.00000000e+00 5.00000000e-02 2.50000000e-02]
 [1.00000000e-07 3.33333333e-02 3.75000000e-02 2.10000000e-02]
 [1.00000000e-06 3.33333333e-02 3.75000000e-02 2.10000000e-02]
 [1.00000000e-05 3.33333333e-02 3.75000000e-02 2.10000000e-02]
 [1.00000000e-04 3.33333333e-02 3.75000000e-02 2.10000000e-02]
 [1.00000000e-03 3.33333333e-02 3.75000000e-02 2.10000000e-02]
 [1.00000000e-02 3.33333333e-02 3.75000000e-02 2.10000000e-02]
 [1.00000000e-01 3.33333333e-02 3.75000000e-02 2.20000000e-02]
 [1.00000000e+00 3.33333333e-02 3.75000000e-02 2.80000000e-02]
 [1.00000000e+01 7.50000000e-02 1.25000000e-01 8.00000000e-02]
 [1.00000000e+02 3.41666667e-01 4.12500000e-01 4.14000000e-01]]

在這裏插入圖片描述


在這裏插入圖片描述

將Q17中(對應 EvalE_{val} 最小)的 λ\lambda 作用於整個數據集獲得 gλg_\lambda,在計算此時的 Ein(gλ)E_{in}(g_\lambda)Eout(gλ)E_{out}(g_\lambda)

Ein:  0.035
Eout:  0.02

在這裏插入圖片描述

將數據劃分爲5份,進行交叉驗證,對於不同的λ\lambda情況,求使得EcvE_{cv}最小的的λ\lambda

  lambda	Ecv
[[1.000e-10 5.750e-02]
 [1.000e-09 5.750e-02]
 [1.000e-08 3.500e-02]
 [1.000e-07 3.250e-02]
 [1.000e-06 3.250e-02]
 [1.000e-05 3.250e-02]
 [1.000e-04 3.250e-02]
 [1.000e-03 3.250e-02]
 [1.000e-02 3.250e-02]
 [1.000e-01 3.250e-02]
 [1.000e+00 3.250e-02]
 [1.000e+01 8.250e-02]
 [1.000e+02 3.125e-01]]

在這裏插入圖片描述
求上述λ\lambda(Q19)對應的Ein(gλ)E_{in}(g_\lambda)Eout(gλ)E_{out}(g_\lambda)

Ein:  0.035
Eout:  0.02

代碼:

import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import linalg
def load_data(filename):
    '''
    導入數據
    '''
    data = pd.read_csv(filename, sep='\s+', header=None)
    col, row = data.shape
    X = np.c_[np.ones((col, 1)), data.iloc[:, 0: row-1]]
    y = data.iloc[:, row-1:row].values
    
    return X, y

def mistake(X, y, theta):
    '''
    誤差計算
    '''
    yhat = np.sign(X.dot(theta))
    yhat[yhat == 0] = -1
    err = np.sum(yhat != y)/len(y)
    
    return err

# Q13(lambda=10)
X, y = load_data('hw4_train.dat')
testX, testy = load_data('hw4_test.dat')
lamb = 10

row, col = X.shape

wreg = linalg.pinv(X.T.dot(X) + lamb*np.eye(col)).dot(X.T).dot(y)

ein = mistake(X, y, wreg)
eout = mistake(testX, testy, wreg)

print('Ein: ', ein)
print('Eout: ', eout)
# Q14-Q15(不同lambda情況下選擇最佳的lambda)
arr = np.arange(-10, 3, 1)
num =len(arr)
lamb = 10.0**arr

ein = np.zeros((num,))
eout = np.zeros((num,))
evali = np.zeros((num,))

for i in range(num):
    wreg = linalg.pinv(X.T.dot(X) + lamb[i] * np.eye(col)).dot(X.T).dot(y)
    ein[i] = mistake(X, y, wreg)
    eout[i] = mistake(testX, testy, wreg)
    
out = np.c_[np.c_[np.array(lamb),ein], eout]

print('  lambda\tEin\tEout')
print(out)
# Q16-Q17
trainX = X[0:120, :]; trainy = y[0:120, :]
valX = X[120:, :]; valy = y[120:, :]

ein = np.zeros((num,))
eout = np.zeros((num,))
evali = np.zeros((num,))

for i in range(num):
    wreg = linalg.pinv(trainX.T.dot(trainX) + lamb[i] * np.eye(col)).dot(trainX.T).dot(trainy)
    ein[i] = mistake(trainX, trainy, wreg)
    eout[i] = mistake(testX, testy, wreg)
    evali[i] = mistake(valX, valy, wreg)
    
out = np.c_[np.c_[np.c_[np.array(lamb),ein], evali], eout]
print('\tlambda  \tEin  \t    Eval  \t  Eout')
print(out)
# Q18
lambmin = lamb[np.where(evali == np.min(evali))[0][-1]]
wreg = linalg.pinv(X.T.dot(X) + lambmin * np.eye(col)).dot(X.T).dot(y)
errin = mistake(X, y, wreg)
errout = mistake(testX, testy, wreg)
print('Ein: ',errin)
print('Eout: ',errout)
# Q19
ein = np.zeros((num,))
eout = np.zeros((num,))

for j in range(num):
    for i in range(5):
        Xval = X[40*i:40*(i+1), :]
        Yval = y[40*i:40*(i+1), :]
        
        trainX = np.r_[X[0:40*i, :], X[40*(i+1):, :]]
        trainy = np.r_[y[0:40*i, :], y[40*(i+1):, :]]
        
        wreg = linalg.pinv(trainX.T.dot(trainX) + lamb[j] * np.eye(col)).dot(trainX.T).dot(trainy)
        ein[j] += mistake(valX, valy, wreg)
        
    ein[j] /= 5
out = np.c_[np.array(lamb), ein]
print('  lambda\tEcv')
print(out)
# Q20
lambmin = lamb[np.where(ein == np.min(ein))[0][-1]]
wreg = linalg.pinv(X.T.dot(X) + lambmin * np.eye(col)).dot(X.T).dot(y)
errin = mistake(X, y, wreg)
errout = mistake(testX, testy, wreg)
print('Ein: ',errin)
print('Eout: ',errout)

參考:
機器學習基石作業4:https://github.com/AceCoooool/MLF-MLT
機器學習基石作業4:https://blog.csdn.net/a1015553840/article/details/51173679

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