线性回归、岭回归
线性回归 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))
输出结果:
......
线性回归和岭回归对比
岭回归:回归得到的回归系数更符合实际,更可靠,另外能让估计参数的波动范围变小,变得更稳定.在存在病态数据偏多的研究中有较大的实用价值.