鸢尾花一元线性回归的进一步完善:1.用到训练集和测试集2.评估指标采用MSE和RMSE,针对三种梯度下降方法进行对比分析。

目录

一、什么是MSE、RMSE和MAE

二、代码示例

总结

参考文献


一、什么是MSE、RMSE和MAE

MSE 指的是均方误差(Mean Squared Error),是一种常见的回归模型评估指标。在回归模型中,我们的目标是预测一个连续的输出值,而MSE则是用来度量模型的预测值与真实值之间误差平方的平均值。

这个公式计算出每个样本预测值与真实值之差的平方,然后将结果相加并求平均值,得到了一个评估模型的均方误差值。

通常,我们希望 MSE 越小越好,也就是模型的预测能力越强。至于说MSE不够直观,所以有时候我们也会使用它的平方根来表示误差,即均方根误差(RMSE)。

在评估模型时,通常会将数据集随机划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型在未知数据上的预测性能。因此,模型的评估是指在测试集上进行的

MAE指的是平均绝对误差(Mean Absolute Error),是一种常见的回归模型评估指标。与MSE类似,MAE用于度量模型的预测值与真实值之间的差距大小。不同的是,MAE计算的是每个样本预测值与真实值之间差异的绝对值的平均值。

MAE越小越好,表示模型的预测能力越强。

 在MAE相同的情况下,RMSE更能显示出其微小的差别。

MAS和MSE的对比:

MAS和MSE都是评估回归模型的常用指标,如果数据集中有离群值(即异常值),那么MAE比MSE更加适合作为评估回归模型的指标,鲁棒性更高,因为它能够更好地处理离群值。但是,如果数据集中没有离群值或者离群值很少,MSE可能更加敏感并且更能体现模型的细微差别,因此在这种情况下将MSE作为评估指标更加合适。

什么是鲁棒性:

鲁棒性(Robustness)是指系统或方法对于噪声、异常值数据缺失、参数扰动等输入变化的变化能力。在机器学习、数据挖掘、统计学等领域中,鲁棒性通常是指算法对输入数据变化稳定性可靠性

例如,在回归问题中,如果一个模型对于某个特定值的输入变化非常敏感,那么它的鲁棒性较差。如果一个模型可以对噪声或异常值较好地处理,那么它的鲁棒性较好。同样,在聚类和分类问题中,一个模型能够在数据缺失或输入参数扰动下稳定运行,并且在不同输入及参数变化情况下保持较高的性能表现,也说明其具有较强的鲁棒性。

在实际应用中,鲁棒性是非常重要的性质之一。因为在实际场景中数据通常是不完美的存在异常值、噪声等问题,一个具有良好鲁棒性的模型或算法可以减小数据问题带来的影响,提高模型的可靠性和泛化性能。

二、代码示例

下面是使用BGD、SGD和MBGD三种梯度下降方法进行一元线性回归,并基于MSE和RMSE指标对三种方法进行比较的代码示例。

#train_test_split 函数将数据集划分为训练集和测试集
from sklearn.metrics import accuracy_score
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.linear_model import SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
from sklearn import metrics
# Load iris dataset and extract two features
iris = load_iris()
X = iris.data[:, :2]  # Only consider two features
y = iris.target

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Batch Gradient Descent
model_bgd = SGDRegressor(learning_rate='constant', eta0=0.01, max_iter=1000, tol=1e-3)
model_bgd.fit(X_train, y_train)

# Stochastic Gradient Descent
model_sgd = SGDRegressor(learning_rate='constant', eta0=0.01, max_iter=1000, tol=1e-3)
model_sgd.fit(X_train, y_train)

# Mini-batch Gradient Descent
model_mbgd = SGDRegressor(learning_rate='constant', eta0=0.01, max_iter=1000, tol=1e-3)
model_mbgd.fit(X_train, y_train)

# Make predictions on testing set
y_pred_bgd = model_bgd.predict(X_test)
y_pred_sgd = model_sgd.predict(X_test)
y_pred_mbgd = model_mbgd.predict(X_test)


# Compute mean squared error for each model  MSE
mse_bgd = mean_squared_error(y_test, y_pred_bgd)
mse_sgd = mean_squared_error(y_test, y_pred_sgd)
mse_mbgd = mean_squared_error(y_test, y_pred_mbgd)

#Compute RMSE 均方根 误差
rmse_bgd = np.sqrt(mse_bgd)
rmse_sgd = np.sqrt(mse_sgd)
rmse_mbgd = np.sqrt(mse_mbgd)

# Print mean squared error for each model
print("Batch Gradient Descent MSE : ", mse_bgd)
print("Stochastic Gradient Descent MSE : ", mse_sgd)
print("Mini-batch Gradient Descent MSE: ", mse_mbgd)

# Print mean Root squared error for each model
print("Batch Gradient Descent RMSE : ", rmse_bgd)
print("Stochastic Gradient Descent RMSE : ", rmse_sgd)
print("Mini-batch Gradient Descent RMSE: ", rmse_mbgd)

# Plot training data and regression lines
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.Set1, edgecolor='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

# Batch Gradient Descent
m_bgd = model_bgd.coef_[0]
b_bgd = model_bgd.intercept_
plt.plot(X_train[:, 0], m_bgd * X_train[:, 0] + b_bgd, color='blue', linewidth=2)

# Stochastic Gradient Descent
m_sgd = model_sgd.coef_[0]
b_sgd = model_sgd.intercept_
plt.plot(X_train[:, 0], m_sgd * X_train[:, 0] + b_sgd, color='red', linewidth=2)

# Mini-batch Gradient Descent
m_mbgd = model_mbgd.coef_[0]
b_mbgd = model_mbgd.intercept_
plt.plot(X_train[:, 0], m_mbgd * X_train[:, 0] + b_mbgd, color='green', linewidth=2)

plt.legend(['Batch GD', 'SGD', 'Mini-batch GD'])
plt.show()


# accuracy1 = r2_score(y_test, y_pred_bgd)
# print("Batch Gradient Descent精确率:", y_pred_mbgd)

accuracy1 = metrics.r2_score(y_test, y_pred_bgd)
print("Batch Gradient Descent精确率:", accuracy1)
accuracy2 = metrics.r2_score(y_test, y_pred_sgd)
print("Stochastic Gradient Descent精确率:", accuracy2)
accuracy3 = metrics.r2_score(y_test, y_pred_mbgd)
print("Mini-batch Gradient Descent精确率:", accuracy3)

运行结果:

总结

        上述代码执行后会输出在训练集和测试集上使用MSE和RMSE计算得到的BGD、SGD和MBGD的性能评估指标,经多次运行对比:对于鸢尾花数据集,我们可以看到,MBGD方法更稳定些,比起BGD和SGD方法在测试集上分别取得了更低的MSE和RMSE值,因此我们可以认为MBGD方法的性能更优秀一些。

参考文献

 [EB/OL].https://www.bilibili.com/video/BV1wi4y157Tt/?spm_id_from=333.337.search-card.all.click&vd_source=ce838d56b689e47d2bdd968af2d91d20,2020-12-2
 [EB/OL].https://www.bilibili.com/video/BV1Qi4y157BF/?spm_id_from=333.788.recommend_more_video.0&vd_source=ce838d56b689e47d2bdd968af2d91d20,2020-12-20

猜你喜欢

转载自blog.csdn.net/zhu_xian_gang/article/details/130154605
今日推荐