12天summer----初级算法梳理-线性回归算法梳理

本文详细介绍了线性回归算法,包括单变量和多变量线性回归。通过最小二乘法寻找最佳拟合模型,降低预测误差。在单变量线性回归中,展示了如何用房间数量预测波士顿房屋价格,并使用R^2、MAE、RMSE等指标评估模型。多变量线性回归则涉及正则化技术如岭回归和Lasso回归。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线性回归,应用广泛、原理相对简单。主要分为单变量线性回归和多元线性回归。单变量线性回归是在两个变量之间建立类似线性方程的拟合模型,以一个变量去预测另一个变量。

1. 用于回归的线性模型

对于回归问题,线性模型预测的一般公式如下:ŷ = w[0] * x[0] + w[1] * x[1] + … + w[p] * x[p] + b

这里 x[0] 到 x[p] 表示单个数据点的特征(本例中特征个数为 p+1),w 和 b 是学习模型的参数,ŷ 是模型的预测结果。

对于单一特征的数据集,公式如下:ŷ = w[0] * x[0] + b,这就是高中数学里的直线方程。这里 w[0] 是斜率,b 是 y 轴偏移。对于有更多特征的数据集,w 包含沿每个特征坐标轴的斜率。或者,你也可以将预测的响应值看作输入特征的加权求和,权重由 w 的元素给出(可以取负值)。

2. 线性回归(又名普通最小二乘法)线性回归,或者普通最小二乘法(ordinary least squares,OLS),是回归问题最简单也最经典的线性方法。线性回归寻找参数 w 和 b,使得对训练集的预测值与真实的回归目标值 y之间的均方误差最小。均方误差(mean squared error)是预测值与真实值之差的平方和除以样本数。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。

单变量线性回归

案例:波士顿房屋价格的拟合与预测

from sklearn.datasets import load_boston  #从sklearn数据集库导入boston数据
import matplotlib.pyplot as plt  #导入matplotlib库
import numpy as np  #导入numpy库
import pandas as pd  #导入pandas库
boston=load_boston() #从读取的房价数据存储在boston变量中
boston.keys() #打印boston包含元素
boston.feature_names #打印boston变量名

Boston房屋价格数据集中data即为特征变量,target为目标变量。选取data中的RM,target是MEDV变量进行单变量线性回归。

###选取RM作为特征变量
bos = pd.DataFrame(boston.data) #将data转换为DataFrame格式以方便展示
bos[5].head() #data的第6列数据为RM

###选取MEDV作为目标变量
bos_target = pd.DataFrame(boston.target) #将target转换为DataFrame格式以方便展示
bos_target.head()

绘制房屋价格、每个房屋的房间数量的散点图,由散点图可以看出房屋价格、每个房屋的房间数量存在一定的线性变化趋势,即每个房屋的房间数量越多、房屋价格越高。

import matplotlib.font_manager as fm  #导入matplotlib中的文字管理库
X = bos.iloc[:,5:6]  #选取data中的RM变量
y =bos_target  #设定target为y
#定义自定义字体,文件名是系统中文字体
myfont = fm.FontProperties(fname='C:/Windows/Fonts/msyh.ttc')
plt.scatter(X, y)
plt.xlabel(u'房屋平均房间数', fontproperties=myfont) #x轴标签设定文字为中文msyh格式
plt.ylabel(u'房屋价格', fontproperties=myfont) #y轴标签设定文字为中文msyh格式
plt.title(u'RM与MEDV的关系', fontproperties=myfont)  #标题
plt.show()

 

数据集划分 

from sklearn.model_selection import train_test_split #导入数据划分包 
#以25%的数据构建测试样本,剩余作为训练样本
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25)

模型求解与预测

from sklearn.linear_model import LinearRegression #使用LinearRegression库
lr=LinearRegression()  #设定回归算法
lr.fit(X_train,y_train) #使用训练数据进行参数求解

#求解截距项为:',lr.intercept_
#'求解系数为:',lr.coef_

 

