多项式回归、R2 和 RMSE

文章介绍了多项式回归模型的构建以及评估指标R2和RMSE的计算方法。通过Python的Scikit-learn库展示了如何获取模型的R2和RMSE值。此外,讨论了非线性回归的概念,包括多项式、指数、对数和Sigmoid回归函数。最后,提供了一个使用多项式回归分析企业成本与利润的例子,并计算了R2值以评估模型性能。

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

要点:

  • 多项式回归模型的搭建


一  简介

R2(决定系数)和RMSE(均方根误差)是常用的回归模型评估指标,用于衡量模型对观测数据的拟合程度和预测精度。以下是它们的计算方法:

  1. R2(决定系数): R2 表示模型对因变量的解释能力,取值范围从 0 到 1,越接近 1 表示模型对数据的拟合程度越好

    计算公式为: R2 = 1 - (SSR / SST) 其中,SSR 是回归平方和(Sum of Squares of Residuals),表示回归模型的拟合误差; SST 是总平方和(Total Sum of Squares),表示总体数据的离散程度。

    R2 的计算结果越接近 1,说明模型能够较好地解释观测数据的变化,拟合效果较好。

  2. RMSE(均方根误差)RMSE 表示模型预测值与实际观测值之间的差异,用于衡量模型的预测精度

    计算公式为: RMSE = sqrt(MSE) 其中,MSE 是均方误差(Mean Squared Error),表示预测值与观测值之间的平均误差的平方。

    RMSE 的计算结果越小,表示模型的预测精度越高,预测值与实际观测值的差异较小。

二  求值方式

在使用机器学习框架或统计软件包进行建模时,通常可以通过相应的函数或方法来获取模型的 R2 和 RMSE 值。

以常见的Python机器学习库Scikit-learn为例,可以使用以下方法来获取 R2 和 RMSE 值:

  • R2(决定系数):

from sklearn.metrics import r2_score

# y_true为实际观测值,y_pred为模型预测值
r2 = r2_score(y_true, y_pred)

这将计算模型的 R2 值,其中 y_true 是实际观测值,y_pred 是模型的预测值。

  • RMSE(均方根误差):

from sklearn.metrics import mean_squared_error

# y_true为实际观测值,y_pred为模型预测值
rmse = mean_squared_error(y_true, y_pred, squared=False)

这将计算模型的 RMSE 值,其中 y_true 是实际观测值,y_pred 是模型的预测值squared=False 参数表示返回的是均方根误差而不是均方误差。

这只是一个示例,具体的方法和函数可能因使用的工具或库而有所差异。在具体使用时,可以查阅所使用工具的文档或参考相应的函数说明来获取模型的 R2 和 RMSE 值。

三 非线性拟合

非线性回归是指将非线性模型应用于回归问题,其中因变量和自变量之间的关系不是线性的。非线性回归函数的选择通常取决于问题的特性和数据的分布。

以下是一些常见的非线性回归函数:

  1. 多项式回归: 多项式回归将自变量的多项式函数引入回归模型中,例如二次、三次或更高次的多项式。其形式为:

    y = a0 + a1*x + a2*x^2 + a3*x^3 + ...
    

    其中 x 是自变量,y 是因变量,a0, a1, a2, a3, ... 是回归系数。

  2. 指数回归: 指数回归将自变量以指数函数的形式引入回归模型中。其形式为:

    y = a*exp(b*x)
    

    其中 x 是自变量,y 是因变量,ab 是回归系数。

  3. 对数回归: 对数回归将自变量以对数函数的形式引入回归模型中。其形式为:

    y = a + b*log(x)
    

    其中 x 是自变量,y 是因变量,ab 是回归系数。

  4. Sigmoid回归(逻辑回归): Sigmoid回归是一种常用的二分类非线性回归方法,它使用Sigmoid函数将线性组合的结果转换为概率值。其形式为:

    y = 1 / (1 + exp(-(a + b*x)))
    

    其中 x 是自变量,y 是概率值,ab 是回归系数。

