正规方程,梯度下降,岭回归——机器学习【百变AI秀】
@TOC
悄悄介绍自己:
作者:神的孩子在跳舞
本人是大四的小白,在山西上学,学习的是python方面的知识,希望能找到一个适合自己的实习公司,哪位大佬看上我的可以留下联系方式我去找您,或者加我微信chenyunzhiLBP
一. 介绍
- 定义:线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。
- 公式:y=kx+b
- 特征值与目标值之间建立了一个关系,这个关系可以理解为线性模型
- 非线性:y=kx2+b
1. 1 线性回归API介绍——LinearRegression
- 获取数据集
- 机器学习
#导入线性回归API
from sklearn .linear_model import LinearRegression
import numpy as np
#生成数据数据
x = [[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]
#模型训练
#1.实例化一个估计器
estimator=LinearRegression()
#2. 调用fit方法,进行训练
estimator.fit(x,y)
#查看系数值
coef=estimator.coef_
print("系数值:\n",coef)# [2.22073791 2.65648855]就可以知道x中两列的数乘什么值可以的到y值
#预测:
pre=estimator.predict([[80,100]])
print("预测值(目标值):\n",pre)
系数值:
[0.3 0.7]
预测值(目标值):
[94.]
二. 线性回归的损失和优化
-
损失函数:预测值减真实值的平方求和(最小二乘法)
-
如何减小损失函数:
(1)正规方程:调整系数(w)的矩阵(适合样本特征较少的情况) (2)梯度下降法 -- 循序渐进 举例: 山 -- 可微分的函数 山底 -- 函数的最小值 梯度的概念 单变量 -- 切线 多变量 -- 向量 梯度下降法中关注的两个参数 α -- 就是步长 步长太小 -- 下山太慢 步长太大 -- 容易跳过极小值点(*****) 为什么梯度要加一个负号 梯度方向是上升最快方向,负号就是下降最快方向 (3)梯度下降法和正规方程对比: 梯度下降 正规方程 需要选择学习率 不需要 需要迭代求解 一次运算得出 特征数量较大可以使用 需要计算方程,时间复杂度高O(n3)
2.1 全梯度下降算法(FG)
计算所有样本的误差平均值,作为我的目标函数
缺点:数据量太大
2.2 随机梯度下降算法(SG)
只取其中一个样本,通过一个样本来反复的重复的下降迭代
缺点:一个不能代表全部
2.3 小批量梯度下降算法(mini-batch)
选取一部分来进行迭代更新
缺点:对其他样本不公平
2.4 随机平均梯度下降算法(SAG)
首先计算一个权重维度,就是外面有很多个样本,算的时候算出来一个权重样本给赋值到样本中,样本有了这个权重以后,下一次在计算的时候,我依旧把这个权重带到这个样本里面进行计算.如此,每一轮更新仅需计算一个样本的梯度,计算成本等同于SG,但收敛速度快得多。
三. 波士顿房价预测——正规方程(线性回归)
均方误差:真实值减预测值的平方求和除于所有样本的值
导入对应API
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#线性回归
from sklearn.metrics import mean_squared_error#模型评估
3.1 获取数据
boston=load_boston()
boston
部分数据:
{'data': array([[6.3200e-03, 1.8000e+01, 2.3100e+00, ..., 1.5300e+01, 3.9690e+02,
...
23.1, 19.7, 18.3, 21.2, 17.5, 16.8, 22.4, 20.6, 23.9, 22. , 11.9]),
'feature_names': array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7'),
3.2 数据基本处理
#数据集划分
x_train, x_test, y_train, y_test = train_test_split(boston.data,boston.target,test_size=0.2)
x_train
部分数据:
array([[6.6170e-02, 0.0000e+00, 3.2400e+00, ..., 1.6900e+01, 3.8244e+02,
9.9700e+00],
...,
[5.4250e-02, 0.0000e+00, 4.0500e+00, ..., 1.6600e+01, 3.9560e+02,
6.2900e+00]])
3.3 特征工程 标准化
transfer=StandardScaler()#实例化一个对象
x_train=transfer.fit_transform(x_train)#通过transform进行转换
x_test=transfer.fit_transform(x_test)
x_train
部分数据:
array([[-0.3787068 , -0.51054284, -1.09701944, ..., -0.69607865,
0.26568234, -0.32873461],
...,
[-0.38005317, -0.51054284, -0.97801505, ..., -0.83515668,
0.4119297 , -0.86543003]])
3.4机器学习(线性回归)
estimator=LinearRegression()#实例化一个对象
estimator.fit(x_train,y_train)#训练
print("这个模型的偏置是:\n",estimator.intercept_)
这个模型的偏置是:
22.930198019801995
3.5 模型评估
#预测值和准确率
y_pre=estimator.predict(x_test)
print("预测值:\n",y_pre)
score=estimator.score(x_test,y_test)
print("准确率:\n",score)
#均方误差
ret=mean_squared_error(y_test,y_pre)#输出测试的目标值和预测后的预测值
print("均方误差是:\n",ret)
预测值:
[27.2896495 14.9985836 20.11931172 20.78720261 8.36920169 16.54422763
...
33.51147164 8.14587979 8.80369598 25.18907243 25.66926574 20.9526319
23.15306736 25.19316154 22.7180993 20.67159295 17.03417655 18.92520514]
准确率:
0.6694454216146718
均方误差是:
31.60855906567943
四 波士顿房价预测——梯度下降(SGDRegressor)
api:
sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
- loss – 损失 (最小二乘)
- learning_rate – 学习率
一般学习率都是进行动态的更新,也可以指定常数,但是不推荐。
from sklearn.linear_model import SGDRegressor#梯度下降
4.1 修改一下机器学习
#修改一下机器学习
estimator=SGDRegressor(max_iter=10000,learning_rate="constant",eta0=0.000001)#实例化一个对象,max_iter迭代几次,learning_rate学习率,eta设置学习率
estimator.fit(x_train,y_train)#训练
print("这个模型的偏置是:\n",estimator.intercept_)
这个模型的偏置是:
[21.43629149]
4.2 重新模型评估
#预测值和准确率
y_pre=estimator.predict(x_test)
print("预测值:\n",y_pre)
score=estimator.score(x_test,y_test)
print("准确率:\n",score)
#均方误差
ret=mean_squared_error(y_test,y_pre)#输出测试的目标值和预测后的预测值
print("均方误差是:\n",ret)
预测值:
[25.29790506 14.11914061 19.48652432 19.74929904 6.48583548 13.37014642
...
32.58145984 7.03392801 7.19451762 24.52285962 24.28395461 18.7156821
21.33737494 23.77922648 18.49322604 19.06555468 16.46683163 20.78219838]
准确率:
0.6802348744819791
均方误差是:
30.57684121772666
出现以下警告:修改成这样子:SGDRegressor(max_iter=1000)
五. 波士顿房价预测——岭回归(RidgeCV)
标准化:是对前面一些方法的封装,在使用线性回归,梯度下降,岭回归,我们会涉及到数据大小的计算,都需要特征工程里面的把数据变成到特定范围内(标准化),在进行值的变换
API——Ridge:
Ridge方法相当于SGDRegressor(penalty=‘l2’, loss=“squared_loss”),只不过SGDRegressor实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG)
sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
参数介绍
- 具有l2正则化的线性回归
- alpha:正则化力度,也叫 λ,通过这个力度来进行响应值的判断,值越大,正则化力度越大,相应的系数会越小,默认值是1
- solver:会根据数据自动选择优化方法 sag:如果数据集、特征都比较大,选择该SAG随机梯度下降优化
- normalize:默认进行标准化处理 normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
- Ridge.coef_:回归权重
- Ridge.intercept_:回归偏置
API——RidgeCV:
这个API封装的更牛逼:可以把λ对应的值,可以通过网格搜索进行值的传递
sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)
-
具有l2正则化的线性回归,可以进行交叉验证
-
coef_:回归系数
代码:
from sklearn.linear_model import RidgeCV#岭回归
修改一下机器学习
estimator=RidgeCV(alphas=(0.001,0.1,1,1.0))#实例化一个对象,自动选择一个参数看看那个最好
输出:
这个模型的偏置是:
22.54529702970301
预测值:
[20.80073917 22.01968705 22.07129549 13.1739321 29.19152411 33.26611376
...
31.36346221 25.80495191 10.39900086 25.39191069 16.09318826 24.79786881]
准确率:
0.7216861974681366
均方误差是:
23.6001418609719
本人博客:https://blog.csdn.net/weixin_46654114
本人b站求关注:https://space.bilibili.com/391105864
转载说明:跟我说明,务必注明来源,附带本人博客连接。
请给我点个赞鼓励我吧
- 点赞
- 收藏
- 关注作者
评论(0)