客户来我们工厂审厂发现我们的X_ray当天没有检测,且之前的测量数据未保存怎么回复改善对策

在这篇文章中,将介绍机器学习项目的流程

首先,我们需要预览这个项目。项目的目的是什么,以房价预测为例,数据为StatLib的加州房产数据,那么目的就是预测街区的房产价格中位数。

要知道商业目的是什么,毕竟建立模型不是最终目的。比如说,目的是输出一个价格传给另一套系统来判断是否值得投资以及利润是多少。
要知道现在的解决方案效果怎么样,比如会给出一个现解决方案的误差率是alpha。
现在我们可以进一步研究问题,明确这个问题是监督/非监督,还是强化模型?是分类/回归,还是聚类等其他。要使用批量学习还是线上学习?
分析,我们有房价的值,所以是一个监督问题;我们最终是要预测得到房价中位数,因此是一个回归问题,而且是一个多变量预测回归,因为有很多影响参数;另外,没有连续的数据流入,没有特别需求需要对数据变动作出快速适应。数据量不大可以放到内存中,因此批量学习就可以。【如果数据量很大,你可以要么在多个服务器上对批量学习做拆分(使用 MapReduce 技术,后面会看到),或是使用线上学习】

在这里我们需要选择一个评价指标,回归问题的典型指标是均方根误差RMSE,它表征的是系统预测误差的标准差。
另外,也可以使用差平方绝对误差。

再一次核实之前的分析是否准确,需要联系下游的处理进行检查。

一般来说,可以从数据库中下载数据,但是对于数据库一般需要密码及权限。在这里,我们可以直接从网页数据,当然,这是具体问题具体分析的。

下载好数据后,我们需要查看一下数据的结果,预览一下。基本用到以下代码

data=()#返回特征的数量及类型 data.describe()#返回数量、均值、标准差、最值等信息

另外也可以使用柱状图通过可视化查看数据的分布,代码:

在查看数据前,最好先创建一下测试集,以免查看数据后因为思维定势影响测试集的选择。
一种方法是可以随机选择测试集,比如随机选择20%的数据作为测试集,但是这样当数据集更新时,测试集会变化,我们可以使用随机数处理。代码:

另外,随机取数有可能丢失掉关键特征的分布。比如,有一个特征A对最终标签的贡献很大(两者之间相关性很强),
那么我们也应该在测试集中保证A的分布符合原数据集的分布趋势。这时可以使用分层采样。代码:

可通过以下代码检查分层采样的结果:

注意最后需要将生成的A_new标签删除,用drop命令,代码:

这样我们就生成了两组训练-测试集,随机的和分层的。

经常性的,我们需要首先对数据进行一下观察,可以判断特征与标签的关系以及哪些特征的作用或者影响更大。在这里使用matplotlib库即可,如:

可以使用corr()方法计算每对属性间的标准相关系数,如:

注意corr()只能表征线性关系,对于非线性关系直接忽视,因此参考性有局限。还有一种检测属性间相关系数的方法时pandas的scatter_matrix函数,如:

有时候仅仅使用原有的特征数据的效果并不好,这是可以考虑一下将一些特征组合产生新的特征,比如将人数/家庭,得到每户的人数这样一个特征。如:

然后可以重新观察相关性。

不要手工来做,你需要写一些函数,理由如下:
函数可以让你在任何数据集上(比如,你下一次获取的是一个新的数据集)方便地进行重复数据转换。
你能慢慢建立一个转换函数库,可以在未来的项目中复用。
在将数据传给算法之前,你可以在实时系统中使用这些函数。
这可以让你方便地尝试多种数据转换,查看哪些转换方法结合起来效果最好。
有一点需要注意,那就是要时刻记得复制数据,保证后面的数据处理尽量不要影响最初的数据。做好标记。

原数据中会存在缺失值等问题,因此需要对数据进行清洗。这一非常关键的一步。
对于缺失值的处理,有三种方式
1、直接删掉缺失值所在的行;2、如果一个特征的缺失值太多,那么直接删掉该特征;3、对缺失位置进行赋值(用0、中位数或者平均值等)。如:

