动手学机器学习机器学习的基本思想+习题

正则化

后面这项叫作正则化项,可以对需要求出的参数θ的大小进行抑制

加入L2正则化项后,线性规划问题的解析解前面不再是X.T与X的乘积,加上λI后,从半正定变成了正定矩阵,从而确保了矩阵有逆

我们有时希望得到的模型参数更稀疏,即参数中的数量尽可能多。由于L0范数衡量的是向量中非零元素的个数,因此,我们可以选用L0范数来进行正则化,最小化范数就会使向量中的非零元素尽可能少。然而,L0范数中含有示性函数II,并不可导,无论是解析求解还是梯度下降都比较困难。因此,我们常用L1范数代替L0范数作为约束。理论上可以证明,L1范数是对L0范数的非常好的近似

L1正则化的解析求解较为困难,但是可以利用梯度下降法得到数值解。带有约束的线性回归方法又称作最小绝对值收敛和选择算子(least absolute shrinkage and selection operator,LASSO)回归,简称 LASSO 回归

左图绘制了不带有正则化的损失函数J0(θ)的等值线,在每个椭圆上,损失函数的值相等。颜色越偏蓝的地方损失越小,越偏红的地方则越大。椭圆中心θ*的是损失函数J0(θ)的最小值点,也就是最优参数。当不加正则化约束时,对损失函数做梯度下降,最终就会收敛到θ*。

中图和右图分别描绘了带有L2正则化和L1正则化时损失函数等值线的变化。可以明显看出,引入正则化后,由于零向量的范数最小,损失函数较小的区域向原点偏移了,且形状也有变化。作为参考,图中的蓝色椭圆是原始损失函数J0的等值线,而红色的圆形或方形是相应范数的等值线。图中的θ*是带正则化的最优参数。可以证明,整体损失函数的最小值会在某两条等值线相切的地方取到,而具体的位置受正则化强度λ的控制。λ越小,能容忍的范数值就越大,最优参数就离原点就越远

输入特征与相似度

模长为1是因为有正则化

不同模型有不同的利用相似度的方式,比如 KNN 就直接把相似度作为直接依据进行分类,而更复杂的模型可能要对相似度进行更加复杂的变换。

Q:为什么直接内积作为相似度是合理的?

A:对特征先做映射处理其实就得到了核函数,也就是自定义的矩阵内积方式,而核函数并不在意具体的特征变换是什么,而是只关注原始空间中向量的内积

参数与超参数

参数是训练过程中机器自动求解出来的,超参数是人为提前设置的

数据集划分与交叉验证

在训练模型时,只观察训练集上损失函数的变化情况是远远不够的。但是在现实场景中,测试数据又是未知的,无法在训练时获得。因此,我们通常采用人为构造“测试集”的方法,将数据集随机划分为训练集和验证集(validation set)两部分,用验证集来代替测试集的作用。

将数据集随机分成k份,记其编号为1....k。接下来进行k次独立的训练,第i次训练时,将第i份作为验证集,其他k-1份合起来作为训练集。最后,将k次训练中得到的验证集上误差的平均值,作为模型最终的误差。

习题

1.A。在训练集上学得的模式可以应用于没见过的数据上

2.C。彼此相互独立

3.否。噪声只是其中一个原因

4.不可以。机器学习模型通常依赖于数据中存在的统计规律来进行预测,而真随机数是没有任何规律可言的,它们是完全随机的,不受任何先验知识或规律的影响

5.划分比例、batch_size、训练次数。N不是

6.如果训练集效果也差就是欠拟合,如果训练集效果很好就是过拟合

7.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score, KFold

# 从源文件加载数据,并输出查看数据的各项特征
lines = np.loadtxt('USA_Housing.csv', delimiter=',', dtype='str')
header = lines[0]
lines = lines[1:].astype(float)
print('数据特征:', ', '.join(header[:-1]))
print('数据标签:', header[-1])
print('数据总条数:', len(lines))

# 划分输入和标签
X, y = lines[:, :-1], lines[:, -1]

# 设置交叉验证
num_folds = 5
kf = KFold(n_splits=num_folds, shuffle=True, random_state=0)

# 初始化线性模型
linreg = LinearRegression()

# 交叉验证选择最佳模型
best_model = None
best_rmse = float('inf')
for train_index, val_index in kf.split(X):
    X_train, X_val = X[train_index], X[val_index]
    y_train, y_val = y[train_index], y[val_index]

    # 数据归一化
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_val_scaled = scaler.transform(X_val)

    linreg.fit(X_train_scaled, y_train)
    y_pred = linreg.predict(X_val_scaled)
    rmse = np.sqrt(((y_pred - y_val) ** 2).mean())
    # if rmse < best_rmse:
    #     best_rmse = rmse
    #     best_model = linreg
    print(rmse)

可以看到用了五折交叉验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值