一天一个机器学习小知识——线性回归

本文详细介绍了线性回归的基本原理,包括模型构建、最小化平方损失函数的策略和梯度下降算法。随后,通过sklearn库展示了从数据预处理到模型评估的实际操作,并探讨了线性回归的优缺点,适合初学者理解统计学习基本概念。
摘要由CSDN通过智能技术生成


前言

本栏目主要介绍机器学习中的算法模型,具体包含算法推导应用场景代码实现以及模型优缺点这几个模块。本文先介绍机器学习中最简单的一个算法模型——线性回归。

一、算法推导

李航老师的《统计学习方法》中提到,统计学习方法都是由模型策略算法构成的,因此本文在算法推导也主要从这三部分进行展开讨论。

1.模型

模型通俗来说就是最后要得到一个什么样的方程。线性回归的模型如下:
f ( x ) = w 0 T x + b = w T x f(x) = w_{0}^Tx + b=w^Tx f(x)=w0Tx+b=wTx
其中在训练阶段 f ( x ) 和 x f(x)和x f(x)x都是已知的, w 和 b w和b wb是需要估计的参数。

2.策略

有了模型,接下来就需要考虑按照什么样准则学习或选择最优的模型。选择最优模型的原则一般是最小化损失函数,所以策略其实是给出损失函数。线性回归的损失函数一般采用平方损失函数:
J ( w ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 = 1 m ∑ i = 1 m ( w T x i − y i ) 2 J(w)=\frac{1}{m} \sum_{i=1}^{m}\left(f\left(\boldsymbol{x}_{i}\right)-y_{i}\right)^{2}=\frac{1}{m} \sum_{i=1}^{m}\left(w^Tx_{i}-y_{i}\right)^{2} J(w)=m1i=1m(f(xi)yi)2=m1i=1m(wTxiyi)2
其中 f ( x i ) f(x_{i}) f(xi)是模型的预测值, y i y_{i} yi是真实值。

3.算法

算法部分就是通过最小化Loss来求出参数 w w w,求最小值的方法有很多,最常用的是通过梯度下降迭代求得最小值。但是对于线性回归的损失函数,我们有更简单的方式: J ( w ) J(w) J(w)直接对 w w w求导,令其导数等于0。
∂ J ( w ) ∂ w = 0 \frac{\partial J(w)}{\partial w}=0 wJ(w)=0
得到:
X T X w = X y X^{T} X w=X y XTXw=Xy
其中 X X X是样本矩阵,求得 w 的 最 优 解 w的最优解 w
w ∗ = ( X T X ) − 1 X T y w^{*}=\left(X^{T} X\right)^{-1} X^{T} y w=(XTX)1XTy
w ∗ w^* w代入模型中即可得到最终方程。

二、应用场景

线性回归由于比较简单,可解释性强,因此在经济学这种重解释的领域应用的比较多,绝大部分的计量方法都是基于线性回归的。平时生活的一些比较简单的相关关系也可以使用线性回归来进行预测。

三、代码实现

这里主要使用sklearn这个库来实现机器学习算法。

1.导入相关库

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error
import pandas as pd
import numpy as np

2.读取样例数据

data = fetch_california_housing() # 获取样例数据,这里的数据是加利福利亚的放假数据
X = pd.DataFrame(data.data,columns=data.feature_names)
y = data.target

在这里插入图片描述

"""
MedInc:该街区住户的收入中位数
HouseAge:该街区房屋使用年代的中位数
AveRooms:该街区平均的房间数目
AveBedrms:该街区平均的卧室数目
Population:街区人口
AveOccup:平均入住率
Latitude:街区的纬度
Longitude:街区的经度
"""

3.划分训练集和测试集

X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.3,random_state=0)

4.建立模型

model = LinearRegression().fit(X_train,y_train)
y_pred = model.predict(X_test)
最终模型参数

在这里插入图片描述

5.评估模型

计算均方误差MSE

print('MSE:%.3f'%(mean_squared_error(y_test,y_pred)))
MSE:0.543

其实上面用的方法是留出法,我们也可以使用交叉验证法来计算模型误差。这样就把划分训练集和测试集、建立模型以及评估模型这几步合并在一起。

mse = -np.mean(cross_val_score(LinearRegression(),X,y,cv=10,scoring='neg_mean_squared_error'))
print('MSE:%.3f'%(mse))
MSE:0.551

可以看到两者比较接近。

四、优缺点

1.优点

(1)可解释性强,可以清晰的知道每个特征对模型的影响
(2)简单快速

2.缺点

(1)只适用于数据之间的线性关系,但现实生活中大多数特征之间的关系是非线性的。
(2)需要满足一些假设,特征之间不能存在共线性

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值