线性回归、岭回归

 线性回归   Linear_model.LinearRegression,SGDRegressor

## 分类问题是离散型数据,回归问题是连续型数据  ##

 

 

 

 

线性关系模型:

一个通过属性的线性组合来进行预测的函数:
f(x) = w1x1 + w2x2 + ... + wdxd + b
w为权重,b成为偏置项,可以理解为:w0*1

什么是线性回归?

定义线性回归通过一个或者多个自变量(特征)与因变量(目标值)之间进行建模的回归分析。其中可
以为一个或多个自变量之间的线性组合(线性回归的一种)
一元线性回归:涉及到的变量只有一个
多远线性回归:涉及到的变量两个或两个以上

 

  # T为转置 #

 

 

 

矩阵乘法
(二维 乘法)
    (m行 , n列) * (n行 , l列) = (m行 , l列)
  各自一一对应相乘相加的到m行的值,形成l列

  

 

 


回归算法的评估:

  预测结果和真实值有一定的误差。

 

 

 

 

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

优化方法

最小二乘法之正规方程

 

 

 ## -1是倒数的意思,矩阵 * 逆矩阵= 同阶的单位矩阵(对角线为1,其余为0) ##

 

 最小二乘法之梯度下降

 

 

 

 

 正规方程和梯度下降(图示,无动态图):

 

 ## 一图为不断上下训练缩小损失值,找到最合适的线 二图梯度下降,依次梯度下降,直到最小值. ##

 线性回归正规方程,梯度下降API:

sklearn.linear_model.LinearRegression
  正规方程
  普通最小二乘线性回归
  coef_:回归系数
sklearn.linear_model.SGDRegressor
  梯度下降
  coef_:回归系数

 

回归性能评估

 

 

sklearn.metrics.mean_squared_error(y_true,y_pred)
    均方误差回归损失
    y_true:真实值
    y_pred:预测值
    return:浮点数结果
注:真实值,预测值为标准化之前的值

 


案例  波士顿房价预测:sklearn 提供的数据集

 

 

 案例流程:
1. 获取波士顿地区的房价数据
2. 数据集划分(获取的数据为处理好的,直接使用)
3. 训练与测试集的数据标准化处理
4. 使用最简单的线性回归模型和梯度下降对房价进行预测

 

from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge #最小二乘法:正规方程和梯度下降,
from sklearn.model_selection import train_test_split #数据集划分
from sklearn.datasets import load_boston #波士顿房价数据
from sklearn.preprocessing import StandardScaler #标准化处理
from sklearn.metrics import mean_squared_error # 均方误差评价机制

# 线性回归预测房价
# 1.获取数据
lb =load_boston()
# 2.分割数据集
x_train ,x_test ,y_train , y_test =train_test_split(lb.data,lb.target,test_size=0.25)

# 3.标准化处理,统一标准化,
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))) #不知道有多少行,填-1,有多少是多少
y_test=std_y.transform(y_test.reshape((-1,1)))

# 正规方程预测
lr=LinearRegression()
lr.fit(x_train,y_train)

print('正规方程求解系数:',lr.coef_,'\n')
y_lr_predict =lr.predict(x_test)  #标准化之后的值
y_lr_predict=std_y.inverse_transform(y_lr_predict)  # 转换为原始的数据
print('正规方程房价预测结构:',y_lr_predict)
print('正规方程的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))

正规方程👆,梯度下降👇:

# 梯度下降
sgd=SGDRegressor()
sgd.fit(x_train,y_train.reshape(-1,))  # 梯度下降的目标值,需要为一维的

# 回归系数
print('梯度下降求解系数:',sgd.coef_,'\n')
y_sgd_predict =sgd.predict(x_test)  #标准化之后的值
y_sgd_predict=std_y.inverse_transform(y_sgd_predict)  # 反标准化,还原
print('梯度下降房价预测结构:',y_sgd_predict)
print('梯度下降的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))

正规方程和梯度下降输出:

 

 

 

 

 

 总结:

 

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

 


岭回归   Ridge

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

 

   分析图一:经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的。简单认为有这些特征的都是天鹅,因为机器学习到的天鹅特征太少,导致区分标准太粗糙,不能准确识别出天鹅。

 

   分析图二:机器通过这些图片来学习天鹅的特征,经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的弯曲的,天鹅的脖子损失长长有点弯曲度,天鹅的整个体型像一个2,且略大于鸭子。这时候机器学习已经基本会人为天鹅的羽毛都是白色的,以后看到羽毛是黑色的天鹅就会人为不是天鹅。


模型复杂度

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

 

   ### 依次为:欠拟合,拟合,过拟合。θ为特征数,维数  ###

  模型复杂的原因是数据的特征和目标值直接的关系,不仅仅是线性关系

欠拟合:

个假设在训练数据上不能获得更好的拟合,但是在训练数据外的数据集上也不能很好地拟合数据,此
时认为这个假设出现了欠拟合现象。(模型过于简单)
    原因:学习到的数据特征过少.
    解决办法:增加数据的特征数量.

过拟合:

    一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好地拟
合数据,此时认为这个假设出现了过拟合线性。(模型过于复杂)
    原因:原始特征过多,存在一些嘈杂特征,模型过去复杂是因为模型尝试去兼顾各个测试数据点.
    解决办法:
        · 进行特征选择,消除关联大的特征 (很难做。数据过大,特征超多)
        · 交叉验证 (让所有数据都有过训练)
        · 正则化 (了解)

L2正则化:  

 

 

  作用:可以使得w的每个元素都很小,都接近于0

  优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象

岭回归 → 带有正则化的线性回归,解决过拟合

岭回归API:

sklearn.linear_model.Ridge(alpha=1.0)
    具有l2正则化的线性最小二乘法
    alpha:正则化力度 λ 0~1 1~10
    coef_:回归系数

 

使用案例,对上面的波士顿房价,进行岭回归:

# 岭回归
rd =Ridge(alpha=1.0)
rd.fit(x_train,y_train)

print("岭回归求解系数",rd.coef_,'\n')
y_rd_predict =rd.predict(x_test)  #标准化之后的值
y_rd_predict=std_y.inverse_transform(y_rd_predict)  # 反标准化,还原
print('岭回归房价预测结构:',y_rd_predict)
print('岭回归的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))

输出结果:

 

 ......

 


 

线性回归和岭回归对比

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

 

posted @ 2020-04-01 16:50  逍遥大帝  阅读(1627)  评论(0编辑  收藏  举报