黑马机器学习笔记(四)线性回归

线性回归

欠拟合与过拟合

对线性回归做改进得到了岭回归算法

逻辑回归,是一个分类算法

模型保存与加载(不用重复训练)

无监督学习(以Kmeans为例)

如何判断一个问题是不是回归问题?
看目标值是不是连续的数据

什么是线性回归?
应用场景:房价预测
线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。
特点:只有一个自变量的情况称为单变量回归,大于一个自变量情况的叫做多元回归
h(w)是目标值
在这里插入图片描述在这里插入图片描述广义的线性模型
非线性关系 (参数是一次的,自变量不是一次的),即满足参数是一次的也可以叫线性模型,但已经不是线性关系
在这里插入图片描述
线性关系一定是线性模型,线性模型不一定是线性关系

线性回归的损失和优化原理
求模型参数,使得模型预测准确
初始化时先随意给定参数值,输入一组特征值得到的目标值与真实的目标值之间有一定的误差,如果能够通过一种方法将这种误差不断地减少,最终接近于0,则意味着模型参数比较准确,通过这种方法不断的迭代更新权重和偏置,使得预测值和真实值之间中的差距不断地减小,损失接近于0时的参数即是我们要求的参数

如何衡量预测值与真实值之间的差距?
损失函数(目标函数、成本函数、cost)

在这里插入图片描述损失函数
在这里插入图片描述如何去减少这个损失,使我们预测的更加准确些?既然存在了这个损失,我们一直说机器学习有自动学习的功能,在线性回归这里更是能够体现。这里可以通过一些优化方法去优化(其实是数学当中的求导功能)回归的总损失!!!

优化方法

正规方程(直接求解w)
在这里插入图片描述
在这里插入图片描述

梯度下降(先随便给一组权重和偏置,不断试错,改进)

梯度下降

在这里插入图片描述
理解:α为学习速率,需要手动指定(超参数),α旁边的整体表示方向沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新W值
使用:面对训练数据规模十分庞大的任务 ,能够找到较好的结果

线性回归API

LinearRegression用的是正规方程,SGDRegressor用的是梯度下降
sklearn.linear_model.LinearRegression(fit_intercept=True)
通过正规方程优化
fit_intercept:是否计算偏置
LinearRegression.coef_:回归系数
LinearRegression.intercept_:偏置

sklearn.linear_model.SGDRegressor(loss=“squared_loss”, fit_intercept=True, learning_rate =‘invscaling’, eta0=0.01)
SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型。
loss:损失类型
loss=”squared_loss”: 普通最小二乘法
fit_intercept:是否计算偏置
learning_rate : string, optional
学习率填充
‘constant’: eta = eta0
‘optimal’: eta = 1.0 / (alpha * (t + t0)) [default]
‘invscaling’: eta = eta0 / pow(t, power_t)
power_t=0.25:存在父类当中
对于一个常数值的学习率来说,可以使用learning_rate=’constant’ ,并使用eta0来指定学习率。
SGDRegressor.coef_:回归系数
SGDRegressor.intercept_:偏置
sklearn提供给我们两种实现的API, 可以根据选择使用

波士顿房价预测

1:获取数据集
2:划分数据集
3:特征工程(无量纲化处理–标准化)(比如工资基数较大,而菜价基数较小)
4:预估器流程
5:模型评估

代码

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
def Linear1():
   """
   正规模型的优化方法对波士顿房价进行预测
   """
   #1获取数据集
   boston=load_boston()
   #2划分数据集
   x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
   #特征值boston.data,目标值boston.target,比较梯度下降和正规方程的效果random_state保持一致
   #3标准化(导包 standardscaler)
   transfer=StandardScaler()
   x_train=transfer.fit_transform(x_train)
   x_test=transfer.transform(x_test)
   #4预估器(导入正规方程)
   estimator=LinearRegression()
   estimator.fit(x_train,y_train)#导入训练集的目标值和特征值
   #5得出模型
   print("正规方程权重系数为:\n",estimator.coef_)
   print("正规方程偏置为:\n",estimator.intercept_)
   #6模型评估
   
   return None

