一、线性回归的原理
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
python
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=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 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=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 None
if __name__ == "__main__":
# 代码1:正规方程的优化方法对波士顿房价进行预测
linear1()
# 代码2:梯度下降的优化方法对波士顿房价进行预测
linear2()
运行结果:
python
正规方程-权重系数为:
[-1.16537843 1.38465289 -0.11434012 0.30184283 -1.80888677 2.34171166
0.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.4135466
0.29053621 -3.08390938 2.01002437 -1.44580391 -1.77085656 1.20016946
-3.77661902]
梯度下降-偏置为:
[21.9475731]