机器学习入门系列(2)--如何构建一个完整的机器学习项目(一)

上一篇机器学习入门系列(1)–机器学习概览简单介绍了机器学习的一些基本概念,包括定义、优缺点、机器学习任务的划分等等。

接下来计划通过几篇文章来介绍下,一个完整的机器学习项目的实现步骤会分为几步,最后会结合《hands-on-ml-with-sklearn-and-tf》的例子来介绍下相应代码的实现。

这是如何构建一个完整的机器学习项目第一篇!

这里先给出一个完整的机器学习项目过程的主要步骤,如下所示:

  1. 项目概述。
  2. 获取数据。
  3. 发现并可视化数据,发现规律
  4. 为机器学习算法准备数据。
  5. 选择模型,进行训练。
  6. 微调模型。
  7. 给出解决方案。
  8. 部署、监控、维护系统

第一篇文章会介绍下第一节内容,开始一个项目的时候,需要确定什么问题,包括选择合适的损失函数。


1. 项目概览

1.1 划定问题

当我们开始一个机器学习项目的时候,需要先了解两个问题:

  1. **商业目标是什么?**公司希望利用算法或者模型收获什么,这决定需要采用什么算法和评估的性能指标?
  2. 当前的解决方案效果如何?

通过上述两个问题,我们就可以开始设计系统,也就是解决方案。

但首先,有些问题也需要了解清楚:

  • 监督还是无监督,或者是强化学习?
  • 是分类,回归,还是其他类型问题?
  • 采用批量学习还是需要线上学习。

1.2 选择性能指标

选择性能指标,通常对于模型,首先就是指模型的准确率,而在机器学习中,算法的准确率是需要通过减少损失来提高的,这就需要选择一个合适的损失函数来训练模型。

一般,从学习任务类型可以将损失函数划分为两大类–回归损失和分类损失,分别对应回归问题和分类问题。

回归损失
均方误差 / 平方误差 / L2 误差

均方误差(MSE)度量的是预测值和真实值之间差的平方的均值,它只考虑误差的平均大小,不考虑其方向。但经过平方后,对于偏离真实值较多的预测值会受到更严重的惩罚,并且 MSE 的数学特性很好,也就是特别易于求导,所以计算梯度也会变得更加容易

MSE 的数学公式如下:

代码实现如下:

def rmse(predictions, targets):# 真实值和预测值的误差differences = predictions - targetsdifferences_squared = differences ** 2mean_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 - targetsabsolute_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 - targetsmean_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.0pred_value = predictions[label]for i, val in enumerate(predictions):if i == label:continuetmp = val - pred_value + 1result += 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))) / Nreturn 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

上述代码例子,源代码地址:

https://github.com/ccc013/CodesNotes/blob/master/hands_on_ml_with_tf_and_sklearn/Loss_functions_practise.py

1.3 核实假设

核实假设其实也可以说是确定你设计的系统的输入输出,我们的机器学习项目是需要商用的话,肯定就不只是一个算法模型,通常还会有前端展示页面效果,后端的服务等等,你需要和前后端的负责人进行沟通,核实接口的问题。

比如,《hands-on-ml-with-sklearn-and-tf》书中给出的例子是设计一个预测房价的系统,其输出是房价的数值,但是如果前端需要展示的是类别,即房价是便宜、中等还是昂贵,那么我们的系统输出的房价就没有意义了,这时候我们要解决的就是分类问题,而不是回归问题。

因此,当你在做一个机器学习项目的时候,你需要和有工作交接的同事保持良好的沟通,随时进行交流,确认接口的问题。


小结

第一篇简单介绍了开始一个机器学习项目,首先需要明确商业目标,已有的解决方案,设计的机器学习系统属于什么类型任务,并以此为基础,选择合适的性能指标,即损失函数。


参考:

  • 《hands-on-ml-with-sklearn-and-tf》第二节
  • https://www.jiqizhixin.com/articles/091202
  • https://blog.csdn.net/fendegao/article/details/79968994
  • https://blog.csdn.net/xg123321123/article/details/80781611

