机器学习(概述二)——开发流程


在具体的机器学习算法之前,先来从宏观上介绍一下机器学习的开发流程,这样能对机器学习有个整体认识。

总的来说,分为数据收集、数据处理、模型构建、模型测试评估、投入使用(模型部署与整合)、迭代优化等。对于数据处理部分也叫特征工程,有的时候会分成数据清洗和特征工程。
在这里插入图片描述
其实这个过程在我们生活中处处可见,举个例子,比如说要做一份小炒肉,首先肯定去收集食材,然后进行清洗,接着得把辣椒切段、肉切块等,最后点火开炒。
在这里插入图片描述
最终效果如何,得尝一尝。可能会发现肉切的块儿太大没太入味,下次炒菜时就得切小一些;也可能会觉得这次用的猪肉,可能不如牛肉口感好一些,下次收集食材应该准备牛肉……

数据收集与存储

数据来源

  • 用户访问行为数据
  • 业务数据
  • 外部第三方数据

数据存储

  • 需要存储的数据:原始数据、预处理后数据、模型结果
  • 存储设施:mysql、HDFS、HBase、Solr、Elasticsearch、Kafka、Redis等

数据收集方式

  • Flume & Kafka

一般这环节我们是不需要做的,而是有专业人员在做这方面,我们的重心还是在模型方面。
在实际工作中,我们可以使用业务数据进行机器学习开发,但是在学习过程中,没有业务数据,此时可以使用公开的数据集进行开发,常用数据集如下:
http://archive.ics.uci.edu/ml/datasets.html
https://aws.amazon.com/cn/public-datasets/
https://www.kaggle.com/competitions
http://www.kdnuggets.com/datasets/index.html
http://www.sogou.com/labs/resource/list_pingce.php
https://tianchi.aliyun.com/datalab/index.htm
http://www.pkbigdata.com/common/cmptIndex.html

数据清洗与转换

实际生产环境中,这是机器学习比较耗时的一部分,大部分的机器学习模型所处理的都是特征,特征通常是输入变量所对应的可用于模型的数值表示。并且大部分情况下 ,收集得到的数据需要经过预处理后才能够为算法所使用,预处理的操作主要包括以下几个部分:

  • 数据过滤
  • 处理数据缺失
  • 处理可能的异常、错误或者异常值
  • 合并多个数据源数据
  • 数据汇总

对数据进行初步的预处理,需要将其转换为一种适合机器学习模型的表示形式,对许多模型类型来说,这种表示就是包含数值数据的向量或者矩阵

  • 将类别数据编码成为对应的数值表示(一般使用1-of-k方法)-dumy
  • 从文本数据中提取有用的数据(一般使用词袋法或者TF-IDF)
  • 处理图像或者音频数据(像素、声波、音频、振幅等<傅里叶变换>)
  • 数值数据转换为类别数据以减少变量的值,比如年龄分段
  • 对数值数据进行转换,比如对数转换
  • 对特征进行正则化、标准化,以保证同一模型的不同输入变量的值域相同
  • 对现有变量进行组合或转换以生成新特征,比如BMI指数

这里对比较常用到的前两点展开介绍一下,一个是比较典型的类型特征转换方法——1-of-k,也就是通常所说的哑编码(dump),另一个是文本数据抽取中常用到的 词袋法 和 TF-IDF

类型特征转换之1-of-k

功能:将非数值型的特征值转换为数值型的数据

描述:假设变量的取值有 k 个,如果对这些值用 1 到 k 编序,则可用维度为 k的向量(也就是线性代数中的规范正交基)来表示一个变量的值。在这样的向量里,该取值所对应的序号所在的元素为1,其他元素均为0。
举个简单的例子:
在这里插入图片描述
对于T1,有ABC三种类型,我们就可以采用下面的一组向量来表示:
在这里插入图片描述
也许会有疑问,为什么不直接用1、2和3三个数字来表示呢,这样看起来不更简单吗?
一般类别之间的差异应该是相同的,但是如果直接用1、2和3三个数字来表示,1和3差为2,而1和2、2和3的差都为1,可能会认为A和C不太相似,相较与其他,A和C之间的差异会更大。比如,我们在用做KNN算法,使用欧式距离计算时,就会体现出来。

最终转换的结果是:
在这里插入图片描述

文本数据抽取

如果不是类别,而是文本数据,哑编码是做不了,从文本数据中提取有用的数据一般使用词袋法或者TF-IDF:

