机器学习-线性回归算法(房价预测项目)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介


线性回归(Linear Regression)是回归任务中最常见的算法,利用回归方程对自变量和因变量进行建模,且因变量和自变量之间是线性关系而得名,从而可以根据已知数据预测未来数据,如房价预测、PM2.5预测等。

其中,只有一个自变量则称为一元线性回归,包含多个自变量则成为多元线性回归。

如下图,根据已知数据点(蓝色),建模得到红色的回归方程,表示自变量和因变量关系,从而可以输入新的自变量,得到预测值(因变量)。
在这里插入图片描述

预测函数定义为:
h ( w ) = w 1 x 1 + w 2 x 2 + ⋅ ⋅ ⋅ + w d x d + b h(w)=w_1x_1+w_2x_2+···+w_dx_d+b h(w)=w1x1+w2x2++wdxd+b

向量形式为:
h ( w ) = w T x h(w)=\bold{w^T}\bold{x} h(w)=wTx
其中 w T = ( b w 1 ⋅ ⋅ ⋅ w d ) , x = ( 1 x 1 ⋅ ⋅ ⋅ x d ) \bold{w^T}=\begin{gathered}\begin{pmatrix} b\\ w_1\\···\\w_d \end{pmatrix}\end{gathered},\bold{x}=\begin{gathered}\begin{pmatrix} 1\\ x_1\\···\\x_d \end{pmatrix}\end{gathered} wT=bw1wd,x=1x1xd

也就是说我们需要确定 w \bold{w} w b b b的值,来构建预测函数。

假设随机初始化 w \bold{w} w b b b后,我们得到一个预测函数 h w h_w hw,我们的目标就是希望 h w h_w hw尽可能贴近目标函数。那又要如何评价当前构建出来的模型怎么样,评价两个模型的优劣,并如何向目标函数不断靠近呢?

即使用损失函数和优化算法。

损失函数


损失函数就是定义当前函数和目标函数之间的差异,并且我们期望这个差异(损失)越小越好。

使用误差平方和SSE来表示损失,即预测值和真实值差的平方求和,该方法也称为最小二乘法,二乘即平方的意思,求最小的损失。

总损失定义为:
J ( w ) = 1 2 ∑ i = 1 m ( h w ( x i ) − y i ) 2 = 1 2 ( x w − y ) 2 J(w)=\frac{1}{2}\sum_{i=1}^m(h_w(x_i)-y_i)^2=\frac{1}{2}(\bold{x}\bold{w}-\bold{y})^2 J(w)=21i=1m(hw(xi)yi)2=21(xwy)2
其中 h w ( x i ) h_w(x_i) hw(xi)表示训练样本 i i i的预测值, y i y_i yi是训练样本 i i i的真实值。

也就是使下图中黄色长度之和最小。
在这里插入图片描述

优化算法

正规方程


利用高中知识,求一个函数的最小值,我们可以求导,在导数为0处取得最小值。
这也是为什么损失函数乘以 1 2 \frac{1}{2} 21,为了求导后可以约掉。