def Linear2():
   """
   梯度下降的优化方法对波士顿房价进行预测
   """
   #1获取数据集
   boston=load_boston()
   #2划分数据集
   x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
   #特征值boston.data,目标值boston.target,比较梯度下降和正规方程的效果random_state保持一致
   #3标准化(导包 standardscaler)
   transfer=StandardScaler()
   x_train=transfer.fit_transform(x_train)
   x_test=transfer.transform(x_test)
   #4预估器(导入正规方程)
   estimator=SGDRegressor()
   estimator.fit(x_train,y_train)#导入训练集的目标值和特征值
   #5得出模型
   print("梯度下降权重系数为:\n",estimator.coef_)
   print("梯度下降偏置为:\n",estimator.intercept_)
   #6模型评估
   
   return None

if __name__=="__main__":
    #正规模型的优化方法对波士顿房价进行预测
    Linear1()
    #梯度下降的优化方法对波士顿房价进行预测
    Linear2()

结果

正规方程权重系数为:
 [-0.63330277  1.14524456 -0.05645213  0.74282329 -1.95823403  2.70614818
 -0.07544614 -3.29771933  2.49437742 -1.85578218 -1.7518438   0.8816005
 -3.92011059]
正规方程偏置为:
 22.62137203166228

梯度下降权重系数为:
 [-0.27240108  0.53696638 -0.64692989  0.87562506 -0.69858322  3.18344024
 -0.33745058 -2.17735583  0.75957936 -0.40659529 -1.50892306  0.89870367
 -3.50268629]
梯度下降偏置为:
 [22.12876303]

分析
特征有多少个,权重系数w就有多少个

boston=load_boston()
print("特征数量:\n",boston.data.shape)

可以看出,有13个特征,506个样本

特征数量:
 (506, 13)

在这里插入图片描述

如何衡量线性回归的结果好不好?

引入模型评估方法
回归当中的数据大小不一致,是否会导致结果影响较大。所以需要做标准化处理。同时我们对目标值也需要做标准化处理。

回归性能评估
均方误差(Mean Squared Error)MSE)评价机制:
在这里插入图片描述
在这里插入图片描述

哪一个模型的均方误差小一点,模型效果就好一点

代码

from sklearn.metrics import mean_squared_error
 #6模型评估
   y_predict=estimator.predict(x_test)
   print("预测房价:\n", y_predict)
   error=mean_squared_error(y_test,y_predict)
   print("正规方程均方误差为:\n",error)

   #6模型评估
   y_predict=estimator.predict(x_test)
   print("预测房价:\n", y_predict)
   error=mean_squared_error(y_test,y_predict)
   print("梯度下降均方误差为:\n",error)

结果

预测房价:
 [28.23494214 31.51307591 21.11158648 32.66626323 20.00183117 19.06699551
 21.0961119  19.61374904 19.61770489 32.88592905 20.9786404  27.52841267
 15.54828312 19.78740662 36.89507874 18.81564352  9.34846191 18.49591496
 30.67162831 24.30515001 19.06869647 34.10872969 29.82133504 17.52652164
 34.90809099 26.5518049  34.71029597 27.42733357 19.096319   14.92856162
 30.86006302 15.8783044  37.1757242   7.80943257 16.23745554 17.17366271
  7.46619503 20.00428873 40.58796715 28.93648294 25.25640752 17.73215197
 38.74782311  6.87753104 21.79892653 25.2879307  20.43140241 20.47297067
 17.25472052 26.14086662  8.47995047 27.51138229 30.58418801 16.57906517
  9.35431527 35.54126306 32.29698317 21.81396457 17.60000884 22.07940501
 23.49673392 24.10792657 20.13898247 38.52731389 24.58425972 19.7678374
 13.90105731  6.77759905 42.04821253 21.92454718 16.8868124  22.58439325
 40.75850574 21.40493055 36.89550591 27.19933607 20.98475235 20.35089273
 25.35827725 22.19234062 31.13660054 20.39576992 23.99395511 31.54664956
 26.74584297 20.89907127 29.08389387 21.98344006 26.29122253 20.1757307
 25.49308523 24.08473351 19.89049624 16.50220723 15.21335458 18.38992582
 24.83578855 16.59840245 20.88232963 26.7138003  20.75135414 17.87670216
 24.2990126  23.37979066 21.6475525  36.8205059  15.86479489 21.42514368
 32.81282808 33.74331087 20.62139404 26.88700445 22.65319133 17.34888735
 21.67595777 21.65498295 27.66634446 25.05030923 23.74424639 14.65940118
 15.19817822  3.8188746  29.18611337 20.67170992 22.3295488  28.01966146
 28.59358258]