y_hat = lr.predict(X_test) #对测试集的预测
y_hat[0:9]  #打印前10个预测值

 

模型评估

在求得测试集y的预测值y_hat基础上,可以对模型进行评价。首先将得到的测试集中y_test与其对应的y_hat采用图形展示。

plt.figure(figsize=(10,6))  #设置图片尺寸
t = np.arange(len(X_test))  #创建t变量
#绘制y_test曲线
plt.plot(t, y_test, 'r', linewidth=2, label='y_test') 
#绘制y_test曲线
plt.plot(t, y_hat, 'g', linewidth=2, label='y_hat') 
plt.legend() #设置图例
plt.show()

 

图形显示,测试集中房屋价格(MEDV)的预测值基本较好地拟合了真实值y_test的变化趋势。采用评估指标拟合优度R^2、MAE、RMSE对预测效果进行评价。单变量线性回归的评价方法,比如R方,还有均方误差或者均方根误差。

from sklearn import metrics
from sklearn.metrics import r2_score
# 拟合优度R2的输出方法一
print ("r2:",lr.score(X_test, y_test)) 
# 拟合优度R2的输出方法二
print ("r2_score:",r2_score(y_test, y_hat)) 
# 用scikit-learn计算MAE
print ("MAE:", metrics.mean_absolute_error(y_test, y_hat))
# 用scikit-learn计算MSE
print ("MSE:", metrics.mean_squared_error(y_test, y_hat))
# # 用scikit-learn计算RMSE
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat)))

 多变量线性回归

多元线性回归引入正则化、岭回归、Lasso回归等。

#多变量线性回归
from sklearn.datasets import load_boston  #从sklearn数据集库导入boston数据
import matplotlib.pyplot as plt  #导入matplotlib库
import numpy as np  #导入numpy库
import pandas as pd  #导入pandas库
boston=load_boston() #从读取的房价数据存储在boston变量中
bos = pd.DataFrame(boston.data) #将data转换为DataFrame格式以方便展示
###选取MEDV作为目标变量
bos_target = pd.DataFrame(boston.target) #将target转换为DataFrame格式以方便展示
###多变量的数据可视化散点图
bos.hist(xlabelsize=12,ylabelsize=12,figsize=(12,7))  #调整直方图尺寸
plt.show()

from sklearn.model_selection import train_test_split #导入数据划分包 
X=bos.iloc[:,0:-1]
y=bos.MEDV
#以25%的数据构建测试样本,剩余作为训练样本
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25)
from sklearn.linear_model import LinearRegression #使用LinearRegression库
lr=LinearRegression()  #设定回归算法
lr.fit(X_train,y_train) #使用训练数据进行参数求解

#'求解截距项为:' 
lr.intercept_

#'求解系数为:'
lr.coef_

 

根据求出的参数对测试集进行预测 

y_hat = lr.predict(X_test) #对测试集的预测
y_hat[0:9]  #打印前10个预测值

 

plt.figure(figsize=(10,6))  #设置图片尺寸
t = np.arange(len(X_test))  #创建t变量
#绘制y_test曲线
plt.plot(t, y_test, 'r', linewidth=2, label='y_test') 
#绘制y_test曲线
plt.plot(t, y_hat, 'g', linewidth=2, label='y_hat') 
plt.legend() #设置图例
plt.show()

对预测结果进行评价,采用评估指标拟合优度R^2、MAE、MSE、RMSE对预测效果进行评价 

from sklearn import metrics
from sklearn.metrics import r2_score
# 拟合优度R2的输出方法一
print ("r2:",lr.score(X_test, y_test)) 
# 拟合优度R2的输出方法二
print ("r2_score:",r2_score(y_test, y_hat)) 
# 用scikit-learn计算MAE
print ("MAE:", metrics.mean_absolute_error(y_test, y_hat))
# 用scikit-learn计算MSE
print ("MSE:", metrics.mean_squared_error(y_test, y_hat))
# # 用scikit-learn计算RMSE
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat)))

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值