这只是非线性回归函数的一些示例,实际选择哪种函数取决于具体问题和数据的特征。还有其他许多非线性函数可供选择,您可以根据问题的需要进行调整和扩展。

四  多项式回归

多项式回归参考:多项式回归

线性回归研究的是一个目标变量和一个自变量之间的回归问题,但有时候在很多实际问题中,影响目标变量的自变量往往不止一个,而是多个,比如绵羊的产毛量这一变量同时受到绵羊体重、胸围、体长等多个变量的影响,因此需要设计一个目标变量与多个自变量间的回归分析,即多元回归分析。由于线性回归并不适用于所有的数据,我们需要建立曲线来适应我们的数据,现实世界中的曲线关系很多都是增加多项式实现的,比如一个二次函数模型:

# -*- coding: utf-8 -*-
# By:Eastmount 优快云 2021-07-03
from sklearn.linear_model import LinearRegression     
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt       
import numpy as np

#X表示企业成本 Y表示企业利润
X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]]
Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]]
print('数据集X: ', X)
print('数据集Y: ', Y)

#第一步 线性回归分析
clf = LinearRegression() 
clf.fit(X, Y)                     
X2 = [[400], [750], [950]]
Y2 = clf.predict(X2)
print(Y2)
res = clf.predict(np.array([1200]).reshape(-1, 1))[0]   
print('预测成本1200元的利润:$%.1f' % res) 
plt.plot(X, Y, 'ks')    #绘制训练数据集散点图
plt.plot(X2, Y2, 'g-')  #绘制预测数据集直线

#第二步 多项式回归分析
xx = np.linspace(350,950,100) #350到950等差数列
quadratic_featurizer = PolynomialFeatures(degree = 2) #实例化一个二次多项式
x_train_quadratic = quadratic_featurizer.fit_transform(X) #用二次多项式x做变换
X_test_quadratic = quadratic_featurizer.transform(X2)
regressor_quadratic = LinearRegression()
regressor_quadratic.fit(x_train_quadratic, Y)

#把训练好X值的多项式特征实例应用到一系列点上,形成矩阵
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), "r--",
         label="$y = ax^2 + bx + c$",linewidth=2)
plt.legend()
plt.show()    

这里我们使用R方(R-Squared)来评估多项式回归预测的效果,R方也叫确定系数(Coefficient of Determination),它表示模型对现实数据拟合的程度。计算R方的方法有几种,一元线性回归中R方等于皮尔逊积矩相关系数(Pearson Product Moment Correlation Coefficient)的平方,该方法计算的R方是一定介于0~1之间的正数。另一种是Sklearn库提供的方法来计算R方。R方计算代码如下:

# -*- coding: utf-8 -*-
# By:Eastmount 优快云 2021-07-03
from sklearn.linear_model import LinearRegression     
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt       
import numpy as np

#X表示企业成本 Y表示企业利润
X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]]
Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]]
print('数据集X: ', X)
print('数据集Y: ', Y)

#第一步 线性回归分析
clf = LinearRegression() 
clf.fit(X, Y)                     
X2 = [[400], [750], [950]]
Y2 = clf.predict(X2)
print(Y2)
res = clf.predict(np.array([1200]).reshape(-1, 1))[0]   
print('预测成本1200元的利润:$%.1f' % res) 
plt.plot(X, Y, 'ks')    #绘制训练数据集散点图
plt.plot(X2, Y2, 'g-')  #绘制预测数据集直线

#第二步 多项式回归分析
xx = np.linspace(350,950,100) 
quadratic_featurizer = PolynomialFeatures(degree = 5) 
x_train_quadratic = quadratic_featurizer.fit_transform(X) 
X_test_quadratic = quadratic_featurizer.transform(X2)
regressor_quadratic = LinearRegression()
regressor_quadratic.fit(x_train_quadratic, Y)
#把训练好X值的多项式特征实例应用到一系列点上,形成矩阵
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), "r--",
         label="$y = ax^2 + bx + c$",linewidth=2)
plt.legend()
plt.show()
print('1 r-squared', clf.score(X, Y))
print('5 r-squared', regressor_quadratic.score(x_train_quadratic, Y))

