如何判断线性回归模型(Linear Regression)的好坏

本文旨在对刚学了一点Linear Regression理论知识, 还不知道代码如何实现,以及代码复现后查看哪些参数可以确定线性回归模型训练的好坏的同学,有些许启发.

本文参考公众号’酷酷的算法’ 按照官方文档修订了R方的公式

一. 模型训练

一般我们需要通过模型求weight和bias, 但这次为了方便验证,我们假设已知方程 f ( x ) = 3 x + 4 f(x) = 3x +4 f(x)=3x+4来模拟实验环境, weight和bias是3和4.

x x x: 通过random.uniform()来获得已知的特征矩阵
通过random.normal()来生成噪声, 和已知方程合并生成y

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(24)
x=np.random.uniform(0,10,size=100) #左闭右开 随机生成浮点数  已知的特征矩阵
#x =np.random.randint(a,b) 左闭右开, 随机生成整数
X=x.reshape(-1,1) ##reshape新数组为1列, 以便
y=3*x+4+np.random.normal(0,1,100) # y是真实值
plt.scatter(x,y)
plt.show()

在这里插入图片描述

查看数据 如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接下来就是最激动人心的训练模型阶段(.fit)

fit函数

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)

Output:

LinearRegression()

训练完成后即可得出weight和bias

LinearRegression.coef_ 回归系数 即 权重weight

lin_reg.coef_  #表示直线的斜率. 回归系数越大表示X 对y影响越大, 正回归系数表示y 随X增大而增大,负回归系数表示y 随X增大而减小

Output:

array([3.00103731])

LinearRegression.intercept_ : 截距 即 bias

lin_reg.intercept_  #表示直线在y轴上的截距,代表直线的起点

Output:

4.048208007900303

因此, 预测值y_hat, 即可根据上面得出的weight和bias代入方程得出, 代码如下图:

y_hat=lin_reg.coef_[0]*x+lin_reg.intercept_

plt.scatter(x,y) #散点图
plt.plot(np.sort(x),y_hat[np.argsort(x)],color='r')  
#np.sort 对给定的数组的元素进行排序 
#np.argsort(x) 将x中的元素从小到大排列, 提取其对应的index
plt.show()

在这里插入图片描述

y_hat 由方程求得, 数值如下:

在这里插入图片描述

如果直接使用LinearRegression.predict(X), 所得数值与方程求得数值相同

在这里插入图片描述

二. 模型判断优劣 (4中方法,最常用的是第四种R方)

数值约接近1, 代表模型拟合越好.

2.1 均方误差MSE(MeanSquaredError)

1 m ∑ i = 1 m ( y − y ^ ) 2 \frac1m \sum_{i=1}^m(y -\hat y)^2 m1i=1m(yy^)2

使用样本的真实值减去样本的预测值,然后平方(因为可能减出来的是负数),假设一共m个样本,乘以1/m以便最终值和样本个数无关

from sklearn.metrics import mean_squared_error
MSE=mean_squared_error(y,y_hat)
MES

Output:

0.9255820462274633

2.2 均方根误差RMSE(RootMeanSquaredError)

1 m ∑ i = 1 m ( y − y ^ ) 2 \sqrt{\frac1m \sum_{i=1}^m(y -\hat y)^2} m1i=1m(yy^)2
RMSE是MSE的平方根

from math import sqrt
RMSE=sqrt(mean_squared_error(y,y_hat))
RMSE

Output:

0.962071746922995

2.3 平均绝对误差MAE (MeanAbsoluteError)

1 m ∑ i = 1 m ∣ y − y ^ ∣ \frac1m \sum_{i=1}^m|y -\hat y| m1i=1myy^

MAE的计算方法和MSE的计算方法不同在于抵消符号使用的是绝对值的方法

from sklearn.metrics import mean_absolute_error
MAE=mean_absolute_error(y,y_hat)
MAE

Output:

0.7953110680751729

2.4 R方 ( R 2 R^2 R2) (R_Squared) 最好的标准

在这里插入图片描述

R方也叫确定系数(coefficient of determination)
R 2 = 1 − ∑ i ( y − y ^ ) 2 ∑ i ( y − y ‾ ) 2 R^2 = 1- \frac{ \sum_{i}(y-\hat y)^2}{ \sum_{i}(y-\overline{y} )^2} R2=1i(yy)2i(yy^)2

from sklearn.metrics import r2_score
R2=r2_score(y,y_hat)
R2

Output:

0.987840340927941

注意: 默认LinearRegression对象中直接封装了一个成员函数,即R方,调用函数并传入需要预测的特征矩阵以及每个样本的真实值

lin_reg.score(X,y)

Output:

0.987840340927941
### 构建和应用线性回归模型 对于构建和应用线性回归模型来预测北京的数据(如房价、气温),可以采用`scikit-learn`库中的工具。下面是一个简单的例子,展示如何使用波士顿房价数据集作为示例来进行线性回归分析[^2]。 #### 数据准备 首先导入必要的包并加载数据: ```python from sklearn import datasets import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 加载波士顿房价数据集作为一个替代案例 boston = datasets.load_boston() df = pd.DataFrame(boston.data, columns=boston.feature_names) df['PRICE'] = boston.target # 将目标变量加入到DataFrame中 ``` #### 划分训练集与测试集 为了评估模型性能,需要将原始数据划分为训练集和测试集两部分: ```python X = df.drop('PRICE', axis=1).values y = df['PRICE'].values.reshape(-1, 1) # 使用train_test_split函数划分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` #### 创建并拟合模型 创建一个线性回归实例,并通过调用`.fit()`方法对其进行训练: ```python model = LinearRegression() # 训练模型 model.fit(X_train, y_train) ``` #### 预测与评估 完成上述步骤之后就可以利用已有的模型对未来数据做出预测,并计算误差指标以衡量其准确性: ```python # 对测试集做预测 predictions = model.predict(X_test) # 输出均方差(MSE)以及决定系数(R^2 score),用于评价模型好坏 print(f'Mean squared error: {mean_squared_error(y_test, predictions)}') print(f'Coefficient of determination (R^2): {r2_score(y_test, predictions)}') ``` 以上过程展示了基本的流程,在实际操作过程中可能还需要针对具体情况进行特征工程处理、参数调整等工作。如果要应用于北京的具体数据,则需替换为相应的本地化数据源,比如来自网络爬取或其他官方渠道发布的统计数据[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值