《Python大规模机器学习》— 2.4 ​数据流的特征管理

举报
华章计算机 发表于 2019/06/12 22:16:11 2019/06/12
【摘要】 本节书摘来自华章计算机《Python大规模机器学习》一书中的第2章,第2.4.1节,作者是[荷]巴斯蒂安·贾丁(Bastiaan Sjardin)[意]卢卡·马萨罗(Luca Massaron)[意]阿尔贝托·博斯凯蒂(Alberto Boschetti)王贵财 刘春明 译。

2.4    数据流的特征管理

数据流带来的问题是,不能像在处理一个完整的内存数据集那样进行评估。为找到给SGD非核心算法提供数据的正确且最佳的方法,要求首先调查数据(例如,获取文件初始实例),并查找你手头的数据类型:

使用以下数据类型进行区分:

  •  定量值

  •  整数编码的类别值

  •  文本形式表示的非结构化类别值

当数据定量时,它仅被提供给SGD学习器,但该算法对特征缩放非常敏感,也就是说,你必须把所有定量特征带入相同数值范围内,否则学习过程将难以准确收敛。常用的缩放策略是转换在[0,1]、[-1,1]之间的所有值,或将变量的均值中心归零并将其方差转换为1来标准化变量。对缩放策略的选择,我们没有特别的建议,但如果处理稀疏矩阵并且大多数值为零,则在[0,1]范围内的转换效果特别好,

至于内存中学习,在训练集上转换变量时必须注意所使用的值(基本上要求得到每个特征的最小值、最大值、平均值和标准偏差),并在测试集中重用它们,以保证结果一致性。

如果正在流化数据并且不可能将所有数据上传到内存中,则必须通过传递所有数据或至少部分数据对其进行计算 (采样总是可行的方法)。使用瞬间流(非复制流)会带来更具挑战性的问题,事实上,你必须不断追踪持续接收的值。

如果采样只需计算n个实例的统计数据(假设数据流无特定顺序),那么动态计算统计数据就需要记录正确的度量。

对于最小值和最大值,需要为每个定量特征分别存储一个变量。你从流中接收的第一个值应存储为初始最大值和最小值。对于每个新值,必须使用先前记录的最小值和最大值与其比较,如果新实例超出旧值的范围,则只需相应地更新变量。

此外,平均值不会导致任何特殊问题,因为你只需要保存所看到的值和实例数目的总和。至于方差,请回顾教科书中的描述:

image.png

注意,你需要知道平均值μ,它也是从流中增量学习得到的。但是,该公式可以解释如下:

image.png

由于只记录实例数量n和x值的总和,所以只需存储另一个变量,即x平方值的总和,这样你就能得到所需的全部值。

例如,从共享单车数据集能计算得到最终结果的运行平均值、标准差和范围,并能绘制这些统计数据随磁盘数据流变化的示意图:

 image.png

image.png

 

稍后,数据将从数据源以流方式传输,相对于temp特征的关键值将被记录为平均值的运行估计,并且在计算标准差后将其存储在两个单独列表中。

通过绘制列表中的值,可以检查估算值相对于最终结果的波动程度,并了解需要多少实例才能得到稳定均值和标准差估计值:

 

 image.png

如果之前处理过原始共享单车数据集,将得到一个存在明显数据趋势的图表(由于气温随季节变化,数据呈现按时间变化趋势,如图2-3所示)。

 image.png

图2-3数据呈现随时间变化趋势

 

相反,如果使用数据集的打乱版本Shuffled_har.csv文件作为数据源,我们就能获得一些更稳定和快速收敛的估计。确切地说,由于从数据流中观察更少实例,

我们能从平均值和标准差中学习到近似但更可靠的估计结果,如图2-4所示。

 image.png

图2-4从打乱的数据源观察到的结果

 

两图的差异提醒我们随机化观测顺序的重要性。即使学习简单的描述性统计数据,也会受到数据趋势的严重影响,因此,用SGD学习复杂模型时,必须更加注意。

2.4.1    描述目标

此外,还需要在开始之前研究目标变量。事实上,需要确定它所假定的值,如果是分类,还要确定它在类中是否不平衡,或者是数字时是否有偏差分布。如果正在学习数字响应,可以采用前面处理特征时的相同策略,而对于类,用一个保留类(键)计数及其频率(值)的Python字典就足够了。作为示例,我们将下载用于分类的数据集Forest Covertype数据。

为快速下载和准备该数据,我们将使用在本章的2.2.1中定义的gzip_FROM_UCI函数:

 image.png


如果运行代码时出现问题,或者你更愿意自己准备文件,只需访问UCI网站下载数据集,然后将其解压到Python当前工作目录中:

 image.png

一旦磁盘数据可用,我们就能扫描581 012个实例,从而将每行的最后一个值(代表我们估计的目标类)转换为相应的森林覆盖类型。

 image.png

输出显示Lodgepole Pine和Spruce/Fir两个类占大多数观测值。如果在流中适当打乱示例,则SGD将适当地学习正确的先验分布,并因此调整其发生概率(后验概率)。

如果与我们当前的情况相反,你的目标不是分类准确性,而是增加受试者工作特性(ROC)曲线下面积(AUC)或fl-score,则应加入用于评估的误差函数。有关其具体概述,请直接查阅http://scikit-learn.org/stable/modules/model_evaluation.html上的Scikit-learn文档,该文档介绍了在不平衡数据上训练的分类模型,所提供的信息能帮助你在部分拟合模型中定义SGDClassifier或sample_weight时平衡权重class_weight参数。两种方法都通过过度加权或低估来改变被观测实例的影响。在这两种方法中,修改这两个参数会改变先验分布。下一章将讨论加权类和实例。

在继续训练和与分类前,可以检查类比例是否总是一致,以便向SGD传递正确的先验概率:

 image.png

图2-5代码运行结果

 

在图2-5中,可以注意到,按照现有顺序流式传输数据时,示例的百分比是如何变化的。这种情况下,如果我们希望随机在线算法能从数据中正确学习,那么打乱很有必要。实际上,比例是可变的,这个数据集有某种顺序,也许是一个地理顺序,应该通过打乱数据来纠正,否则我们会冒高估或低估某些类与其他类的风险。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。