提示:如何完整的从数据导入到最后模型训练以及模型保存,本集进行介绍。(本集是以回归问题的模型评估为例)
上集回顾
`提示:本集接第三集,完成模型评估,还有漂亮绘图等。
前三集已经介绍了机器学习的通俗解释,以及常见分类,还有机器学习深度学习强化学习的关系和区别。有想看的小伙伴可以翻我主页去找,全部免费哈。
第一集机器学习入门基础介绍
第二集机器学习入门算法介绍
第三集机器学习模型训练
一、什么是模型评估
在机器学习领域,模型评估是至关重要的环节,它能帮助我们判断模型的优劣,选择最适合的模型。对于回归问题,就是看用于预测连续值的模型准不准。通过像均方误差、平均绝对误差等指标,计算模型预测的结果和实际值差多少,差得少就说明模型好,能准确反映数据规律,差得多就需要改进,以此判断模型能不能用、好不好用。
1.评估指标
- 均方误差(MSE):量化整体误差平方均值 均方误差通过计算预测值与真实值差值平方的平均值,来衡量模型预测的准确性。公式为 MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n}\sum_{i = 1}^{n}(y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2 它对较大误差给予了更大的权重,因为误差被平方,这使得 MSE 对异常值较为敏感。例如在房价预测模型中,若有个别样本预测偏差极大,MSE会显著增大。MSE 值越小,说明模型在整体上预测值与真实值的偏差平方和越小,模型性能越好。
- 均方根误差(RMSE):让误差与真实值同单位 均方根误差是均方误差的平方根,即
RMSE
=
1
n
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
\text{RMSE} = \sqrt{\frac{1}{n}\sum_{i = 1}^{n}(y_i - \hat{y}_i)^2}
RMSE=n1i=1∑n(yi−y^i)2。它的优势在于单位与真实值相同,这使得我们能更直观地理解误差的实际大小。比如在预测商品价格时,RMSE
若为 5 元,就意味着平均而言,预测价格与真实价格有 5 元的偏差,相比 MSE,RMSE 在解释误差时更具现实意义。 - 平均绝对误差(MAE):捕捉绝对偏差均值 平均绝对误差计算的是预测值与真实值差值绝对值的平均值,公式为 MAE = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ \text{MAE} = \frac{1}{n}\sum_{i = 1}^{n}|y_i - \hat{y}_i| MAE=n1i=1∑n∣yi−y^i∣相较于 MSE,MAE 没有对误差进行平方处理,所以对异常值的敏感度较低。在一些对异常值不那么敏感的场景,如预测每日平均气温时,MAE能更稳健地反映模型预测值与真实值的平均偏差程度。
- 平均绝对百分比误差(MAPE):呈现相对误差水平 平均绝对百分比误差以百分比形式展现预测误差,公式为 MAPE = 1 n ∑ i = 1 n ∣ y i − y ^ i y i ∣ × 100 % \text{MAPE} = \frac{1}{n}\sum_{i = 1}^{n}\left|\frac{y_i - \hat{y}_i}{y_i}\right| \times 100\% MAPE=n1i=1∑n yiyi−y^i ×100%它反映了预测值相对于真实值的误差情况,能让我们从相对的角度评估模型的准确性。例如在销售预测中,MAPE可以清晰地告诉我们预测销售额与实际销售额的相对偏差,但当真实值为 0 时,该指标无法使用。
- 决定系数( R 2 R^2 R2):衡量模型拟合优度 R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2 = 1 - \frac{\sum_{i = 1}^{n}(y_i - \hat{y}_i)^2}{\sum_{i = 1}^{n}(y_i - \bar{y})^2} R2=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2取值范围在 0 到 1 之间。它表示模型能够解释因变量变异的比例,越接近 1,说明模型对数据的拟合效果越好,能够捕捉到数据中的大部分信息;若接近 0,则表明模型的解释能力较弱。
2.指标之间的关系
-
MSE 作为预测值与真实值差值平方的平均值,是 RMSE 的基础。RMSE 是 MSE的平方根,二者本质上都在衡量预测值与真实值偏差程度,但 RMSE由于开方运算,其数值与真实值单位一致,更便于直观理解误差大小。当数据中存在异常值时,由于 MSE对误差平方计算,会放大异常值的影响,RMSE 也会随之增大,这时候如果 MAE相对较小,就说明模型整体平均偏差不大,只是个别异常样本导致了 MSE 和 RMSE 升高。
-
MAE 计算的是预测值与真实值差值绝对值的平均值,对异常值敏感度低于MSE 和 RMSE。在一些对异常值不太敏感的场景中,MAE能更稳健地反映模型的平均预测偏差。若 MAE 与 MSE、RMSE 数值差异较大,往往意味着数据中存在异常值影响了 MSE 和 RMSE。
-
MAPE以百分比形式展示预测误差,与其他指标关注绝对误差不同,它侧重于体现预测值相对于真实值的误差比例,适用于关注相对误差的场景,如销售预测等。如果MAPE 较大,即便 MAE、MSE 和 RMSE 在可接受范围,也可能意味着模型在某些样本上相对误差较大,需要优化。
-
R 2 R^2 R2用于衡量模型对数据的拟合优度,与 MSE 等指标从误差角度评估不同。越接近 1,表明模型对数据的解释能力越强,MSE等误差指标往往也会相对较小;反之,若接近 0,说明模型拟合效果差,MSE 等误差值会偏大。
提示:在实际应用中,单一指标难以全面评估模型性能,我们需要综合考量这五个指标,根据具体任务需求和数据特点,深入分析它们之间的关系,从而筛选出最适配的模型。
二、完整评估过程
1.评估指标的计算
from prettytable import PrettyTable #可以优美的打印表格结果
from sklearn.metrics import mean_squared_error, mean_absolute_error,r2_score # 导入额外的评估指标
from math import sqrt # 从math模块导入sqrt函数,用于计算平方根
yhat = model.predict(vp_test)
# 使用模型对测试集的输入特征(vp_test)进行预测。
# yhat是模型预测的输出值。
yhat = yhat.reshape(-1, 1)
# 将预测值yhat重塑为二维数组,以便进行后续操作。
predicted_data = m_out.inverse_transform(yhat) # 反归一化
def mape(y_true, y_pred):
# 定义一个计算平均绝对百分比误差(MAPE)的函数。
record = []
for index in range(len(y_true)):
# 遍历实际值和预测值。
temp_mape = np.abs((y_pred[index] - y_true[index]) / y_true[index])
# 计算单个预测的MAPE。
record.append(temp_mape)
# 将MAPE添加到记录列表中。
return np.mean(record) * 100
# 返回所有记录的平均值,乘以100得到百分比。
def evaluate_forecasts(Ytest, predicted_data, n_out):
# 定义一个函数来评估预测的性能。
mse_dic = []
rmse_dic = []
mae_dic = []
mape_dic = []
r2_dic = []
# 初始化存储各个评估指标的字典。
table = PrettyTable(['测试集指标','MSE', 'RMSE', 'MAE', 'MAPE','R2'])
for i in range(n_out):
# 遍历每一个预测步长。每一列代表一步预测,现在是在求每步预测的指标
actual = [float(row[i]) for row in Ytest] #一列列提取
# 从测试集中提取实际值。
predicted = [float(row[i]) for row in predicted_data]
# 从预测结果中提取预测值。
mse = mean_squared_error(actual, predicted)
# 计算均方误差(MSE)。
mse_dic.append(mse)
rmse = sqrt(mean_squared_error(actual, predicted))
# 计算均方根误差(RMSE)。
rmse_dic.append(rmse)
mae = mean_absolute_error(actual, predicted)
# 计算平均绝对误差(MAE)。
mae_dic.append(mae)
MApe = mape(actual, predicted)
# 计算平均绝对百分比误差(MAPE)。
mape_dic.append(MApe)
r2 = r2_score(actual, predicted)
# 计算R平方值(R2)。
r2_dic.append(r2)
if n_out == 1:
strr = '预测结果指标:'
else:
strr = '第'+ str(i + 1)+'步预测结果指标:'
table.add_row([strr, mse, rmse, mae, str(MApe)+'%', str(r2*100)+'%'])
return mse_dic,rmse_dic, mae_dic, mape_dic, r2_dic, table
# 返回包含所有评估指标的字典。
mse_dic,rmse_dic, mae_dic, mape_dic, r2_dic, table = evaluate_forecasts(Ytest, predicted_data, 1)
print(table)#显示预测指标数值
首先,我们使用训练好的模型对测试集数据进行预测,得到预测值 yhat,并对其进行形状重塑和反归一化处理,让预测值回到原始数据的尺度。
为了更全面地评估模型,代码定义了平均绝对百分比误差(MAPE)的计算函数。MAPE 能直观地展示预测值相对真实值的误差比例。接着,evaluate_forecasts 函数对预测结果进行多指标评估。它会计算均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、MAPE 和决定系数(
R
2
R^2
R2)。对于多步预测的情况,函数会按预测步长分别计算各指标。最后,使用 PrettyTable 以美观的表格形式呈现评估结果,让我们能清晰地看到模型在不同指标下的表现,进而判断模型性能的优劣。
示例结果:
数据采用波士顿房价,模型是xgboost的运行结果。
2.绘图展示结果
代码如下(示例):
from matplotlib import rcParams
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块,用于绘图
# config = {
# "font.family": 'serif',
# "font.size": 10,# 相当于小四大小
# "mathtext.fontset": 'stix',#matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大
# "font.serif": ['Times New Roman'],#Times New Roman
# 'axes.unicode_minus': False # 处理负号,即-号
# }
# rcParams.update(config) #设置想要的格式
rcParams.update(plt.rcParamsDefault) # 默认格式
plt.ion()
plt.rcParams['axes.unicode_minus'] = False
# 设置matplotlib的配置,用来正常显示负号。
# 使用赛博朋克风样式
# plt.style.use('cyberpunk')
# 创建一个图形对象,并设置大小为10x2英寸,分辨率为300dpi。
plt.figure(figsize=(8, 2), dpi=300)
x = range(1, len(predicted_data) + 1)
# # 创建x轴的值,从1到实际值列表的长度。
# plt.xticks(x[::int((len(predicted_data)+1))])
# 设置x轴的刻度,每几个点显示一个刻度。
plt.tick_params(labelsize=5) # 改变刻度字体大小
# 设置刻度标签的字体大小。
plt.plot(x, predicted_data, linestyle="--",linewidth=0.8, label='predict',marker = "o",markersize=2)
# 绘制预测值的折线图,线型为虚线,线宽为0.5,标签为'predict'。
plt.plot(x, Ytest, linestyle="-", linewidth=0.5,label='Real',marker = "x",markersize=2)
# 绘制实际值的折线图,线型为直线,线宽为0.5,标签为'Real'。
plt.rcParams.update({'font.size': 5}) # 改变图例里面的字体大小
# 更新图例的字体大小。
plt.legend(loc='upper right', frameon=False)
# 显示图例,位置在图形的右上角,没有边框。
plt.xlabel("Sample points", fontsize=5)
# 设置x轴标签为"样本点",字体大小为5。
plt.ylabel("value", fontsize=5)
# 设置y轴标签为"值",字体大小为5。
plt.title(f"The prediction result:\nMAPE: {mape(Ytest, predicted_data)} %",fontsize=5)
# plt.xlim(xmin=600, xmax=700) # 显示600-1000的值 局部放大有利于观察
# 如果需要,可以取消注释这行代码,以局部放大显示600到700之间的值。
# plt.savefig('figure/预测结果图.png')
# 如果需要,可以取消注释这行代码,以将图形保存为PNG文件。
plt.ioff() # 关闭交互模式
plt.show()
# 显示图形。
这段代码借助matplotlib库绘制回归模型预测结果与真实值的对比图以直观评估模型表现。首先进行配置准备,导入绘图库,将绘图参数重置为默认(也可以自定义,但是自定义代码已被注释),开启交互模式并确保负号正常显示;接着创建图形,设定图形大小和分辨率,生成 x 轴坐标并调整刻度标签字体大小;随后绘制折线,用虚线带圆形标记表示预测值、实线带叉号标记表示真实值;再添加标注,设置图例、坐标轴标签和包含平均绝对百分比误差的标题;最后有可选操作,可局部放大显示或保存图形,关闭交互模式后显示最终图形
示例结果:
注:和上文数据以及使用模型相同。
总结
本文的内容人至此也即将结束,从完成了模型的完整的一次训练,到最后的模型性能评估。基础的机器学习的任务从今天落下帷幕。
下集预告
1.深度学习知识分享
2.强化学习知识分享待定
代码获取
友善提示:为了分享的完整性,我将完整代码和数据公布,可供需要的人下载使用,下载解压即可使用。方式一为官方下载,方式二为云盘下载。若有定制化任务可私信博主交流。