机器学习算法基础——线性回归

39.线性回归的定义以及矩阵的运算

回归——目标值连续

线性模型

试图学得一个通过属性的线性组合来进行预测的函数:

f(x)=w1x1+w2x2+…+wdxd+b     

w为权重,b称为偏置项,可以理解为:w0×1

线性回归

 

import numpy as np
a = [[1,2,3,4],[5,6,7,8],[2,3,7,9]]
b = [2,2,2,2]
print(np.multiply(a,b))
[[ 2  4  6  8]
 [10 12 14 16]
 [ 4  6 14 18]]
import numpy as np
a = [[1,2,3,4],[5,6,7,8],[2,3,7,9]]
b = [[2],[2],[2],[2]]
print(np.dot(a,b))
[[20]
 [52]
 [42]]

40.线性回归策略,优化,案例

损失函数

如何去求模型当中的W,使得损失最小? (目的是找到最小损失对应的W值)

正规方程

   

梯度下降

sklearn线性回归正规方程、梯度下降API

  • sklearn.linear_model.LinearRegression 正规方程
  • sklearn.linear_model.SGDRegressor 梯度下降=

波士顿房价数据案例分析流程

  1. 波士顿地区房价数据获取
  2. 波士顿地区房价数据分割
  3. 训练与测试数据标准化处理
  4. 使用最简单的线性回归模型LinearRegression和 梯度下降估计SGDRegressor对房价进行预测
from sklearn.datasets import load_boston
from sklearn.linear_model import  LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def myliner():
    #获取数据
    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))

    #estimator预测
    #正规方程求解方式预测结果
    lr = LinearRegression()
    lr.fit(x_train, y_train)
    print(lr.coef_)
    #预测测试集的房子价格
    y_predict = lr.predict(x_test)
    print("测试集合里面每个房子的预测价格:",std_y.inverse_transform(y_predict))

    #梯度下降去进行房价预测
    sgd = SGDRegressor()
    sgd.fit(x_train, y_train)
    print(sgd.coef_)
    # 预测测试集的房子价格
    y_sgd_predict = sgd.predict(x_test)
    print("测试集合里面每个房子的预测价格:", std_y.inverse_transform(y_sgd_predict))

    return  None
if __name__ == "__main__":
    myliner()

[[-0.1104793   0.11032847  0.0397622   0.08135389 -0.19210311  0.36289619
  -0.02047188 -0.33697462  0.24048481 -0.21689924 -0.21039004  0.10393991
  -0.35926107]]
[-0.08571238  0.10477088 -0.0413873   0.06692462 -0.15353954  0.35267452
 -0.0328122  -0.26335671  0.12334298 -0.09185532 -0.22311585  0.11182096
 -0.32899844]

回归性能评估

sklearn回归评估API

sklearn.metrics.mean_squared_error

mean_squared_error(y_true, y_pred)

  • 均方误差回归损失
  • y_true:真实值
  • y_pred:预测值
  • return:浮点数结果
  • 注:真实值,预测值为标准化之前的值
from sklearn.metrics import mean_squared_error
print("正规方程均方误差:",mean_squared_error(std_y.inverse_transform(y_test),
std_y.inverse_transform(y_predict)))

print("梯度下降均方误差:", mean_squared_error(std_y.inverse_transform(y_test), std_y.inverse_transform(y_sgd_predict)))

41.线性回归两种求解方式总结梯度

下降正规方程对比

1、LinearRegression与SGDRegressor评估

2、特点:线性回归器是最为简单、易用的回归模型。 从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。

  • 小规模数据:LinearRegression(不能解决拟合问题)以及其它欠拟合问题
  • 大规模数据:SGDRegressor

42.过拟合以及欠拟合

过拟合与欠拟合

问题:训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢?

过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)

欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单) 

对线性模型进行训练学习会变成复杂模型

欠拟合原因以及解决办法 

  • 原因: 学习到数据的特征过少
  • 解决办法: 增加数据的特征数量

过拟合原因以及解决办法

  • 原因: 原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
  • 解决办法: (1)进行特征选择,消除关联性大的特征(很难做) (2)交叉验证(让所有数据都有过训练)  (3)正则化(了解)

正则化

  • 作用:可以使得W的每个元素都很小,都接近于0
  • 优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象

43.Ridge岭回归分析

带有正则化的线性回归-Ridge

sklearn.linear_model.Ridge

Ridge

sklearn.linear_model.Ridge(alpha=1.0)

  • 具有l2正则化的线性最小二乘法
  • alpha:正则化力度(0-1)(1-10)
  • coef_:回归系数

观察正则化程度的变化,对结果的影响?

 

from sklearn.datasets import load_boston
from sklearn.linear_model import  LinearRegression,SGDRegressor,Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def myliner():
    #获取数据
    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))

    #岭回归进行房价预测
    rd = Ridge(alpha=1.0)
    rd.fit(x_train, y_train)
    print(rd.coef_)
    # 预测测试集的房子价格
    y_rd_predict = rd.predict(x_test)
    print("测试集合里面每个房子的预测价格:", std_y.inverse_transform(y_rd_predict))
    print("岭回归均方误差:", mean_squared_error(std_y.inverse_transform(y_test), std_y.inverse_transform(y_rd_predict)))
    return  None

if __name__ == "__main__":
    myliner()
岭回归均方误差: 22.239994614677215

线性回归 LinearRegression与Ridge对比

岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研 究中有较大的实用价值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值