西南交通大学机器学习实验
实验一:模型评估
实验目的
理解和掌握回归问题和分类问题模型评估方法,学会使用均方误差、最大绝对误差、均方根误差指标评估回归模型,学会使用错误率、精度、查全率、查准率、F1指标评价分类模型。
实验内容
(1) 给定回归问题的真实标签和多个算法的预测结果,编程实现MSE、MAE、RMSE三种评测指标,对模型进行对比分析。
(2) 给定二分类问题真实标签和多个算法的预测结果,编程实现混淆矩阵评测,采用错误率、精度、查全率、查准率、F1指标对结果进行对比分析。
实验环境
Python python 3.9
Numpy numpy 1.23.5
Intel® Core™ i7-9750H CPU @ 2.60GHz 16.0 GB
Windows专业版
回归问题评价指标
设有
西瓜书上关于MSE、MAE、RMSE的讲解很少,需要自己查找相关资料,站内相关的资料很多,大家讲的都比我好。
均方误差 MSE
均方误差(Mean Square Error,MSE),反映估计量与被估计量之间差异程度的一种度量。设t是根据子样确定的总体参数θ的一个估计量,(θ-t)2的数学期望,称为估计量t的均方误差。它等于σ2+b2,其中σ2与b分别是t的方差与偏倚。
MSE计算公式:
平均绝对误差 MAE
平均绝对误差(Mean Absolute Error,MAE),绝对偏差平均值即平均偏差,指各次测量值的绝对偏差绝对值的平均值。平均绝对误差可以避免误差相互抵消的问题,因而可以准确反映实际预测误差的大小。
MAE计算公式:
均方根误差 RMSE
均方根误差(Root Mean Square Error,RMSE),从名称来看,我们都能猜得到是什么意思。多了一个根,这个“根”的意思顾名思义,就只是加了个根号。均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根,在实际测量中,观测次数n总是有限的,真值只能用最可信赖(最佳)值来代替。
RMSE计算公式:
使用numpy库计算
# MSE--相当于target-pre的二范数的平方/n
def mse(tar, pre):
return np.linalg.norm(tar - pre, ord=2) ** 2 / len(tar)
# RMSE--相当于target-pre的二范数/根号n
def rmse(tar, pre):
return np.linalg.norm(tar - pre, ord=2) / np.sqrt(len(tar))
# MAE--相当于target-pre的一范数/n
def mae(tar, pre):
return np.linalg.norm(tar - pre, ord=1) / len(tar)
使用sklearn.metrics库计算
MSE = me.mean_squared_error(tar, pre)
RMSE = me.mean_squared_error(tar, pre) ** 0.5
MAE = me.mean_absolute_error(tar, pre)
实验结果
数据集内容共有1000条
# x, y,prediction 1,prediction 2, prediction 3
0.55,-1.00,3.30,-1.49,7.80
0.79,-5.71,0.87,-6.78,2.50
0.59,-1.40,3.16,-2.27,7.05
0.50,0.48,2.70,-0.68,8.57
0.17,2.95,4.40,2.13,10.72
······
参考实验结果
模型\指标 | MSE | MAE | RMSE |
---|---|---|---|
模型1 | 29.669 | 4.328 | 5.447 |
模型2 | 0.539 | 0.669 | 0.734 |
模型3 | 69.530 | 8.327 | 8.338 |
二分类问题评价指标
混淆矩阵
我介绍的不好,可以看看这篇文章【混淆矩阵】
站内还有其他很好的介绍,二分类看看西瓜书就暂时够用了
真实\预测 | 正例 | 反例 |
---|---|---|
正例 | TP | FN |
反例 | FP | TN |
def perf_measure(tar, pre):
TP, FP, TN, FN = 0, 0, 0, 0
for i in range(len(tar)):
if tar[i] == 1 and pre[i] == 1:
TP += 1
if tar[i] == 0 and pre[i] == 1:
FP += 1
if tar[i] == 0 and pre[i] == 0:
TN += 1
if tar[i] == 1 and pre[i] == 0:
FN += 1
return TP, FP, TN, FN
使用numpy巧妙计算混淆矩阵
这是我在做后面的实验的时候想到是否可以用更简单方式计算混淆矩阵时想到的,已经有人写出来相关教程了,讲的也比我好,我就不再重复了
原理看这篇文章
def genConfusionMatrix(pre, label, n):
return np.bincount(n * label + pre, minlength=n ** 2).reshape(n, n)
错误率、精度
精度(accuracy),指的是分类正确的样本数站样本总数的比例。以西瓜问题为例,算法挑出的西瓜分类正确的个数占总西瓜个数比例。
错误率指的是分类错误的样本数站样本总数的比例。以西瓜问题为例,算法挑出的西瓜分类错误的个数占总西瓜个数比例。且有错误率 = 1 - 精度
查准率
查准率(precision),指的是预测值为1且真实值也为1的样本在预测值为1的所有样本中所占的比例。以西瓜问题为例,算法挑出来的西瓜中有多少比例是好西瓜。
召回率
召回率(recall),也叫查全率,指的是预测值为1且真实值也为1的样本在真实值为1的所有样本中所占的比例。所有的好西瓜中有多少比例被算法挑了出来。
F1指标
F1分数(F1-Score),又称为平衡F分数(BalancedScore),它被定义为精确率和召回率的调和平均数。
实验结果
数据集内容共有1000条
# x, y,prediction 1,prediction 2, prediction 3
0.77,1.00,1.00,1.00,1.00
0.57,0.00,0.00,0.00,0.00
0.03,1.00,1.00,1.00,1.00
0.43,0.00,0.00,0.00,0.00
0.26,1.00,1.00,1.00,0.00
······
参考实验结果
模型1混淆矩阵 | - | - |
---|---|---|
- | 393 | 85 |
- | 94 | 428 |
模型2混淆矩阵 | - | - |
---|---|---|
- | 456 | 22 |
- | 27 | 495 |
模型3混淆矩阵 | - | - |
---|---|---|
- | 426 | 52 |
- | 46 | 476 |
模型\指标 | 查准率(precision) | 查全率(recall) | F1指标 |
---|---|---|---|
模型1 | 0.834 | 0.820 | 0.827 |
模型2 | 0.957 | 0.948 | 0.953 |
模型3 | 0.901 | 0.912 | 0.907 |
完整代码及数据集之后会放在下载文件中