本文总结了机器学习基石的第四次作业,主要包括交叉验证,带正则化的线性回归。
问题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