机器学习(十二)

线性回归

在这里插入图片描述
上图是描述线性回归过程的一个例子。横坐标表示目标值,纵坐标表示一个特征值。这样我们就可以在坐标系中生成一个散点图,我们算法实现的就是通过这些散点图来运算出最符合这些数据的一条直线(图中的红线)
线性回归就是通过一个或者多个自变量(特征)与因变量(目标值)之间进行建模的回归分析。

一、原理

我们通过算法来运算如下函数的相关参数
在这里插入图片描述
上式中的w为权重(某一特征在整体上所占据的权重),b为偏置项,x为特征值。w和x为如下矩阵在这里插入图片描述
矩阵的运算
在这里插入图片描述
通过矩阵运算的方式来确定初步的解,但是最初的解往往误差相对较大,例如一个二维样本,如下:
在这里插入图片描述
点与线之间的距离就是误差,这里我们需要不断地去优化模型,进而减小这些误差,至于要怎么减小误差呢,我们需要一个标准来逐步优化,所以我们运用了损失函数。

二、损失函数

(一)最小二乘法
定义如下:
在这里插入图片描述
yi为训练集中第i个样本的真实值
hw(xi)为第i个训练样本中特征值组合预测函数
此方法不能解决过拟合现象。
(1)正规方程(不常用)
在这里插入图片描述
由于受特征值数量的影响,特征值越多,求解速度越慢。故在实际应用中不是很常用。
(2)梯度下降
在这里插入图片描述
a为学习率,需要手动设置
在这里插入图片描述
上式表示梯度下降的方向
通过梯度下降的方式来寻找函数最优解,将误差降到最小,然后更新w。
在这里插入图片描述
一维特征样本,纵坐标为cost即为损失函数(代价)
在这里插入图片描述
二位特征样本,通过损失函数的计算来到达函数的最低点。
两种损失函数的对比
在这里插入图片描述

三、欠拟合与过拟合

在这里插入图片描述
过拟合:在训练集中有一个很好的拟合效果,但是在测试集上的测试效果缺失不尽人意(模型过于简单)。主要原因就是我们的数据的特征相对较少,如果想要解决欠拟合这一现象,我们需要增加特征的数量来缓解欠拟合现象。
欠拟合:在训练集上没有达到一个很好的拟合效果,且同时在测试集上的测试效果也不是很好。(模型过于复杂)。主要原因就是我们数据原始的特征中有一些嘈杂的信息,我们的模型一直尝试去兼兼顾数据的各个测试点。我们可以通过消除关联较强的特征、交叉验证以及正则化来解决过拟合现象。
反馈拟合曲线时,则为如下图:
在这里插入图片描述

四、L2正则化

我们发现,之所以造成过拟合现象是由于模型过于复杂,而过多的嘈杂或者高度关联的特征是造成过拟合这一现象的主要原因,L2正则化就是为了将这些特征的权重大小W都降到接近于零的状态。
岭回归·:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.metrics import mean_absolute_error


def main_2():
    """
    岭回归
    :return:
    """
    # 导入数据
    lb = load_boston()

    # 划分数据
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    # 标准化数据
    # 标准化特征值
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    # 标准化目标值
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # 预测数据
    rdg = Ridge(alpha=1)
    rdg.fit(x_train, y_train)
    print("超参数为:", rdg.coef_)

    y_predict = std_y.inverse_transform(rdg.predict(x_test))
    print("预测的结果为:", y_predict)

    print("结果为:", mean_absolute_error(std_y.inverse_transform(y_test), y_predict))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值