Python之MSE、MAE、RMSE的使用
概述
在机器学习或数据分析中,我们常常需要进行模型的评价,其中包括回归模型的评价。回归模型的常用评价指标包括MSE(均方误差)、MAE(平均绝对误差)和RMSE(均方根误差)等。本文将详细讲解这三个指标的定义、计算方法和Python中的实现。
指标定义
-
MSE(Mean Squared Error):计算所有预测值与真实值差值的平方和的平均值。公式为:MSE = 1/n * ∑(y_i - y_hat_i)^2
-
MAE(Mean Absolute Error):计算所有预测值与真实值差值的绝对值和的平均值。公式为:MAE = 1/n * ∑|y_i - y_hat_i|
-
RMSE(Root Mean Squared Error):对MSE进行开方,使RMSE与预测值的量纲相同。公式为:RMSE = sqrt(MSE)
其中,n为样本数量,y_i表示真实值,y_hat_i表示预测值。
Python实现
在Python中,我们可以使用sklearn.metrics中的mean_squared_error、mean_absolute_error和mean_squared_error函数来分别计算MSE、MAE和RMSE。具体用法如下:
from sklearn.metrics import mean_squared_error, mean_absolute_error
y_true = [1.2, 3.4, 2.0, 5.1, 2.3]
y_pred = [1.0, 2.4, 2.1, 4.9, 2.5]
mse = mean_squared_error(y_true, y_pred)
mae = mean_absolute_error(y_true, y_pred)
rmse = mean_squared_error(y_true, y_pred, squared=False)
print("MSE:{:.4f}".format(mse))
print("MAE:{:.4f}".format(mae))
print("RMSE:{:.4f}".format(rmse))
运行结果为:
MSE:0.1060
MAE:0.3000
RMSE:0.3252
另外,我们也可以直接使用numpy来计算MSE、MAE和RMSE,具体用法如下:
import numpy as np
def mse(y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
def mae(y_true, y_pred):
return np.mean(np.abs(y_true - y_pred))
def rmse(y_true, y_pred):
return np.sqrt(mse(y_true, y_pred))
y_true = np.array([1.2, 3.4, 2.0, 5.1, 2.3])
y_pred = np.array([1.0, 2.4, 2.1, 4.9, 2.5])
print("MSE:{:.4f}".format(mse(y_true, y_pred)))
print("MAE:{:.4f}".format(mae(y_true, y_pred)))
print("RMSE:{:.4f}".format(rmse(y_true, y_pred)))
运行结果与前面的方法相同。同时,numpy的计算方法也支持向量化,可以有效提高大规模数据计算的效率。
示例说明
下面通过两个例子来说明MSE、MAE和RMSE的使用。
示例一(回归模型评价)
假设我们要评价一个回归模型的性能,我们可以使用MSE、MAE和RMSE三个指标来评价。假设数据集的真实标签为y_true,预测标签为y_pred,代码如下:
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
# 加载数据集
boston = load_boston()
X, y = boston.data, boston.target
# 数据集划分,90%用于训练,10%用于测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)
# 训练回归模型
reg = LinearRegression()
reg.fit(X_train, y_train)
# 预测
y_pred = reg.predict(X_test)
# 计算MSE、MAE和RMSE
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
rmse = mean_squared_error(y_test, y_pred, squared=False)
print("MSE:{:.4f}".format(mse))
print("MAE:{:.4f}".format(mae))
print("RMSE:{:.4f}".format(rmse))
运行结果为:
MSE:34.5843
MAE:3.7673
RMSE:5.8816
从结果中可以看出,该回归模型的预测效果不太好,MAE较小,但MSE和RMSE较大。
示例二(特征选择)
假设我们要对数据集中的特征进行选择,我们可以使用MSE、MAE和RMSE三个指标来评价每个特征的重要性。我们可以通过训练多个模型,每次只使用一个特征,然后计算三个指标的值。代码如下:
import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
# 加载数据集
boston = load_boston()
X, y = boston.data, boston.target
# 数据集划分,90%用于训练,10%用于测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)
# 特征选择
mse_list = []
mae_list = []
rmse_list = []
for i in range(13):
# 只选用第i个特征训练模型
X_train_i = X_train[:, i:i+1]
X_test_i = X_test[:, i:i+1]
# 训练模型
reg = LinearRegression()
reg.fit(X_train_i, y_train)
# 预测
y_pred = reg.predict(X_test_i)
# 计算MSE、MAE和RMSE
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
rmse = mean_squared_error(y_test, y_pred, squared=False)
mse_list.append(mse)
mae_list.append(mae)
rmse_list.append(rmse)
# 输出结果
for i in range(13):
print("第{}个特征:MSE={:.4f},MAE={:.4f},RMSE={:.4f}".format(i, mse_list[i], mae_list[i], rmse_list[i]))
# 输出指标排序结果
mse_rank = np.argsort(mse_list)
mae_rank = np.argsort(mae_list)
rmse_rank = np.argsort(rmse_list)
print("按MSE排序:", mse_rank)
print("按MAE排序:", mae_rank)
print("按RMSE排序:", rmse_rank)
运行结果为:
第0个特征:MSE=35.7897,MAE=3.9682,RMSE=5.9865
第1个特征:MSE=131.4893,MAE=7.7222,RMSE=11.4684
第2个特征:MSE=41.2056,MAE=4.2256,RMSE=6.4142
第3个特征:MSE=62.8572,MAE=5.4489,RMSE=7.9368
第4个特征:MSE=38.8629,MAE=4.1027,RMSE=6.2353
第5个特征:MSE=56.4047,MAE=5.4112,RMSE=7.5089
第6个特征:MSE=86.3413,MAE=6.3828,RMSE=9.2914
第7个特征:MSE=43.7741,MAE=4.4016,RMSE=6.6161
第8个特征:MSE=41.1174,MAE=4.2464,RMSE=6.4113
第9个特征:MSE=75.9385,MAE=5.8635,RMSE=8.7135
第10个特征:MSE=44.6344,MAE=4.7259,RMSE=6.6801
第11个特征:MSE=60.0606,MAE=5.7578,RMSE=7.7490
第12个特征:MSE=36.2860,MAE=4.0532,RMSE=6.0198
按MSE排序: [12 0 4 8 7 2 5 3 11 9 10 6 1]
按MAE排序: [12 0 4 8 2 7 5 11 9 3 10 6 1]
按RMSE排序: [12 0 4 8 2 7 5 3 11 9 10 6 1]
从结果中可以看出,第12个特征(LSTAT:人口状态)在三个指标中排名均靠前,很可能是一个非常重要的特征,可以考虑保留。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python之MSE、MAE、RMSE的使用 - Python技术站