w \bold{w} w求导:
( 1 2 ( x w − y ) 2 ) ′ = 0 ( x w − y ) x = 0 ( x w − y ) ( x x T ) = 0 ( x w − y ) ( x x T ) ( x x T ) − 1 = 0 x w − y = 0 x w = y x T x w = x T y ( x T x ) − 1 ( x T x ) w = ( x T x ) − 1 x T y w = ( x T x ) − 1 x T y (\frac{1}{2}(\bold{x}\bold{w}-\bold{y})^2)^{'}=0\\ (\bold{x}\bold{w}-\bold{y})\bold{x}=0\\ (\bold{x}\bold{w}-\bold{y})(\bold{x}\bold{x}^T)=0\\ (\bold{x}\bold{w}-\bold{y})(\bold{x}\bold{x}^T)(\bold{x}\bold{x}^T)^{-1}=0\\ \bold{x}\bold{w}-\bold{y}=0\\ \bold{x}\bold{w}=\bold{y}\\ \bold{x}^T\bold{x}\bold{w}=\bold{x}^T\bold{y}\\ (\bold{x}^T\bold{x})^{-1}(\bold{x}^T\bold{x})\bold{w}=(\bold{x}^T\bold{x})^{-1}\bold{x}^T\bold{y}\\ \bold{w}=(\bold{x}^T\bold{x})^{-1}\bold{x}^T\bold{y} (21(xwy)2)=0(xwy)x=0(xwy)(xxT)=0(xwy)(xxT)(xxT)1=0xwy=0xw=yxTxw=xTy(xTx)1(xTx)w=(xTx)1xTyw=(xTx)1xTy

一顿操作之后,也就是说如果 x T x \bold{x}^T\bold{x} xTx可逆(是正定矩阵),我们就可以直接求得最小损失对应的 w \bold{w} w
但是该方法适合样本特征数比较小的情况,不然矩阵太大了运算也很慢,因为复杂度是O(N3)。

使用numpy和scipy提供的矩阵运算,可以得到代码实现:

def Regres(X, Y):
    x = mat(X)  # 创建矩阵
    y = mat(Y).T  # 处理y为一列
    if linalg.det(x.T * x) == 0.0:  # 不可逆
        return 0
    else:
        return (x.T * x).I * (x.T * y)

梯度下降


如果可逆,通过正规方程可以一步到位求得最优模型的参数 w \bold{w} w。但如果不可逆,就不能使用该方法了。

使用梯度下降可以求得最小的损失值,其主要思想是求偏导按照梯度上升最快的方向进行求解,取其梯度反方向,即梯度下降。

比如三维特征中,其平面图可以像是山峰和谷底,那我们就是要从山峰出发,从最陡(梯度最大)的方向进行下山,从而到达谷底取最小值,但往往可能陷入其它谷底,只取到了极小值,可以修改步长(学习率)。

梯度下降算法内容较多,可见另一篇:浅谈梯度下降与模拟退火算法

在这里插入图片描述
上图摘自网络。

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

项目实战


使用波士顿房价数据集,sklearn内置了该数据集,也是Kaggle中的一个入门练习。共506条数据,13个特征。
在这里插入图片描述

sklearn库提供了两个线性模型API:

  1. LinearRegression()正规方程

fit_intercept:默认True,是否计算偏置
normalize:默认False,是否中心化
copy_X:默认True,否则X会被改写
n_jobs:默认为1,表示使用CPU的个数。当-1时,代表使用全部CPU

LinearRegression.coef_:回归系数
LinearRegression.intercept_:偏置

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 正规方程
# 获取数据
boston = load_boston()
# 划分训练集测试集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=20221001)
# 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 训练模型
model = LinearRegression()
model.fit(x_train, y_train)
# 测试模型
y_pre = model.predict(x_test)
print("预测值:", y_pre)
# 评估模型
print("准确率:", model.score(x_test, y_test))
print("均方误差:", mean_squared_error(y_test, y_pre))

在这里插入图片描述

  1. SGDRegressor()随机梯度下降

loss:损失函数,squared_loss最小二乘法
fit_intercept:是否计算偏置
learning_rate:学习率,“constant”:eta = eta0;“optimal”:eta = 1.0 / (alpha * (t + t0));“invscaling”:eta = eta0 / pow(t, power_t)

SGDRegressor.coef_:回归系数
SGDRegressor.intercept_:偏置

from sklearn.datasets import load_boston
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 随机梯度下降
# 获取数据
boston = load_boston()
# 划分训练集测试集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=20221001)
# 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 训练模型
model = SGDRegressor()
model.fit(x_train, y_train)
# 测试模型
y_pre = model.predict(x_test)
print("预测值:", y_pre)
# 评估模型
print("准确率:", model.score(x_test, y_test))
print("均方误差:", mean_squared_error(y_test, y_pre))

在这里插入图片描述
使用深度学习-Pytorch库求解,可查看另一篇博客Pytorch-张量tensor详解(线性回归实战)

原创不易,请勿转载本不富裕的访问量雪上加霜
博主首页:https://wzlodq.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤

  • 15
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
机器学习是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是人工智能的核心,是使计算机具有智能的根本途径。   基于数据的机器学习是现代智能技术中的重要方面,研究从观测数据出发寻找规律,利用这些规律对未来数据或无法观测的数据进行预测,包括模式识别、神经网络等在内,现有机器学习方法共同的重要理论基础之一是统计学。支持向量机是从统计学发展而来的一种新型的机器学习方法,在解决小样本、非线性和高维的机器学习问题中表现出了许多特有的优势,但是,支持向量机方法中也存在着一些亟待解决的问题,主要包括:如何用支持向量机更有效的解决多类分类问题,如何解决支持向量机二次规划过程中存在的瓶颈问题、如何确定核函数以及最优的核参数以保证算法的有效性等。   本文详细介绍机器学习的基本结构、发展过程及各种分类,系统的阐述了统计学习理论、支持向量机理论以及支持向量机的主要研究热点,包括求解支持向量机问题、多类分类问题、参数优化问题、核函数的选择问题等,并在此基础上介绍支持向量机在人脸识别中的应用,并通过仿真实验证明了算法的有效性。   学习是人类具有的一种重要智能行为,但究竟什么是学习,长期以来却众说纷纭。社会学家、逻辑学家和心理学家都各有其不同的看法。按照人工智能大师西蒙的观点,学习就是系统在不断重复的工作中对本身能力的增强或者改进,使得系统在下一次执行同样任务或相同类似的任务时,会比现在做得更好或效率更高。西蒙对学习给出的定义本身,就说明了学习的重要作用。在人类社会中,不管一个人有多深的学问,多大的本领,如果他不善于学习,我们都不必过于看重他。因为他的能力总是停留在一个固定的水平上,不会创造出新奇的东西。但一个人若具有很强的学习能力,则不可等闲视之了。机器具备了学习能力,其情形完全与人类似。   什么是机器学习?迄今尚没有统一的定义,由其名字可理解为机器学习是研究如何使用机器来模拟人类学习活动的一门学科。稍微严格的提法是机器学习是一门研究机器获取新知识和新技能,并识别现有知识的学问。这里所说的“机器”,指的就是计算机,现在是电子计算机,以后还可能是种子计算机、光子计算机或神经计算机等等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾仄lo咚锵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值