欢迎关注我的微信公众号–机器学习与计算机视觉,或者扫描下方的二维码,大家一起交流,学习和进步!

往期精彩推荐

学习笔记
  • 机器学习入门系列(1)–机器学习概览
  • [GAN学习系列] 初识GAN
  • [GAN学习系列2] GAN的起源
  • [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(上)
数学学习笔记
  • 程序员的数学笔记1–进制转换
  • 程序员的数学笔记2–余数
  • 程序员的数学笔记3–迭代法
Github项目 & 资源教程推荐
  • [Github 项目推荐] 一个更好阅读和查找论文的网站
  • [资源分享] TensorFlow 官方中文版教程来了
  • 必读的AI和深度学习博客
  • [教程]一份简单易懂的 TensorFlow 教程
  • [资源]推荐一些Python书籍和教程,入门和进阶的都有!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python-100 | 练习题 01 列表推导式

最近打算好好练习下 python,因此找到一个练习题网站,打算每周练习 3-5 题吧。http://www.runoob.com/python/python-100-examples.html另外,这个网站其实也还有 Python 的教程,从基础到高级的知识都有。Example-1 三位数组合题目&…

html5qq邮箱代码,使用qq邮箱批量发送邮件 实例源码(支持富文本)

资源下载此资源下载价格为3D币,请先登录资源文件列表MailSending/MailSending/App.config , 184MailSending/MailSending/Form1.Designer.cs , 15243MailSending/MailSending/Form1.cs , 10655MailSending/MailSending/Form1.resx , 438794MailSending/MailSending/…

Python-100 练习题 01 列表推导式

最近打算好好练习下 python,因此找到一个练习题网站,打算每周练习 3-5 题吧。 http://www.runoob.com/python/python-100-examples.html 另外,这个网站其实也还有 Python 的教程,从基础到高级的知识都有。 Example-1 三位数组合…

nginx html解析插件,nginx配置信息的解析流程

nginx配置信息的解析流程2011年9月9日 1,744 次浏览请关注最新修正合订:这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保…

机器学习数据集的获取和测试集的构建方法

这是机器学习入门系列(2)–如何构建一个完整的机器学习项目的第二篇 上一篇机器学习入门系列(2)–如何构建一个完整的机器学习项目(一)介绍了开始一个机器学习项目需要明确的问题,比如当前任务属于有监督还是无监督学习问题,然后…

[资源推荐] 必须收藏的两个查找论文和代码实现的网站!

2019年第 13 篇文章,总第 37 篇文章无论是研究方向是 AI 方面的学生,或者是做机器学习方面的算法工程师,在掌握基础的机器学习相关知识后,都必须掌握搜索论文的技能,特别是研究或者工作领域方向的最新论文,…

dw html怎么导入视频,如何在dw中将视频插入

如何在dw中将视频插入电脑版Dreamweaver工具被很多人使用,用来编辑视频等,有的用户在使用该软件时,想要插入需要编辑的视频,但是却不知道如何插入,那么小编就来为大家介绍一下吧。具体如下:1. 第一步&#…

editplus注释快捷键

Tools->Preferences Tools-Keyboard-Edit-LineComment Line Uncomment为取消注释 转载于:https://www.cnblogs.com/yiwd/archive/2013/06/06/3121689.html

Python-100 练习题 02

2019年第 10 篇文章,总第 34 篇文章 练习题2 的网址: http://www.runoob.com/python/python-exercise-example2.html Example-2 企业发放奖金 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%&#xff…

特征工程之数据预处理(上)

机器学习入门系列(2)–如何构建一个完整的机器学习项目,第三篇! 该系列的前两篇文章: 机器学习入门系列(2)–如何构建一个完整的机器学习项目(一)机器学习数据集的获取和测试集的构建方法 分别介绍了确定项目终极目…

Python-100 练习题 03 完全平方数

本文大约 1600 字,阅读大约需要 8分钟 练习题 3 的网址: http://www.runoob.com/python/python-exercise-example3.html Example-3 完全平方数 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方…