在生产制造企业中,有许多产品检测岗位是需要员工通过他们的经验以及对产品的认知程度进行判断识别。而培养一个经验丰富的老师傅是需要很长周期,并且长时间工作导致人员的生理及心理疲惫以及主观心理因素可能会导致产品检验不符合实际情况。
因此,我们需要一个没有感情的设备,用人工智能技术让机器学会老师傅的经验,来完成产品检测的工作。
介绍完毕,以下分6个步骤,手把手教你搭建一个机器学习平台!
1. 实际问题抽象成数学问题
实际生产过程中,质检员工拿起待测物接上电源,然后启动示波器观测波形,分析数据后做出判断产品是否合格。这个过程实际上是一个分类问题,分类算法都属于监督学习。
监督学习是从标记的训练数据来推断一个功能的机器学习任务。训练数据包括一套训练示例。在监督学习中,每个实例都是由一个输入对象(通常为矢量)和一个期望的输出值(也称为监督信号)组成。监督学习算法是分析该训练数据,并产生一个推断的功能,其可以用于映射出新的实例。一个最佳的方案将允许该算法来正确地决定那些看不见的实例的类标签。这就要求学习算法是在一种“合理”的方式从一种从训练数据到看不见的情况下形成
以下是一些常用的监督型学习算法:
K-近邻算法(k-Nearest Neighbors,KNN)
决策树(Decision Trees)
朴素贝叶斯(Naive Bayesian)
逻辑回归(Logistic Regression)
支持向量机(Support Vector Machine, SVM)
这个项目中我用了KNN,以下着重介绍一下KNN算法:
K-近邻是一种分类算法,其思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。由此也说明了KNN算法的结果很大程度取决于K的选择。 在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:
接下来对KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
(1)、计算已知类别数据集中的点与当前点之间的操作;
(2)、按照距离递增次序排序
(3)、选取与当前点距离最小的k个点
(4)、确定前k个点所在类别出现的概率
(5)、返回前k个点出现概率最高的类别作为当前点的预测分类
2. 获取数据
数据决定机器学习结果的上限,而算法只是尽可能的逼近这个上限,可见数据在机器学习中的作用。对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。不仅如此还要对评估数据的量级,样本数量、特征数量,估算训练模型对内存的消耗。如果数据量太大可以考虑减少训练样本、降维或者使用分布式机器学习系统。我让这款产品的质量工程师提供了100个好样本,100个坏样本。这个量级的数据对于模型训练时的内存开销是毫无压力。在这些样本中,用其电流信号作为信号输入。
此项目中,我用的是NI的信号采集卡和Labview,非常的简单好用。
产品电流波形如下:
3. 特征工程(传统机器学习中的重点)
从上图原始数据中可以发现,产品的好坏之分是非常的明显,人一眼就可以看出,那么我们怎样告诉机器该分析波形中的那些参数呢?特征工程是非常能体现一个机器学习者的功底的,包括从原始数据中特征构建、特征提取、特征选择,非常有讲究。数据挖掘的大部分时间就花在特征工程上面,是机器学习非常基础而又必备的步骤。数据预处理、数据清洗、筛选显著特征、摒弃非显著特征等等都非常重要,建议深入学习。
(1),对时域数据进行傅里叶变换,可以清晰看到前20阶幅值的大小差异;
(2),看到合格产品频域曲线那个最高点没,那个是10阶频率;以此作为频率基准,算出基频(假如10阶是550赫兹,那么基频就是55赫兹),以此类推算出前20阶的频率范围
(3),butterworth滤波器,把时域信号进行带通滤波,带通范围就是上一步算出来的每个阶次的频率范围;这时你需要一个for循环,计算出这个20个阶次滤波后,再取傅里叶变换后的最大值。此时,就会得到20个特征向量;
(4),做一个假设,假设合格产品的时域波形都是一个标准的正弦波形,而实际上测得的波形都是非正弦,但是合格产品的波形是接近与正弦,而不良产品的波形则是非常杂乱,所以可以求实测的波形与标准正弦的相似度,以此也可作为一个特征向量;
(5),分析时域波形数据,波峰与波谷的特征也是非常明显。采用几个故障诊断中常用的时域信号处理方法:峰值指标,脉冲指标,裕度指标,歪度指标,峭度指标
把这些特征向量加入数据标签,数据可视化后可以分析出哪些特征值可以明显的将数据分类。
数据可视化代码采用Matlab作图:
红色点表示良品,蓝色点表示次品。可见大部分特征是适用此分类任务。
4. 训练模型、诊断、调优
模型诊断中至关重要的是判断过拟合、欠拟合,常见的方法是绘制学习曲线,交叉验证。通过增加训练的数据量、降低模型复杂度来降低过拟合的风险,提高特征的数量和质量、增加模型复杂来防止欠拟合。诊断后的模型需要进行进一步调优,调优后的新模型需要重新诊断,这是一个反复迭代不断逼近的过程,需要不断的尝试,进而达到最优的状态。
这里提一下Matlab与Python 。Python的优点是免费,各种封装好的库比较多,但文档比较混乱,查阅起来极为不便。 Matlab本质上是一款数学软件,尤其是对于矩阵运算处理效率极高,在实时仿真及代码生成方面也是一大特点。这款软件虽然贵,几个常用的工具包加起来就上好几十万,优点是文档写的明明白白,实在弄不清楚的地方也可以咨询他们的技术支持。
(1),训练模型,采用Matlab中的 Statistics and Machine Learning Toolbox,
predictors 是特征向量矩阵
responses是数据标签
(2),交叉验证, 绘制出混淆矩阵和ROC曲线,
由此看出这个模型的精度已经非常高,但有2个次品被判断为良品.
5. 模型验证、误差分析
通过测试数据,验证模型的有效性,观察误差样本,分析误差产生的原因,往往能使得我们找到提升算法性能的突破点。误差分析主要是分析出误差来源于数据、特征、算法。
模型经过交叉验证后,精度还是不错的。有时候我们会进入一个误区,就是死抠模型的精度,为了提高那百分之零点几苦下功夫。实际上没有必要,我们关注的是模型的泛化能力,用真实的数据去验证这个模型的可行性。
模型食用方法:yfit = model.predictFcn(feature)
yfit就是最终的分类结果,feature是特征输入,model是训练后的模型 .
我让产品工程师提供了一些新的样板,来验证这个模型的泛化能力。测试结果是200个产品中只有1个与真实标签不符,看来这个模型是具有很好的识别能力。判别错的可以根据产品的真实标签,再把这个数据放在对应的数据集,重新训练模型进行迭代,就可以优化这个模型。
6. 模型融合、部署、上线运行
这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。在实际项目投产中,还得考虑成本问题。所以最终将算法打包成动态链接库,供Labview调用。
以上步骤就是一个典型的传统机器学习平台搭建及应用,其重点是在特征工程环节。
目前人工智能的本质还是数学及统计学,一切的算法都是基于数据,数据质量的不稳定性带来的是:不可靠、不准确,除了不准确、不公平,还存在着最大的风险:不安全。目前它要发挥作用所需要的前置条件太过苛刻,输入的数据对其最终的结果有着决定性的影响,另外,它存在着很多漏洞,安全性也无法得到保证。如果我们要驶向理想中的人工智能未来,这些瓶颈还有待于人们的进一步的突破与挑战。