本帖最后由 丫丫 于 2015-7-4 12:46 编辑
问题导读
1、BigMl提供了一个什么样的管理平台?
2、BigML有哪些特性?
3、如何导入数据?
4、数据集是否可重复、可扩展、可导出?
5、什么是BigML决策树?
6、如何提高预测准确度?
7、如何评估结果?
BigML提供一个建立和共享数据集和模型的管理平台机器学习即服务(MLaaS)已经真实存在于云计算市场,而BigML的使命很简单明了:让机器学习更容易,更美妙,更加易于为所有人理解。 和IaaS和PaaS竞争对手的机器学习服务相比,BigML更接近于软件即服务(SaaS)。我最近使用过AmazonML,AzureML和Google Prediction API,所有这些都是一个庞大的网络服务生态系统的一部分,这个生态包括云存储、CDN、VPC和部署自动化等。 BigML却与平台无关,能够利用现有的云计算解决方案是它的优势。举个例子,它允许来自AWS S3、MS Azure、Google Storage、Google Drive和Dropbox等的数据导入。这个细节现在看起来似乎微不足道,但很有可能在未来改变游戏规则:一旦公共云基础设施成为商品,那么跨供应商的解决方案将是最好的选择。 BigML特性BigML只专注于机器学习,提供了一套更广泛的功能,这些功能都集成在一个可用的Web UI上。正如你所期望的那样,你可以加载数据集,训练和评估你的模型,并生成新的预测(无论逐一或成批)。 下面是我所知道的BigML所独有的好特性:
- 有各种各样的方式来加载你的原始数据,包括大多数的云存储系统,公共链接或私有的 CSV/ ARFF文件。
- 大量免费的数据集和模型可供使用,分类条理清晰,可以公开访问。
- 聚类算法和可视化:数据分析和可视化工具对于提出高质量的模型是必不可少的。
- 异常检测:应对异常值比较痛苦,而检测模式异常可以节省你的时间和金钱,甚至先于压缩你的模型。
- 弹性价格:你可以在订阅计划之间进行选择(最低学生价 $15 /月),账单到期即付,伴随着BigML积分,甚至购买你的私人VPC。
如何导入你的数据根据你的使用情况,你可能希望从现有的云存储系统中导入数据,提供一个公共网址,或直接上传CSV文件。在开发模式下,你甚至可以动态创建一个内联源。 即使在这一步,BigML也提供了一套很好的功能集:
- CSV解析配置。
- 字段类型选择。
- 字符串区域选择(英语,荷兰语,西班牙语或葡萄牙语)。
- Ÿ头文件解析( CSV具有或不具有标题行)。
- 日期—时间域扩张。
- 文本分析(语言检测,符号化,停用字,词干提取)。
有趣的是,你可以在任何时间更新你的源(Source)配置,无需任何额外的上传。 一旦你的源已准备好和正确解析,你可以用它来生成一个新的数据集。或者,你可以从他们的公开数据集画廊导入准备使用的数据。
数据集完全可重复使用,可扩展及可导出BigML数据集是很容易重用、编辑、扩展和导出。事实上,你可以很容易地重新命名并添加说明到你的领域中的每一个地方,添加新的成分(通过归一化、离散化、数学运算、遗漏值置换等),以及生成基于采样或自定义过滤器的子集。 此外,甚至在训练你的模型,你是对每个领域进行给定的值分布和统计,而且还是一个很不错的动态散点图工具可视化数据,一段时间两个维度。这里你可能想要探索你的功能空间,寻找模式,导出字符或者只是简单地获得乐趣。 在实际应用中,对于大多数操作数据集是你的起点。假设我们的目标是培训和评估一个分类模型。我们首先需要将我们的数据分割成更小的培训和测试机组:你可以通过培训和测试集拆分操作做到这一点。当然,你可以自由选择如何分配你的记录:80/20是默认的拆分逻辑。这个过程实际上将创建两个新的独立的数据集,只要你想,你便可以分析和操作它们。 一旦拆分完成后,你要选择新的训练集和启动配置模式操作。
BigML决策树机器学习模型可能是任何东西,它能够分析你的原始数据(最终标记),并能以某种方式学会如何应对新的和未知的数据。 决策树可能是你可以建立的模型最直观的类型。它们易于可视化和理解,也更容易储存,因为它们可以几乎直接转换成程序代码。即使你不是一个程序员,你可以把它作为双则判决的一个嵌套结构。 这正是每一个BigML模型所表现出来的。当你训练模型——从训练数据集开始——你被要求选择你的目标领域(即你的目标列)。为了减少数据过度拟合的效果和模型的大小,你通常需要某种形式的统计修剪,尽管你可以可以决定禁用它。 或者视情况,你可以配置更多的选项。
- 缺少拆分:在选择拆分(默认禁用)时是否包括缺失值。
- 节点阈值:节点的最大数(默认值为 512)。
- 重量:你可以选择重量记录字段指定一个权重,或者对你的类分配相对权重,。
- 采样和订购:你可以选择自定义子样本和混编的逻辑。
训练结束时,你将能够可视化你的模型,并获得翔实的报告,以更好地了解你的哪些领域更相关(见上图)。此外,模型的预测图形表示为一颗真实的树(在左侧下面)或者作为旭日(在右侧下面)。 在这一点上,你已经可以开始产生新的预测,但当然,我们首先要评估我们的模型的准确性。
多分类器融合可以提高你的预测准确度多分类器融合,涉及多个可供选择的模式,这将提供更好的预测性能,是一种能提高你的单模型系统的精度的有据可查的方式。每个模型可以使用数据的子集进行训练,或专注于特定的级层,以便他们能产生更好的预测协作。 在BigML你可以很容易地用配置集合数据集的操作来培养决策森林:你仅仅需要了解多少模型须接受培训。 这种做法极大地纠正过度拟合训练数据的决策树的习惯——并因此提高了整体的精度。就我而言,我设法使用10种模型的多分类器来提高3%的准确性,如果你能承受额外的时间,这可能是有意义的。 我还生成了100个模型的集合,但是,即使它增加了额外的1%的精确度,无论是在成本和速度方面,这显然还不是一个好的选择。
如何评估你的结果能够快速评估你的模型以及对照多种评估是机器学习作为服务产品的关键功能,我个人认为BigML已经做了很多工作。 特别地,你想针对你的数据集的一小部分来测试你的模型。我们以前创建的一个20%测试集,我用它来生成我的两个模型和集合的评估。你可以开始对模型进行评估操作,或者对你的数据集进行模型评估操作。需要不多的配置,除非你有特殊的取样或订货需求。 每一个评估是一个对象本身,将会被列在名单的评估清单。当然,基于你的模型类型(回归或分类),你将被示以各种度量。如果你的模型是一个分类器,你将被示以混淆矩阵,包括像准确度,精密度,召回,F值和Phi统计分类。 如果你的混沌矩阵太大了以至于不能再网页上呈现(假设你和我一样可能有6类),你可以下载Excel格式。这将类似于下图,其中顶部的图例为你显示每一个单元格表示什么,相对于主对角线的第一个元素(你可以在主对角线做相同的每个单元)。 但我的多分类器融合如何呢?它可以有更好的表现吗? 显然,它还有更好的应用。它使得总精度提升了2.82%,而且有些类更是高达5.34%。你可以与比较评估操作比较两个评估,呈现的是有着单一评估的相同的统计,以及对每个指标的相对比例相同的统计数据。 我的模型单独情况下是非常有效的,我可能不会选择支付多分类器融合的额外费用——包括在价格和速度两方面——尽管在许多情况下,过度拟合会消除掉你的预测能力,但是多分类器融合可以大幅度地提高你的准确度。 产生新的API绑定和BigMLer的预测 我要说的是BigML既方便用户也方便开发人员。他们花时间来编写大量的API客户端,甚至是一个称为BigMLer命令行工具。 当然,你可以通过API完成上面提到的每一个操作,但我相信,离线阶段可以更好地处理一个清晰和可靠的UI,特别是在模型和数据集定义中。 我选择了Python进行绑定,并编写了一个简单的脚本来生成新的预测。
- [mw_shl_code=python,true]from bigml.api import BigML
from bigml.model import Model
from bigml.ensemble import Ensemble
USE_ENSEMBLE = False
labels = {
'1': 'walking', '2': 'walking upstairs',
'3': 'walking downstairs', '4': 'sitting',
'5': 'standing', '6': 'laying'
}
def main():
api = BigML("alex-1", "YOUR_API_KEY", storage="./cache")
if USE_ENSEMBLE:
predictor = Ensemble('ensemble/5557c358200d5a7b4300001e', api=api)
else:
predictor = Model('model/5557ac99200d5a7b42000001', api=api)
#generate new prediction
#Note: params might differ btw Ensemble and Model, this is an example
prediction = predictor.predict(get_input_data(), with_confidence=True)
label = prediction[0]
confidence = prediction[1]
print("You are currently %s (class %s, %s%%)." % (labels[label], label, confidence) )
def get_input_data():
""" Retrieve input data from local CSV file """
with open('record.csv') as f:
record_str = f.readline()
#generate 'fieldN' dict (I had 562 un-named columns!)
record = {}
for i,val in enumerate(record_str.split(',')):
record['field%s' % (i+2)] = val
return record
if __name__ == '__main__':
main() [/mw_shl_code]
就实现性能而言,它只需要1.5到2秒调用至我的模型,直到我启用了本地存储选项:这将在本地存储所有的模型参数,避免阻塞API调用每一个未来的预测。本地缓存活跃起来之后,我的脚本执行时间下降到150毫秒。我的10种模型集合第一次大约花20秒钟来加载,然而每一次调用最多只用1秒:实际上它比一个单一的模型要慢10倍——虽然有10种预测被执行——但我认为1%的额外预测信任是值得的。也请记住,我的模型对超过560的输入功能和6个可能的输出类都有作用,所以我确信,平均模型的运行速度比我的模型要快很多! 或者,你可以通过点击下载可执行的模型来转变你的模型,转换成十五种不同语言/格式的程序代码。我使用Python版本做了一个尝试,它真的只需要几毫秒到就可以在本地执行:这可能一个很好的解决方案,假使你不希望安装新的库(例如,我能想到的嵌入式设备或网络隔离的客户)。 我当然满意这种服务——作为一个开发者——我非常感谢这么多的编程语言和平台的支持与努力,使每个人的工作变得简单。
|