目录
引言:
上一篇文章学习了机器学习模型预测的具体过程,接下来需要对模型预测的结果进行评估。
什么样的结果才是有效的呢?
比如,日常购物时可以进行人脸识别支付。有没有听说过刷自己的脸识别成别人的脸进行支付的情况,这个人脸识别模型的预测结果就出现了错误。
所以为了检验这个模型预测效果到底如何,避免用户使用的时候出现大规模的识别错误,就需要对模型进行评估,评估这个模型到底好还是坏,预测的准确还是不准确。
模型评估是优化模型、改进算法和指导业务决策的关键依据。合适的评估指标能够有效地反映模型在不同方面的表现,从而指导进一步改进和优化。
基于此,模型效果好我们就用它,不好就再改进它。
当然,这个只是一个日常生活的例子,接下来的模型评估的例子引用的是计算机行业的薪水预测问题。
注:数据可以在这里获取https://download.csdn.net/download/likecccjy/89532076
一、利用机器学习中的回归模型预测员工薪水
准备数据
# 导入现实数据,由于有中文,规定 encoding utf_8_sig可以标识文本文件,防止乱码
import pandas as pd
df = pd.read_csv('1. IT_salary_data.csv',encoding='utf_8_sig')
# 获取特征列,将数据切片。
# 关键点:两个[[]]切片出来为 DataFrame,而不是 Series。sklearn 需要DataFrame的格式
# A = pd.DataFrame([[1,2,3],[2,3,4]],columns=['x1','x2','x3'])
A = df[['工龄']]
# 获取标签列
# B = pd.DataFrame([[4],[5]],columns=['y'])
B = df[['薪水']]
display(A)
display(B)
输出结果如下:
特征列:
工龄 | |
---|---|
0 | 0.0 |
1 | 0.1 |
2 | 0.2 |
3 | 0.3 |
4 | 0.3 |
... | ... |
95 | 7.8 |
96 | 7.8 |
97 | 7.9 |
98 | 7.9 |
99 | 8.0 |
100 rows × 1 columns
标签列:
薪水 | |
---|---|
0 | 10808 |
1 | 13611 |
2 | 12306 |
3 | 12151 |
4 | 13057 |
... | ... |
95 | 34554 |
96 | 33472 |
97 | 33515 |
98 | 35204 |
99 | 36053 |
100 rows × 1 columns
使用sklearn库构建并训练模型
# 导入库
from sklearn.linear_model import LinearRegression
#构建模型,存储在model
model = LinearRegression()
#拟合特征列和标签列进行训练
model.fit(A,B)
二、模型评估
R^2决定系数:
R² = 1 - SSE/SST
SSE=所有真实标签的残差(预测标签与真实标签的差)平方的总和
SST=所有真实标签与真实标签平均值的差 的平方 的总和
简单来说,就是我现在有一批真实标签。比如一批西瓜哪些是好瓜那些是坏瓜
预测标签就是我从表面来判断,这些是好瓜(一串数字表示),那些是坏瓜(一串数字表示)。这个判断的基准在我的脑子里面已经形成了模型,我预测的结果肯定有不准确的,不完全正确。
所以残差就是这俩标签之间到底差距多大。
计算残差的平方和(SSE)就是在计算差距的总和。
SST是在计算真实标签与其平均值之间差距的总和。
为什么要加平方,为了防止有正负数相抵消,所以利用了平方,减少差距计算的损失。
预测标签的差距总和除以真实标签的差距综合算出了预测标签的差距在真实标签差距中的占比。
差距要越小越好,占比要越小越好,所以绝对系数要越接近1越好!
# score(x,y)是用来计算决定系数R^2的
# R平方(决定系数),用于衡量模型对数据的拟合程度
# R平方越接近1表示模型对数据的拟合程度越好,越接近0表示模型对数据的拟合程度较差。
# 拟合程度的意思就是预测值和真实值之间的差距
# 预测值是利用原有的数据带入模型得到的标签,真实值是原有的数据的标签
print("R^2:",model.score(A,B))
输出结果如下:
R^2: 0.8551365584870814
MSE均方误差:
概念:衡量模型预测值与真实值之间的平均偏差的平方。
按日常思维思考当然喜欢偏差比较小的东西啦。比如平常考试估分的时候,估分出来的分数和最终真实的分数越相近会更好的去进行决策,所以MSE越小表示模型对数据的拟合程度越好。
MAE平均绝对误差:
概念:衡量模型预测值与真实值之间的平均绝对偏差。
还是拿上个例子来说明,估分会出现比真实值低分或者高分的情况,这个时候就加了一个绝对值,让它的结果永远都为正数,注意,MAE没有平方!
MSE与MAE对比:
MSE①对大误差更加敏感(因为平方处理过)②对异常值特别敏感,还是因为加了平方。
MAE①就简单的数字加减,误差都均一对待,对谁都不偏袒②它对异常值不敏感,有离群点(比如一群40岁群体中出现了18岁的小屁孩,这个小屁孩就是离群点,他是异常的数据,不一定是错误的数据)的情况下鲁棒性强(强壮的意思),比如出现极端天气台风(离群点)下的高楼大厦(计算出来的MAE只会轻微的浮动摇摆)屹立不倒,这就是鲁棒性较强。
还有其他的对比内容,但在本文中用处不大,所以暂时不详细展开。
# 使用 sklearn.metrics 模块中计算评估指标的函数(MSE、MAE)
from sklearn.metrics import mean_squared_error, mean_absolute_error
# 将标签的预测值赋值给y_pred
y_pred = model.predict(A) #将特征A传给model然后利用predict得到预测值
# MSE和MAE函数要求传入标签的真实值和标签的预测值进行计算,B为真实值,y_pred为预测值
print("MSE:",mean_squared_error(B,y_pred))
print("MAE:",mean_absolute_error(B,y_pred))
输出结果如下: MSE: 7121839.872189505 MAE: 2111.5081658553418
三、模型预测
#预测输入的数据格式要与原训练模型时的数据格式相同
model.predict(pd.DataFrame([[3]],column=['工龄']))
#此时输入数据的内容如下:
# 工龄
# 3
预测结果如下:
array([[17634.58600969]])
评估完了,我知道了R^2、MSE、MAE,接下来应该怎么办?参考标准是什么?
R^2越接近1越好,MSE和MAE越小越好。R^2结果是0.85,挺接近1的,它好吗?
MSE和MAE也不大,我能口述出来,数字也挺小的,它好吗?它的参考标准是什么?怎么样算小?我还得去想想怎么办。
注:原始数据可以在文章上方进行下载提取训练。
本文是根据深圳点宽网络科技有限公司的课程内容进行个人的学习参考,如有侵权可联系删除。