1)词袋法
将文本当作一个无序的数据集合,文本特征可以采用文本中的词条T进行体现,那么文本中出现的所有词条(或某些)及其出现的次数就可以体现文档的特征。

比如,有本书其中“机器学习”出现了500次,“spark”出现两次,我们基本可以断定这本书是关于机器学习的;而另外一本书中“机器学习”出现了2次,“spark”出现了500次,那么这么书很可能是关于大数据。也就我们可以用某些词条出现的次数来体现文本的内容。

举个例子,比如说有下列两组数据(括号里表示出现的次数):
在这里插入图片描述
那么就可以表示成:
在这里插入图片描述
对于具体的内容,像“那么”、“可以”之类的词条对于特征的表达并不强,在做数据处理时我们可以改一下他们的权重。哑编码显然是做不到的,我们可用TF-IDF。

2)TF-IDF:
词条的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降;也就是说词条在文本中出现的次数越多,表示该词条对该文本的重要性越高,词条在所有文本中出现的次数越少,说明这个词条对文本的重要性越高。

比如:说有的文章机器学习出现了1次、有的出现了10次,有的出现了100次,很显然出现100次的在文本的重要性最高,因为基本可以断定这本书是判断机器学习的。而如果现在有大量的书,并且大量的出现了“机器学习”、“深度学习”,但“mybatis”出现的次数特别少,此时“mybatis”很可能成为关注点。就像生活中,显眼的,让人印象深刻的永远是少数。

**TF(词频)**指某个词条在文本中出现的次数,一般会将其进行归一化处理(该词条数量/该文档中所有词条数量);**IDF(逆向文件频率)**指一个词条重要性的度量,一般计算方式为总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。TF-IDF实际上是:TF * IDF
比如:有10000篇文章,基本词条A出现了2次,那么IDF(A) = 10000/2 = 5000。5000这个数值有些偏大,则可以取一下对数。
举个例子:还以上面文档1和文档为例,对应的TF和IDF分别为
在这里插入图片描述
分别用词条的TF及对应的IDF相乘,便得到:
在这里插入图片描述

如果把上图中的数据都乘以所在文档的词条总数,得到下面的图。但发现文档1中的E的数据由词袋法中的 1 变成了现在的 2
在这里插入图片描述

模型构建

所有的算法都是在进行模型构建,这里就不说了,后续的博客中会详细的介绍。

模型训练与测试

模型选择:对特定任务最优建模方法的选择或者对特定模型最佳参数的选择。
交叉验证:简单来说就是在训练数据集上运行模型(算法)并在测试数据集中测试效果,迭代进行数据模型的修改,这种方式被称为交叉验证(将数据分为训练集和测试集,使用训练集构建模型,并使用测试集评估模型提供修改建议)。因为训练得到的模型,不知道模型的好坏,如果直接部署到线上的时候,可能会产生不好的效果。

如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集( training set )、验证集 (validation set) 和测试集 (test set) 。训练集用来训练模型,验证集用于模型的选择,而测试集用于最终对学习方法的评估。在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型进行选择也是有效的。

但是,在许多实际应用中数据是不充足的.为了选择好的模型,可以采用交叉验证方法.交叉验证的基本想法是重复地使用数据;把给定的数据进行切分,将切分的数据集组合为训练集与测试集,在此基础上反复地进行训练、测试以及模型选择。而且
模型的选择会尽可能多的选择算法进行执行,并比较执行结果。

1)简单交叉验证
简单交叉验证方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集(例如, 70% 的数据为训练集, 30% 的数据为测试集);然后用训练集在各种条件下(例如,不同的参数个数)训练模型,从而得到不同的模型;在测试集上评价各个模型的测试误差,选出测试误差最小的模型。

2)S 折交叉验证
应用最多的是 S 折交叉验证( S -fold cross validation ),方法如下:首先随机地将已给数据切分为 S 个互不相交的大小相同的子集;然后利用 S - 1个子集的数据训练模型,利用余下的子集测试模型;将这一过程对可能的 S 种选择重复进行;最后选出 S 次评测中平均测试误差最小的模型.

3)留一交叉验证
S 折交叉验证的特殊情形是 S = N,称为留一交叉验证( leave-one-out cross validation ),往往在数据缺乏的情况下使用.这里, N 是给定数据集的容量。

