一、线性回归的原理
1、线性回归应用场景
如何判定一个问题是回归问题的,目标值是连续型的数据的时候
房价预测
销售额度预测
贷款额度预测、利用线性回归以及系数分析因子
2、线性回归定义
线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式
找到一种函数关系,来表示特征值和目标值之间的关系
3、函数关系
(1)首先假定特征值x1、x2、x3
(2)目标值是h(w)
(3)每个特征前还有个系数,w1、w2、w3,叫做权重值,也叫回归系数
(4)右边+b,叫做偏置系数
(5)只有一个自变量的情况称为单变量回归,大于一个自变量情况的叫做多元回归
用习惯的写法:
y = w1x1 + w2x2 + w3x3 + ... + wnxn + b
= wTx + b
PS:wT叫做w的转置
例子:
期末成绩:0.7×考试成绩 + 0.3×平时成绩
预测房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率
4、广义线性模型
线性回归当中的关系有两种,一种是线性关系,另一种是非线性关系。在这里我们只能画一个平面更好去理解,所以都用单个特征举例子
(1)线性关系
特征只有一个房屋面积,预测房屋价格,在一个平面当中,可以找到一条直线去拟合他们之间的关系,y = kx + b
如果有两个特征:
要拟合x1、x2和y之间的关系,y = w1x1 + w2x2 + b
如果在单特征与目标值的关系呈直线关系,或者两个特征与目标值呈现平面的关系
更高维度的我们不用自己去想,记住这种关系即可
(2)非线性关系
为什么非线性关系,也叫线性模型
线性模型
自变量一次
y = w1x1 + w2x2 + w3x3 + ... + wnxn + b
参数一次
y = w1x1 + w2x1^2 + w3x1^3 + w4x2^3 + ... + b
就是w和x有一个是一次的,不是多次的,都可以叫线性模型
(3)线性关系&线性模型
线性关系一定是线性模型,线性模型不一定是线性关系
二、线性回归的损失和优化原理
1、目标:求模型参数
模型参数能够使得预测准确
2、预测房屋价格
真实关系:真实房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率
随意假定关系:预测房子价格 = 0.25×中心区域的距离 + 0.14×城市一氧化氮浓度 + 0.42×自住房平均房价 + 0.34×城镇犯罪率
当我们把特征值代入到假定的关系当中,预测价格和真实价格肯定有一个误差,如果我们有一种方法,将这个误差不断的减少,让它最终接近于0的话,是不是就意味着模型参数比较准确了
3、真实值和预测值之间的差距如何去衡量
衡量的关系,叫做损失函数/cost/成本函数/目标函数
目标:希望找到所有真实的样本,到预测的距离之和比较小,可以求出比较合适的权重和偏置
4、损失函数
y1:真实值
hw(x1):预测值
预测值-真实值,再求个平方,因为预测值有可能小于真实值
这个公式又叫最小二乘法,有计算平方,又希望这个损失越小越好
为什么不用绝对值:
(1)如果不加绝对值或者平方,距离是会相互抵消的,这是不正确的
(2)加绝对值也就是平方再开根号,而且绝对值求导麻烦,所以直接用了平方
如何去减少这个损失,使我们预测的更加准确些?既然存在了这个损失,我们一直说机器学习有自动学习的功能,在线性回归这里更是能够体现。这里可以通过一些优化方法去优化(其实是数学当中的求导功能)回归的总损失!
5、优化算法
正规方程和梯度下降,正规方程相当于一个天才,梯度下降相当于一个勤奋努力的普通人
6、正规方程(用的少)
通过一个矩阵运算,先求特征值转置,然后乘以它本身,再求一个逆,再乘以它的转置,再乘以y,直接求出w权重
理解:X为特征值矩阵,y为目标值矩阵。直接求到最好的结果
缺点:当特征过多过复杂时,求解速度太慢并且得不到结果
7、梯度下降(常用)
一开始随便给一组权重和偏置,不断的改进、试错
第二组的w1、w0等于上一组的w1、w0减去一个数
我们通过两个图更好理解梯度下降的过程:
理解:α为学习速率(步长),需要手动指定(超参数),α旁边的整体表示方向(坡度最陡的)
沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新w值
使用:面对训练数据规模十分庞大的任务,能够找到较好的结果
8、动态图演示
三、线性回归API
1、sklearn.linear_model.LinearRegression(fit_intercept=True)
通过正规方程优化
fit_intercept:是否计算偏置(截距)
查看参数
LinearRegression.coef_:回归系数
LinearRegression.intercept_:偏置
2、sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
通过梯度下降优化,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型
loss:损失函数
loss="squared_loss",普通最小二乘法
fit_intercept:是否计算偏置
learning_rate:学习率(步长),指定学习率算法
'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_:偏置
四、波士顿房价预测
1、数据集地址
下载数据集:https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data
该数据集统计了13种可能影响房价的因素和该类型房屋的均价,期望构建一个基于13个因素进行房价预测的模型
2、分析流程
流程:
1)获取数据集
2)划分数据集
3)特征工程
无量纲化 - 标准化
4)预估器流程
fit() --> 模型
coef_ intercept_
5)模型评估
3、代码 day03_machine_learning.py
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, SGDRegressordef linear1():"""正规方程的优化方法对波士顿房价进行预测"""# 1、获取数据boston = load_boston()# 2、划分数据集x_train,x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=10)# 3、标准化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 Nonedef linear2():"""梯度下降的优化方法对波士顿房价进行预测"""# 1、获取数据boston = load_boston()# 2、划分数据集x_train,x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=10)# 3、标准化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 Noneif __name__ == "__main__":# 代码1:正规方程的优化方法对波士顿房价进行预测linear1()# 代码2:梯度下降的优化方法对波士顿房价进行预测linear2()
运行结果:
正规方程-权重系数为:[-1.16537843 1.38465289 -0.11434012 0.30184283 -1.80888677 2.341711660.32381052 -3.12165806 2.61116292 -2.10444862 -1.80820193 1.19593811-3.81445728]
正规方程-偏置为:21.93377308707127
梯度下降-权重系数为:[-1.10621345 1.29133856 -0.27846867 0.33474439 -1.69384501 2.41354660.29053621 -3.08390938 2.01002437 -1.44580391 -1.77085656 1.20016946-3.77661902]
梯度下降-偏置为:[21.9475731]
五、回归的性能评估
1、均方误差(Mean Squared Error)MSE评价机制
MSE 计算模型的预测值 Ŷ 与真实值 Y 的接近程度
2、sklearn.metrics.mean_squared_error(y_true, y_pred)
均方误差回归损失
y_true:真实值
y_pred:预测值
return:浮点数结果
3、修改day03_machine_learning.py
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
from sklearn.metrics import mean_squared_errordef linear1():"""正规方程的优化方法对波士顿房价进行预测"""# 1、获取数据boston = load_boston()# 2、划分数据集x_train,x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=10)# 3、标准化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、模型评估y_predict = estimator.predict(x_test)print("预测房价:\n", y_predict)error = mean_squared_error(y_test, y_predict)print("正规方程-均方误差为:\n", error)return Nonedef linear2():"""梯度下降的优化方法对波士顿房价进行预测"""# 1、获取数据boston = load_boston()# 2、划分数据集x_train,x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=10)# 3、标准化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、模型评估y_predict = estimator.predict(x_test)print("预测房价:\n", y_predict)error = mean_squared_error(y_test, y_predict)print("梯度下降-均方误差为:\n", error)return Noneif __name__ == "__main__":# 代码1:正规方程的优化方法对波士顿房价进行预测linear1()# 代码2:梯度下降的优化方法对波士顿房价进行预测linear2()
运行结果:
正规方程-权重系数为:[-1.16537843 1.38465289 -0.11434012 0.30184283 -1.80888677 2.341711660.32381052 -3.12165806 2.61116292 -2.10444862 -1.80820193 1.19593811-3.81445728]
正规方程-偏置为:21.93377308707127
预测房价:[31.11439635 31.82060232 30.55620556 22.44042081 18.80398782 16.2762532236.13534369 14.62463338 24.56196194 37.27961695 21.29108382 30.6125824127.94888799 33.80697059 33.25072336 40.77177784 24.3173198 23.2977324125.50732006 21.08959787 32.79810915 17.7713081 25.36693209 25.0381105932.51925813 20.4761305 19.69609206 16.93696274 38.25660623 0.7015249932.34837791 32.21000333 25.78226319 23.95722044 20.51116476 19.537272583.87253095 34.74724529 26.92200788 27.63770031 34.47281616 29.8051127118.34867051 31.37976427 18.14935849 28.22386149 19.25418441 21.7149039538.26297011 16.44688057 24.60894426 19.48346848 24.49571194 34.4891563526.66802508 34.83940131 20.91913534 19.60460332 18.52442576 25.0017879919.86388846 23.46800342 39.56482623 42.95337289 30.34352231 16.893355923.88883179 3.33024647 31.45069577 29.07022919 18.42067822 27.4431489719.55119898 24.73011317 24.95642414 10.36029002 39.21517151 8.3074326218.44876989 30.31317974 22.97029822 21.0205003 19.99376338 28.647549730.88848414 28.14940191 26.57861905 31.48800196 22.25923033 -5.3597325221.66621648 19.87813555 25.12178903 23.51625356 19.23810222 19.046423427.32772709 21.92881244 26.69673066 23.25557504 23.99768158 19.2845825921.19223276 10.81102345 13.92128907 20.8630077 23.40446936 13.9168948428.87063386 15.44225147 15.60748235 22.23483962 26.57538077 28.6420362324.16653911 18.40152087 15.94542775 17.42324084 15.6543375 21.0413626433.21787487 30.18724256 20.92809799 13.65283665 16.19202962 29.2515560313.28333127]
正规方程-均方误差为:32.44253669600673
梯度下降-权重系数为:[-1.10720669 1.25231283 -0.31509564 0.34535296 -1.64340471 2.455330740.24591813 -3.00623279 1.86680194 -1.35635736 -1.75927819 1.21751662-3.75820164]
梯度下降-偏置为:[21.93446341]
预测房价:[30.5553054 31.9029657 30.49644841 23.21944515 18.96884856 16.1863263636.24105194 14.87804697 24.3895523 37.20352522 21.5386604 30.6095118727.65148152 33.50851129 33.21249389 40.83380512 24.46605375 22.8883214825.52501927 21.58868475 32.80656665 17.73245419 25.66824551 25.0860486432.97047549 20.30353258 19.68164294 16.91361879 38.1855976 0.2776093232.54896674 32.02576312 25.94574949 23.97039625 20.35535178 19.780879863.89351738 34.35969722 26.90276862 27.75996947 34.54094573 29.5499409618.27465483 31.39534921 18.00180158 28.4390917 19.23254806 21.5245233237.97845293 16.57097091 24.5471993 19.39657317 24.21252437 34.922785526.80416589 34.74661413 21.23727026 19.59775567 18.39910461 25.052394220.19548887 23.82772896 40.02092877 43.04844803 30.42801759 17.2069933723.93074887 3.06161671 31.11592258 29.56981815 18.4009017 27.3705844719.36967055 24.60927521 25.32075297 10.35369309 39.25900753 8.179007518.11059373 30.75396941 22.93518314 21.69853793 20.21950513 28.4923592131.07597036 28.29348444 26.43666514 31.70687029 22.21769412 -5.4580019221.63087532 19.7545147 25.08781498 23.61546397 18.84729974 19.1030671627.25447935 22.00263139 26.57769298 23.53325788 23.87869699 19.5128190521.00527045 10.1261844 14.03654344 21.12885311 23.21744834 15.1778369128.87985666 15.68906271 15.61491721 22.063714 26.98392894 28.6436898424.01307784 18.36664466 15.87301799 17.66160742 15.84512198 20.8421702733.17275758 30.60002844 21.15789543 14.11621048 16.30693791 29.1771885813.16315128]
梯度下降-均方误差为:32.55418193625462
六、正规方程和梯度下降对比
1、对比
梯度下降 | 正规方程 |
需要选择学习率 | 不需要 |
需要迭代求解 | 一次运算得出 |
特征数量较大可以使用 | 需要计算方程,时间复杂度高O(n3) |
2、选择
小规模数据:
LinearRegression(不能解决拟合问题)
岭回归
大规模数据:
SGDRegressor
七、梯度下降预估器优化方法-GD、SGD、SAG
1、GD
梯度下降(Gradient Descent),原始的梯度下降法需要计算所有样本的值才能够得出梯度,计算量大,所以后面才有会一系列的改进
2、SGD
随机梯度下降(Stochastic gradient descent)是一个优化方法。它在一次迭代时只考虑一个训练样本
SGD的优点是:
高效
容易实现
SGD的缺点是:
SGD需要许多超参数:比如正则项参数、迭代数
SGD对于特征标准化是敏感的
3、SAG
随机平均梯度法(Stochasitc Average Gradient),由于收敛的速度太慢,有人提出SAG等基于梯度下降的算法
Scikit-learn:SGDRegressor、岭回归、逻辑回归等当中都会有SAG优化
参考资料:
通俗易懂讲解均方误差 (MSE) - haltakov - 知乎 (zhihu.com)