本文總結了機器學習基石的第四次作業,主要包括交叉驗證,帶正則化的線性迴歸。
問題1-2:關於過擬合和Deterministic noise的問題。
假設期望輸出爲:。
noise主要分爲兩大類:
- ① Stochastic noise:來自於外界的“干擾”,屬於不可消除性noise;
- ② Deterministic noise:來自於潛在目標函數與假設空間中最優假設函數 的差異,即最優假設函數能力不夠,無法逼近目標函數。
Deterministic noise取決於假設函數集,假設,且固定,則一般而言,採用取代,deterministic noise將如何變化?
由於Deterministic noise可以理解爲假設函數集能夠“逼近”目標函數的能力(能力越強,值越小),因此對於越大的假設函數集,其能力越強,所以一般而言,deterministic noise在此種情況下會增加。
多項式模型可以視爲線性模型在空間上的運用,即採用非線性轉換 ,此問題中將標量轉換爲向量,採用的轉換規則爲(關於的詳細表達式見PPT)。
將假設函數集表示爲,其中。定義,則下述表達式中哪條是正確的?
可以看出 A 對。
含權值懲罰項的正則項,具體表達式如下所示(其中)
如果我們希望通過以學習率爲 的梯度下降法來最小化增廣誤差 ,具體的參數更新表達式是什麼?
:,易得:
爲普通線性迴歸問題的最優解,是加入了正則項之後的最優解,則兩者之間有什麼關係?
根據課程可知,正則項表達式本質上是通過下述表達式“推導”而來的(兩者等價)
從上式顯然可見,若滿足這個條件,則,否則,,且隨着的減小(對應增大)相應的似然函數集滿足$w的值域(小C)\subset w的值域(大C) |w_{reg}(\lambda)|\lambda$的非增函數。所以選C項。
留一交叉驗證(leave one out cross validation)的思路是:可以在一定程度上反映:的數學期望能夠近似的數學期望,推導表達式如下(其中①表示數學期望②③):
根據的定義,可推知上式中。上式說明了可以用leave-one-out來近似,代價是運算開銷增大。
有三個數據點,則對於兩個模型:① ②,在取何值時,兩者的相等?
通過計算,容易發現兩者等價,且對於情況①,所以只需情況②中便可,從而問題可以轉換爲(線性方程求解代入等過程略):
關於學習的三大準則:
- a). Occam’s Razor:能夠擬合數據的模型中,越簡單的模型越具有說服力;
- b). Sampling Bias:如果訓練樣本和測試樣本(以及後續的預測問題)的數據不是來自於同一分佈,則訓練的結果往往是不可信的;
- c). Data Snooping(偷窺數據):要儘可能的避免或減少對數據的“偷窺”,在很多情況下,會有意無意的間接加入了“人的預處理”而對資料產生污染。
一封包含接下來5周每週一棒球比賽勝負的結果的郵件,這封郵件告訴你如果你想看第6周比賽的勝負,需支付1000元,下述哪條分析是對的?
如果要保證至少有一封郵件對5周棒球比賽預測結果是對的,至少要發出64封郵件(在5場比賽出結果之前)。在第一場比賽結果出來後,郵件發送者應該再發幾封郵件給剩下的人。
5場都沒出結果時:。1場出了結果:,之後依次除以2即可。
如果發送一封郵件需10元,如果5周過後有一位收件人寄來1000元,則該發件人的這次騙局能賺多少錢?
A7:總共花費,所以
銀行一開始有一個非常簡陋的“評判標準”來確定是否對某人發放信用卡,對個人採用標準決定是否發放信用卡,因此,現在手頭的數據有。在你看到這些數據之前,厲害的你已經通過數學推導等手段建立了一個信用卡發放與否的評價函數,然後你將其用到這些有的數據上,發現結果幾乎完美。
你的假設空間/似然函數集是多少?
由於通過數學推導建立了一個評價函數,即假設函數已經確定了,因此,似然函數集。
Hoeffding不等式:,將具體數值代入可解得:。
銀行採用你的評價函數,結果發現在後續人中效果很差,超過半數辦理信用卡的人存在欺詐行爲。則如何“搭配”和你的作爲評價體系會有較好的效果?
A10:效果很差的根本原因在於使用了“污染”的數據,因爲全部都是來自於獲得的標籤,並不是真實可信的。但是又能夠很好的預測來自的數據,因此一種好的預測方式是,如果能通過的測試,則再進一步進行的測試(因爲對的結果預測效果好)。因此,即兩者都說“可信”的情況下,真實情況一般而言是好的。
Q11~Q12:虛擬樣本和正則化:考慮線性迴歸問題,如果我們加入K個虛擬樣本,然後我們解下述方程:
這些虛擬樣本可以視爲一種“另類”的正則化。
使得上述問題得到最優解的是多少?
對上式求導,再令其導數= 0求出,求解的結果爲
當取何值時,上述表達式獲得的與下述0正則化完全一樣?
正則化邏輯迴歸的解爲: 。
將上一題的結果與上式對比可知:。
問題13-20:主要考察加入正則項後的線性迴歸問題,超參數的選擇問題和交叉驗證方法。
加入正則項的線性迴歸問題(基本原理與線性迴歸一致,也存在閉式解):
(對 求偏導,令其等於零,推知上式最後結果)
超參數的選擇:
一系列超參數的集合
For i=1,2,…K:
①計算每一種超參數下的
②利用此求解和(有時還加上)
③根據一定評價標準(常用來進行選擇)
返回最佳的
交叉驗證方法:
將數據劃分爲K份
For t=1,2,…,K:
①將第t份作爲驗證集,其他的作爲訓練集
②通過訓練集訓練求出
③求解該情況下訓練集和驗證集的誤差
將所有訓練集和驗證集的誤差取均值
返回誤差
交叉驗證往往被用來作爲超參數選擇的策略。也是評價假設函數集好壞的有效方法。
取的情況下時,對應的和分別是多少?(採用0/1判據)
Ein: 0.05
Eout: 0.045
分別採用,對應最小和最小情況下的是多少?(如果存在多個相同答案時,選擇相同情況下最大的)。
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]]
將訓練集劃分爲和。通過獲得,再通過對其進行驗證。求不同超參數情況下使得最小的和使得最小的。
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中(對應 最小)的 作用於整個數據集獲得 ,在計算此時的 和 。
Ein: 0.035
Eout: 0.02
將數據劃分爲5份,進行交叉驗證,對於不同的情況,求使得最小的的。
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]]
求上述(Q19)對應的和。
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