模型评估
对于模型的好坏,有专门的评估方式。总体有分类和回归两类模型评估方法,当然具体的算法可能还有自己特有的方法,如决策树有一种基于信息熵的评估方式。
1)分类
在这里插入图片描述
其中最常用的是图中左上角的混淆矩阵,单独拿出来看一下:
在这里插入图片描述
真实样本分为正例和负例两类,预测的结果有对有错:
真正例(TP):原本是例,并且预测为例,是一种预测正确的情况,即表中的A;
假负例(FN):原本是例,并且预测为例,是一种预测错误的情况,即表中的B;
假正例(FP):原本是例,并且预测为例,是一种预测错误的情况,即表中的C;
真负例(TN):原本是例,并且预测为例,是一种预测正确的情况,即表中的D。

对于结果的评估分别有准确率( accuracy )、精确率( precision 精准率)、召回率( recall )以及F1指标(精确率和召回率的调和均值):
① 准确率(Accuracy)=提取出的正确样本数/总样本数。也就是“原本的正例有多少能预测出来
② 召回率(Recall)=正确的正例样本数/样本中的正例样本数——覆盖率。也就是“预测成正例的有多少是真的
③ 精准率(Precision)=正确的正例样本数/预测为正例的样本数
④ F值=PrecisionRecall2 / (Precision+Recall) (即F值为精确率和召回率的调和平均值)
在这里插入图片描述
当召回率提升时,即原本的正例能更多的预测出来,即A↑,很可能是预测时能多的预测成正例,这样会导致一些假的也预测成真的了,即C↑。最极端就是所有都预测成正例,此时召回率为100%,正确率没有变化,精准率反而下降。一定情况下,召回率和准确是互斥的。有时考虑召回率多一些,有时考虑精确率多一些,有时二者都考虑,那怎么办?所以引入了F值。

此外,还有ROC曲线和AUC
⑤ ROC
ROC(Receiver Operating Characteristic) 最初源于20世纪70年代的信号检测理论,描述的是分类混淆矩阵中FPR-TPR两个量之间的相对变化情况,ROC曲线的纵轴是“真正例率”(True Positive Rate 简称TPR,也就是召回率,即 A A + B \frac{A}{A+B} ),横轴是“假正例率” (False Positive Rate 简称FPR, C C + D \frac{C}{C+D} )。二者分母是不变的,当们想把更多的A预测出来,时此会修改模型的阈值,导致一些假的也预测成正例,即C↑。所以TPR和FPR都会变大。理想的情况下,我们希望A变大的同时,C不要变的太大,也就是TPR增长更快。

如果二元分类器输出的是对正样本的一个分类概率值,当取不同阈值时会得到不同的混淆矩阵,对应于ROC曲线上的一个点。那么ROC曲线就反映了FPR与TPR之间权衡的情况,通俗地来说,即在TPR随着FPR递增的情况下,谁增长得更快,快多少的问题。TPR增长得越快,曲线越往上屈,AUC就越大,反映了模型的分类性能就越好(如下图,KNN中的TPR增长的更快)。当正负样本不平衡时,这种模型评价方式比起一般的精确度评价方式的好处尤其显著。
在这里插入图片描述
⑥ AUC
AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而AUC作为数值可以直观的评价分类器的好坏,值越大越好。

  • AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  • AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

一般情况下,模型的AUC要求至少在0.7以上。

这些评估方式好多框架中都已封装好了,如sklearn中的:
在这里插入图片描述
2)回归
回归算法常见的评估方式有方差、误差和 R 2 R^2 ,不做过多解释了,直接看一下sklean中对应的API吧:
在这里插入图片描述

模型部署与整合

当模型构建好后,将训练好的模型存储到数据库中,方便其它使用模型的应用加载(构建好的模型一般为一个矩阵)。
一般情况下,模型需要周期性更新。更新的周期多数是一个月或一周。

模型的监控与反馈

当模型一旦投入到实际生产环境中,模型的效果监控是非常重要的,往往需要关注业务效果和用户体验,所以有时候会进行A/B测试。如电商平台的推荐系统,上线后,看看订单较之前是否有所增加。

  • A/B测试:有A B两个系统,A为原系统,B为使用了推荐的系统,同时把用户分成两部分(比如三七分,30%的用户使用的系统A,70%的用户使用B系统)。看一下运行效果:如果效果确实好,调整比例,并逐渐把用户都转移到B系统;不好的话,下架B系统,修改模型,进行迭代优化。```

模型需要对用户的反馈进行响应操作,即进行模型修改,但是要注意异常反馈信息对模型的影响,故需要进行必要的数据预处理操作。

发布了108 篇原创文章 · 获赞 333 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/zhanglianhai555/article/details/90765085