# ('1 r-squared', 0.9118311887769025)
# ('5 r-squared', 0.98087802460869788)

在BP神经网络的应用过程中,计算校正集(训练集)验证集(测试集)的决定系数 \(R^2\)、均方根误差 (RMSE) 相对预测偏差 (RPD),可以帮助我们更全面地了解模型的表现。下面我们将详细说明每个指标的意义及其具体的计算方法,并提供相应的MATLAB代码示例。 ### 决定系数 (\(R^2\)) **意义**: 决定系数反映了回归直线对观测点的拟合程度。它可以告诉我们所建立的数学模型解释了多少比例的数据变异信息。\(R^2\) 的值介于0到1之间,越接近1表明线性关系越好。 **公式**: \[ R^2 = 1 - \frac{\sum_{i=1}^{n}(y_i-\hat{y}_i)^2}{\sum_{i=1}^{n}(y_i-\bar{y})^2}\] - \( y_i \): 实际观测值 - \( \hat{y}_i \): 预测值 - \( \bar{y} \): 所有实际观测值的平均值 #### MATLAB实现: ```matlab function r_squared = calculate_rSquared(y_true, y_pred) % 计算真实值的均值 mu_y_true = mean(y_true); % 使用SSE (Sum Squared Error) SST (Total Sum Square) 来获得Rsquared SSE = sum((y_true(:)-y_pred(:)).^2); % 平方误差总 SST = sum((y_true(:)-mu_y_true).^2); % 总离差平方 r_squared = 1-(SSE/SST); end ``` 然后分别应用此函数来获取训练集 (`inputn`, `output_train`) 测试集 (`inputn_test`, `output_test`) 上的结果: ```matlab % 对于训练集而言: r2_train = calculate_rSquared(output_train', sim(net, inputn)'); % 同样的方法适用于测试集: r2_test = calculate_rSquared(output_test', test_simu'); ``` ### 均方根误差 (RMSE) **意义**: RMSE是一种常见的损失函数,用于量化连续数值型变量间差异的程度。较低的RMSE意味着更好的匹配度或更高的精度。 **公式**: \[ RMSE=\sqrt{\frac{1}{N}\sum_{i=1}^{N}(y_i-\hat{y}_i)^2}\] #### MATLAB实现: ```matlab function rmse_value = calculate_rmse(actual, predicted) N = numel(actual); % 获取数据长度 errors = abs(actual(:)-predicted(:)); % 绝对误差向量 squared_errors = errors.^2; % 求绝对误差的平方 rmse_value = sqrt(sum(squared_errors)/N); end ``` 接着可以在训练集测试集中调用这个自定义函数: ```matlab rmse_train = calculate_rmse(output_train', sim(net, inputn)'); rmse_test = calculate_rmse(output_test', test_simu'); ``` ### 相对预测偏差 (RPD) **意义**: RPD是衡量模型泛化能力外部样品预测准确性的有效工具。较高的RPD通常表示更强的外推能力以及较好的稳定性可靠性。 **公式**: \[ RPD=\frac{s_y}{s_e}\], 其中 \( s_y \) 表示原始响应变量的标准差,而 \( s_e \) 则是指残差(即测量值减去相应预测值)的标准差. #### MATLAB实现: ```matlab function rpd_value = calculate_rpd(y_actual, y_predicted) sy = std(y_actual(:)); residuals = y_actual(:) - y_predicted(:); se = std(residuals); if ~isfinite(se) || se == 0 error('Divide by zero encountered in calculation of RPD.'); else rpd_value = sy / se; end end ``` 并且可以像前面一样应用于训练集测试集: ```matlab rpd_train = calculate_rpd(output_train', sim(net, inputn)'); rpd_test = calculate_rpd(output_test', test_simu'); ``` 总结一下,通过上述提供的三个辅助函数,你可以轻松地从你的BP神经网络模型中提取出关于模型质量的重要反馈——即 \(R^2\)、RMSE RPD。这些统计量不仅能够帮助你判断当前配置下的模型好坏,而且还可以指导后续进一步优化的方向。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值