内容简介:上一篇接下来计划通过几篇文章来介绍下,一个完整的机器学习项目的实现步骤会分为几步,最后会结合《hands-on-ml-with-sklearn-and-tf》的例子来介绍下相应代码的实现。这是
上一篇 机器学习入门系列(1)--机器学习概览 简单介绍了机器学习的一些基本概念,包括定义、优缺点、机器学习任务的划分等等。
接下来计划通过几篇文章来介绍下,一个完整的机器学习项目的实现步骤会分为几步,最后会结合《hands-on-ml-with-sklearn-and-tf》的例子来介绍下相应代码的实现。
这是 如何构建一个完整的机器学习项目 第一篇!
这里先给出一个完整的机器学习项目过程的主要步骤,如下所示:
- 项目概述。
- 获取数据。
- 发现并可视化数据,发现规律
- 为机器学习算法准备数据。
- 选择模型,进行训练。
- 微调模型。
- 给出解决方案。
- 部署、监控、维护系统
第一篇文章会介绍下第一节内容,开始一个项目的时候,需要确定什么问题,包括选择合适的损失函数。
1. 项目概览
1.1 划定问题
当我们开始一个机器学习项目的时候,需要先了解两个问题:
- **商业目标是什么?**公司希望利用算法或者模型收获什么,这决定需要采用什么算法和评估的性能指标?
- 当前的解决方案效果如何?
通过上述两个问题,我们就可以开始设计系统,也就是解决方案。
但首先,有些问题也需要了解清楚:
- 监督还是无监督,或者是强化学习?
- 是分类,回归,还是其他类型问题?
- 采用批量学习还是需要线上学习。
1.2 选择性能指标
选择性能指标,通常对于模型,首先就是指模型的准确率,而在机器学习中,算法的准确率是需要通过减少损失来提高的,这就需要选择一个合适的损失函数来训练模型。
一般,从学习任务类型可以将损失函数划分为两大类-- 回归损失和分类损失 ,分别对应回归问题和分类问题。
回归损失
均方误差 / 平方误差 / L2 误差
均方误差(MSE)度量的是 预测值和真实值之间差的平方的均值 ,它 只考虑误差的平均大小,不考虑其方向 。但经过平方后,对于偏离真实值较多的预测值会受到更严重的惩罚,并且 MSE 的数学特性很好,也就是特别易于求导,所以 计算梯度也会变得更加容易 。
MSE 的数学公式如下:
代码实现如下:
def rmse(predictions, targets): # 真实值和预测值的误差 differences = predictions - targets differences_squared = differences ** 2 mean_of_differences_squared = differences_squared.mean() # 取平方根 rmse_val = np.sqrt(mean_of_differences_squared) return rmse_val 复制代码
当然上述代码实现的是 均方根误差(RMSE) ,一个简单的测试例子如下:
y_hat = np.array([0.000, 0.166, 0.333]) y_true = np.array([0.000, 0.254, 0.998]) print("d is: " + str(["%.8f" % elem for elem in y_hat])) print("p is: " + str(["%.8f" % elem for elem in y_true])) rmse_val = rmse(y_hat, y_true) print("rms error is: " + str(rmse_val)) 复制代码
输出结果为:
d is: ['0.00000000', '0.16600000', '0.33300000'] p is: ['0.00000000', '0.25400000', '0.99800000'] rms error is: 0.387284994115 复制代码
平方绝对误差 / L1 误差
平均绝对误差(MAE)度量的是预测值和实际观测值之间绝对差之和的平均值。和 MSE 一样,这种度量方法也是在不考虑方向的情况下衡量误差大小。但和 MSE 的不同之处在于,MAE 需要像 线性规划这样更复杂的 工具 来计算梯度 。此外,MAE 对异常值更加稳健,因为它不使用平方。
数学公式如下:
MAE 的代码实现也不难,如下所示:
def mae(predictions, targets): differences = predictions - targets absolute_differences = np.absolute(differences) mean_absolute_differences = absolute_differences.mean() return mean_absolute_differences 复制代码
测试样例可以直接用刚才的 MSE 的测试代码,输出结果如下:
d is: ['0.00000000', '0.16600000', '0.33300000'] p is: ['0.00000000', '0.25400000', '0.99800000'] mae error is: 0.251 复制代码
平均偏差误差(mean bias error)
这个损失函数应用得比较少,在机器学习领域太不常见了,我也是第一次看到这个损失函数。它和 MAE 很相似,唯一区别就是 它没有用绝对值 。因此,需要注意的是, 正负误差可以互相抵消 。尽管在实际应用中没那么准确,但 它可以确定模型是存在正偏差还是负偏差。
数学公式如下:
代码的实现,其实只需要在 MAE 的基础上删除加入绝对值的代码,如下所示:
def mbe(predictions, targets): differences = predictions - targets mean_absolute_differences = differences.mean() return mean_absolute_differences 复制代码
还是利用刚刚的测试样例,结果如下:
d is: ['0.00000000', '0.16600000', '0.33300000'] p is: ['0.00000000', '0.25400000', '0.99800000'] mbe error is: -0.251 复制代码
可以看到我们给的简单测试样例,存在一个负偏差。
分类误差
Hinge Loss / 多分类 SVM 误差
hinge loss 常用于最大间隔分类(maximum-margin classification), 它是在一定的安全间隔内(通常是 1),正确类别的分数应高于所有错误类别的分数之和 。最常用的就是支持向量机(SVM)。 尽管不可微,但它是一个凸函数 ,可以采用机器学习领域中常用的凸优化器。
其数学公式如下:
公式中 sj
表示的是预测值,而 s_yi
是真实值,也可以说是正确预测的数值,而 1 表示的就是间隔 margin
,这里我们希望通过真实值和预测值之间的差来表示两种预测结果之间的相似关系,而 margin
是人为设置的一个安全系数,我们是 希望正确分类的得分要高于错误预测的得分,并且是高于一个 margin
的数值 ,也就是 s_yi
越高越好, s_j
越低越好。这样计算得到的 Loss 会趋向于 0.
用一个简单的例子说明,假设现在有如下三个训练样本,我们需要预测三个类别,下面表格中的数值就是经过算法得到的每个类别的数值:
每一列就每张图片每个类别的数值,我们也可以知道每一列的真实值分别是狗、猫、马。简单的代码实现如下:
def hinge_loss(predictions, label): ''' hinge_loss = max(0, s_j - s_yi +1) :param predictions: :param label: :return: ''' result = 0.0 pred_value = predictions[label] for i, val in enumerate(predictions): if i == label: continue tmp = val - pred_value + 1 result += max(0, tmp) return result 复制代码
测试例子如下:
image1 = np.array([-0.39, 1.49, 4.21]) image2 = np.array([-4.61, 3.28, 1.46]) image3 = np.array([1.03, -2.37, -2.27]) result1 = hinge_loss(image1, 0) result2 = hinge_loss(image2, 1) result3 = hinge_loss(image3, 2) print('image1,hinge loss={}'.format(result1)) print('image2,hinge loss={}'.format(result2)) print('image3,hinge loss={}'.format(result3)) # 输出结果 # image1,hinge loss=8.48 # image2,hinge loss=0.0 # image3,hinge loss=5.199999999999999 复制代码
这个计算过程更加形象的说明:
## 1st training example max(0, (1.49) - (-0.39) + 1) + max(0, (4.21) - (-0.39) + 1) max(0, 2.88) + max(0, 5.6) 2.88 + 5.6 8.48 (High loss as very wrong prediction) ## 2nd training example max(0, (-4.61) - (3.28)+ 1) + max(0, (1.46) - (3.28)+ 1) max(0, -6.89) + max(0, -0.82) 0 + 0 0 (Zero loss as correct prediction) ## 3rd training example max(0, (1.03) - (-2.27)+ 1) + max(0, (-2.37) - (-2.27)+ 1) max(0, 4.3) + max(0, 0.9) 4.3 + 0.9 5.2 (High loss as very wrong prediction) 复制代码
通过计算,hinge loss 数值越高,就代表预测越不准确。
交叉熵损失 / 负对数似然
交叉熵损失(cross entroy loss)是分类算法最常用的损失函数。
数学公式:
根据公式,如果实际标签 y_i
是 1, 那么公式只有前半部分;如果是 0, 则只有后半部分。简单说, 交叉熵是将对真实类别预测的概率的对数相乘 ,并且, 它会重重惩罚那些置信度很高但预测错误的数值。
代码实现如下:
def cross_entropy(predictions, targets, epsilon=1e-10): predictions = np.clip(predictions, epsilon, 1. - epsilon) N = predictions.shape[0] ce_loss = -np.sum(np.sum(targets * np.log(predictions + 1e-5))) / N return ce_loss 复制代码
测试样例如下:
predictions = np.array([[0.25, 0.25, 0.25, 0.25], [0.01, 0.01, 0.01, 0.96]]) targets = np.array([[0, 0, 0, 1], [0, 0, 0, 1]]) cross_entropy_loss = cross_entropy(predictions, targets) print("Cross entropy loss is: " + str(cross_entropy_loss)) # 输出结果 # Cross entropy loss is: 0.713532969914 复制代码
上述代码例子,源代码地址:
1.3 核实假设
核实假设其实也可以说是确定你设计的系统的输入输出,我们的机器学习项目是需要商用的话,肯定就不只是一个算法模型,通常还会有前端展示页面效果,后端的服务等等,你需要和前后端的负责人进行沟通,核实接口的问题。
比如,《hands-on-ml-with-sklearn-and-tf》书中给出的例子是设计一个预测房价的系统,其输出是房价的数值,但是如果前端需要展示的是类别,即房价是便宜、中等还是昂贵,那么我们的系统输出的房价就没有意义了,这时候我们要解决的就是分类问题,而不是回归问题。
因此,当你在做一个机器学习项目的时候,你需要和有工作交接的同事保持良好的沟通,随时进行交流,确认接口的问题。
小结
第一篇简单介绍了开始一个机器学习项目,首先需要明确商业目标,已有的解决方案,设计的机器学习系统属于什么类型任务,并以此为基础,选择合适的性能指标,即损失函数。
参考:
- 《hands-on-ml-with-sklearn-and-tf》第二节
- www.jiqizhixin.com/articles/09…
- blog.csdn.net/fendegao/ar…
- blog.csdn.net/xg123321123…
欢迎关注我的微信公众号--机器学习与计算机视觉,或者扫描下方的二维码,大家一起交流,学习和进步!
以上所述就是小编给大家介绍的《机器学习入门系列(2)--如何构建一个完整的机器学习项目(一)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 从 0 开始机器学习 - 机器学习算法诊断
- 浅谈机器学习原理及机器学习平台
- 机器学习基础概念和统计机器学习基本算法
- [机器学习]机器学习笔记整理09- 基于SVM图像识别
- 第一届机器学习会议与机器学习的五大趋势
- 机器学习业务实践之路:如何通过机器学习算法快速解决实际业务
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。