尽量采用第三种方式,这样可以充分利用原数据。可以使用sklearn的Imputer类来处理缺失值。

数据中会有一些文本类型,在处理时我们可以使用one-hot对其进行重新编码,这需要两个转换(文本分类到整数分类,再到one-hot向量)

但是,上面的类也应用于标签列的转换,正确的做法时用sklearn即将提供的CategoricalEncoder类,如:

转换器的作用是将一些数据处理的操作集中在一起执行,比如前面叙述的清洗、属性组合等,另外可以将自制的转换器与sklearn的流水线无缝衔接工作。这一部分的示例代码可以查看自己写的文件(备注:)。这一部分可以将属性组合写在里面。
注意这里可以为属性设置一些超参数,检查这个属性是否地ML的算法有帮助。

这个步骤很重要,针对的是输入数值属性量度的不同问题。比如,年龄属性在20~50,而收入分布在,这样的数据应用于算法的性能不会太好。通常情况下不要对目标值进行缩放。
注:所有的数据转换等操作都要分别作用于训练集和测试集,不要向完成的数据集使用。

流水线的作用时创建一种模式,使得数据可以按照一定顺序进行处理和转化。例如下面是一个完整的处理数值和类别属性的流水线:

#这一部分最好写在前面
 
至此,我们得到了处理后的训练集(不带标签)housing_prepared,标签集housing_labels,测试集(未经处理,并带标签)。

 

 
到这里我们就可以选择算法模型对数据进行训练学习(其实我们可以发现大多数的工作都集中在数据的预处理上,包括清洗可视化文类属性转化等)。
评价模型,可以使用均方根误差。
当然不仅是线性回归,同样可以使用其他模型,比如决策树模型、随机森林模型,步骤同上。

使用交叉验证做更佳的评价

 
 
另外,我们可以使用交叉验证来验证模型,以决策树为例:
以上,随机地将训练集分成十个不同的子集,成为“折”,然后训练评估决策树模型 10 次,每次选一个不用的折来做评估,用其它 9 个来做训练。结果是一个包含 10 个评分的数组。
Scikit-Learn 交叉验证功能期望的是效用函数(越大越好)而不是损失函数(越低越好),因此得分函数实际上与 MSE 相反(即负值),这就是为什么前面的代码在计算平方根之前先计算-scores。
结果查看:
当然也可以将线性回归和随机森林适用到交叉验证上。另外还可以使用其他算法,比如神经网络、不同核心的支持向量机等。不要将太多时间花在调参上。
到这儿的目标是先列出几个合适的模型列表。

 

 

分析可知,以上训练总共有18 × 5 = 90轮。
参数的最佳组合及最佳估计器:

 
当超参数的搜索空间很大时,最好使用RandomizedSearchCV。这个类的使用方法和类GridSearchCV很相似,但它不是尝试所有可能的组合,而是通过选择每个超参数的一个随机值的特定数量的随机组合。

 
另一种微调系统的方法是将表现最好的模型组合起来。

分析最佳模型和它们的误差

 
 
通过分析最佳模型,常常可以获得对问题更深的了解。比如,RandomForestRegressor可以指出每个属性对于做出准确预测的相对重要性: #将重要性分数与属性名放在一起
根据以上重要性分数,我们可以舍弃一些不重要的属性等

 
终于调试完模型,接下来我们需要用测试集来测试,注意,我们之前分割数据之后,测试集一直没用,这时我们需要先对测试集进行一下处理,比如丢掉标签、流水线处理等。然后再将我们的模型应用上去。
到这,我们就基本完成了模型的创建和测试,接下来就需要将结果或者结论展示出来。

 
将以上模型植入公司系统,实现自动化运行。

 
不要浪费在高级算法上,会使用就可以了。重点在于理解业务和数据,以及数据的处理。
注:此文章参考了GitHub-PeterHo的文章,感谢。

我要回帖

更多关于 审神者X不动行光 的文章

 

随机推荐