正规方程均方误差为:
 20.630254348291196
预测房价:
 [27.66363909 30.49605946 20.95212955 31.84830371 20.54695367 18.96940144
 20.647372   19.70065943 19.97196352 31.56739401 20.53653039 25.92409931
 15.00764958 19.6163356  36.28808969 17.4009497  10.80826804 18.60592578
 30.67807547 23.87223308 18.82377759 33.25273579 28.73477636 16.70800683
 33.78446402 24.96350295 32.75360641 27.1845698  18.70117788 17.28903503
 30.07125697 13.17309411 36.56491466 10.41494325 16.56369805 15.51692283
  8.30950345 18.99288915 39.87860832 29.59914769 24.9473262  17.88039965
 39.64957022  6.15908773 20.41712832 23.93321894 21.58719131 20.38976212
 16.35923708 25.97132246  9.56900185 26.14900408 30.16878227 16.57076506
  9.77272199 34.39086185 29.3070208  23.53890718 17.46863613 22.26607107
 22.69026935 22.80244266 20.57906729 37.0564931  26.04335979 19.02383128
 14.45938636  6.3252042  42.21488931 21.33219516 15.13415664 23.42336256
 40.45217331 21.71933353 36.04711631 26.06433739 23.23983732 19.75727425
 25.2602618  25.3647395  30.89442697 19.82334049 23.69792172 30.70169127
 26.56353482 20.53170354 27.64801732 22.85960142 26.11892901 17.34321509
 23.62207936 23.06598961 19.82742576 20.31273894 15.55853688 17.70325571
 23.44432176 16.47933851 19.64172366 26.22651448 20.06747491 18.11691913
 23.09297162 22.2318224  18.90330218 34.97252773 16.25720071 22.65535604
 31.69104792 32.04080276 20.08719511 23.97494715 24.63175838 17.57208693
 21.37694427 21.89842812 27.36225204 25.45620312 22.77565468 13.59313459
 15.87183349  3.05849551 28.08711015 20.44178896 21.68575954 27.39708198
 26.73797763]
梯度下降均方误差为:
 21.716025149651543

分析
可以看出,如果按照默认参数设置的话,正规方程相比于梯度下降,均方误差是要小一点的

调参
在这里插入图片描述constant表示训练过程中学习率不变(默认是0.01,且在训练过程中会变小)

在这里插入图片描述

梯度下降优化器

GD
梯度下降(Gradient Descent),原始的梯度下降法需要计算所有样本的值才能够得出梯度,计算量大,所以后面才有会一系列的改进。
5.2 SGD
随机梯度下降(Stochastic gradient descent)是一个优化方法。它在一次迭代时只考虑一个训练样本。
SGD的优点是:
高效
容易实现
SGD的缺点是:
SGD需要许多超参数:比如正则项参数、迭代数。
SGD对于特征标准化是敏感的。

5.3 SAG
随机平均梯度法(Stochasitc Average Gradient),由于收敛的速度太慢,有人提出SAG等基于梯度下降的算法
Scikit-learn:SGDRegressor、岭回归、逻辑回归等当中都会有SAG优化

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值