关于机器学习:搞定基于表格数据的-ML-模型有-Amazon-SageMaker-就够了

30次阅读

共计 8378 个字符,预计需要花费 21 分钟才能阅读完成。

表格类数据始终是泛滥行业(包含金融、医疗保健以及制造业等)所采取的次要数据存储办法。大多数机器学习(ML)用例也次要面向传统的结构化或表格数据。例如,欺诈检测用例会通过表格模式的输出内容(包含客户账户的历史记录或付款明细),以检测交易中是否存在欺诈危险。客户散失检测或产品需求预测等也都属于这类依赖于表格数据的用例。而在应用机器学习解决表格数据时,咱们往往须要引入人工审核流程,帮助管理工作流中须要人工加以判断的敏感环节。

在此类用例的工作流中,人工审核人员须要查看 ML 模型中以动态表格格局(通常被称为「数据框」)作为输出的全副或局部数字化特色,同时对输入后果中的某些行做出动静批改。在前一种状况下,负责构建工作 UI 的开发人员可能要求将表格数据作为动态、不可变的对象间接摄取至 UI 当中。而在后一种用例内,咱们则能够对表进行动静摄取。这时表将作为 UI 的一部分生成,并供审查者随时对其做出批改。

在本文中,咱们将理解如何应用 Amazon SageMaker 来构建、训练及部署基于表格数据的 ML 模型;同时应用 Amazon Augmented AI(Amazon A2I)构建并出现自定义工作模板,帮忙审查人员随时查看动态或动静表。

Amazon SageMaker 是一项全托管服务,可能将疾速构建、训练以及部署 ML 模型的能力交付至每一位开发人员及数据科学家手中。Amazon SageMaker 打消了机器学习流程中各环节所带来的沉重工作,帮忙客户构建起人工审核工作流,借此审查并验证 ML 模型的预测后果。Amazon A2I 则打消了构建这些人工查看工作流所带来的种种零碎管理负担。

其余常见人工工作流程还包含图像与视频内容审核,以及从文档中提取文本与实体等。咱们能够间接应用 ML 模型辨认不当内容或者提取实体,但在实践中往往依然须要工作人员联合具体用例及业务环境对模型预测加以验证。在这方面,Amazon A2I 可能帮忙大家疾速设计并建设起此类人工工作流。

咱们还能够通过 Amazon A2I 将 ML 预测出的随机样本发送给人工审查员,或者应用这些后果向利益相干方展现模型性能并审核模型预测能力。

先决条件

要实现本文的演练,须要满足以下先决条件:

  1. IAM 角色 —— 要创立人工审核工作流,咱们须要提供一个 AWS Identity and Access Management (IAM) 角色,用于向 Amazon A2I 授予拜访 Amazon Simple Storage Service (Amazon S3) 的权限,进而编写人工审核后果。此角色还须要具备其余信赖策略,保障 Amazon SageMaker 有权应用该角色。如此一来,Amazon A2I 即可依据角色对应的权限执行操作。对于如何对用于创立工作流定义的角色进行策略批改与增加,请参阅如何创立流定义。
  2. Amazon SageMaker notebook 实例 —— 对于创立 Amazon SageMaker notebook 实例的具体阐明,请参阅创立一个 Notebook 实例。
  3. S3 存储桶 —— 创立一个 S3 存储桶以保留人工工作流输入后果。请记录该存储桶的 ARN,以供后续在随附的 Jupyter notebook 中应用。
  4. 专项团队 —— 即负责对文档进行人工审核的员工。咱们能够指定外部员工组建审核团队,也能够抉择由 Amazon Mechanical Turk 聘用的员工、供应商的员工或者以外包模式募集的其余人员。在本文中,咱们将指定外部员工组建审核团队,由他们审查 Amazon A2I 工作流。对于更多详细信息,请参阅创立专项团队。请记录该团队的 ARN,以供后续在随附的 Jupyter notebook 中应用。
  5. Jupyter notebook—— 本文间接应用 GitHub%20Integration%20with%20tabular%20data.ipynb) 上提供的 Jupyter notebook。在数据集方面,咱们应用 scikit-learn [1] 提供的 UCI 乳腺癌检测数据集,即应用医学诊断数据预测病变属于良性还是恶性。

在 Amazon SageMaker 上训练并部署模型

训练与部署阶段中的关键步骤包含:

  1. 导入必要的库并加载数据集。
  2. 将数据集划分为训练数据集与测试数据集,而后训练 ML 模型。在本文中,咱们将应用 Amazon SageMaker 中内置的 XGBoost 算法训练模型,以得出二元预测后果。
  3. 创立一个端点,用以生成对于测试数据的推理示例。

咱们能够应用 scikit-learn 中的内置实用程序导入数据、导入数据集、生成训练与测试数据集,并最终实现模型训练以及预测后果生成。Scikit-learn 还提供另外一款实用程序,可依据固定比率(在大部分数据迷信利用中通常为 80:20)以及随机状态将数据集划分为训练集与测试集,借此确保后果的可重现性。数据集详情,参见以下截屏中的表格。

要实现模型训练,咱们须要应用内置的 XGBoost 算法,这是一种用于监督学习的高效、可扩大梯度晋升树算法。对于更多详细信息,请参阅 XGBoost 工作原理。

依照 Notebook 中的步骤实现模型训练。在模型训练实现后,Amazon SageMaker 会接手模型终端节点的部署与托管,如 Notebook 中所示。Amazon SageMaker 将为训练后的构型构建 HTTPS 终端节点,并依据需要主动扩大以在推理时提供流量。实现模型部署后,即可生成预测后果。请参阅随附 Notebook 中的以下源码:

## Lets now run predictions on our test set and use it to create a table containing our outputs.
import numpy as np
def predict(data, model, rows=500):
 split_array = np.array_split(data, int(data.shape[0] / float(rows) + 1))
 predictions = ''
 for array in split_array:
 predictions = ','.join([predictions, model.predict(array).decode('utf-8')])
 return np.round(np.fromstring(predictions[1:], sep=','))
## Generate predictions on the test set for the difference models
predictions = predict(test_data[list(test_data.columns)[1:]].values, xgb_predictor)

该单元格的输入为一系列预测后果:1 或 0 别离代表恶性或良性。

随后,咱们能够将模型输入合并至人工工作流当中。

创立工作工作模板、人工审查工作流以及人工循环

随附的 Jupyter notebook 中蕴含以下操作步骤:

  1. 创立一个工作工作(worker task)模板,用于创立工作 UI。此工作 UI 将显示输出数据,例如文档或图像,以及对审核人员的指导性阐明。此外,其中还提供供工作人员实现工作的交互式工具。对于更多详细信息,请参阅创立工作 UI。
  2. 创立一个人工审查工作流,也被称为流程定义。咱们应用流程定义来配置人工团队,并提供对于如何实现人工审查工作的领导信息。大家能够应用繁多流定义创立多个人工循环。对于更多详细信息,请参阅创立流定义。
  3. 创立一个人工循环,用于启动人工审查工作流并发送数据以供人工查看。在本文中,咱们应用自定义工作类型并通过 Amazon A2I Runtime API 启动人工循环。在自定义应用程序中调用 StartHumanLoop,即可将工作发送给人工审核人员。

上面,咱们将具体探讨如何在工作工作 UI 当中增加表格数据。

将表纳入工作工作 UI

Amazon A2I 应用 Liquid 实现模板自动化。Liquid 是一种开源内联标记语言,可在大括号内蕴含文本,并通过指令创立过滤器与控制流。

在本文中,咱们要求审核人员查看测试数据的特色,以判断模型输入后果是否精确。当初咱们开始编写模板。此模板由两局部组成:蕴含测试数据集特色的动态表,以及蕴含容许用户批改的预测后果的动静表。

这里应用以下模板:

template = r"""<script src="https://assets.crowd.aws/crowd-html-elements.js"></script>

<style>
 table, tr, th, td {
 border: 1px solid black;
 border-collapse: collapse;
 padding: 5px;
 }
</style>

<crowd-form>
 <div>
 <h1>Instructions</h1>
 <p>Please review the predictions in the Predictions table based on the input data table below, and make corrections where appropriate. </p>
 <p> Here are the labels: </p>
 <p> 0: Benign </p>
 <p> 1: Malignant </p>
 </div>
 <div>
 <h3> Breast cancer dataset </h3>
 <div id="my_table"> {{task.input.table | skip_autoescape}} </div>
 </div>
 <br>
 <h1> Predictions Table </h1>
 <table>
 <tr>
 <th>ROW NUMBER</th>
 <th>MODEL PREDICTION</th>
 <th>AGREE/DISAGREE WITH ML RATING?</th>
 <th>YOUR PREDICTION</th>
 <th>CHANGE REASON </th>
 </tr>
 
 {% for pair in task.input.Pairs %}
 
 <tr>
 <td>{{pair.row}}</td>
 <td><crowd-text-area name="predicted{{forloop.index}}" value="{{pair.prediction}}"></crowd-text-area></td>
 <td>
 <p>
 <input type="radio" id="agree{{forloop.index}}" name="rating{{forloop.index}}" value="agree" required>
 <label for="agree{{forloop.index}}">Agree</label>
 </p>
 <p>
 <input type="radio" id="disagree{{forloop.index}}" name="rating{{forloop.index}}" value="disagree" required>
 <label for="disagree{{forloop.index}}">Disagree</label> 
 </p>
 </td>
 <td>
 <p>
 <input type="text" name="True Prediction" placeholder="Enter your Prediction" />
 </p>
 </td>
 <td>
 <p>
 <input type="text" name="Change Reason" placeholder="Explain why you changed the prediction" />
 </p>
 </td>
 </tr>
 
 {% endfor %}
 
 </table>
</crowd-form>
"""def create_task_ui():'''
 Creates a Human Task UI resource.
 
 Returns:
 struct: HumanTaskUiArn
 '''
 
 response = sagemaker_client.create_human_task_ui(
 HumanTaskUiName=taskUIName,
 UiTemplate={'Content': template})
 return response

其中的 task.input.table 字段容许大家将动态表提取至工作工作 UI 当中。而 skip_autoescape 过滤器则负责将 pandas 表出现为 HTML 模式。对于更多详细信息,请参阅创立自定义工作模板。

其中的 task.input.Pairs 字段用于在工作工作 UI 中动静生成表。因为此表中蕴含预测后果并须要配合人工输出,因而大家能够在其中同时蕴含单选按钮与文本字段,以帮忙工作人员对模型的预测后果做出批准 / 不批准标记、在必要时更改模型预测后果,并提出更改的潜在起因。另外,这样的设计思路还能够限度咱们在 ML 模型中的应用的特色类型,借此满足某些严格要求防止偏见因素的监管要求,充沛恪守法规与合规性条款。

咱们还须要应用 pandas 实用程序,其用于将数据框转换为 HTML 格局。在以下示例代码片段当中,咱们须要加载测试数据的前五行以供人工审核者查看。对于表的动静局部,创立一个蕴含列标识符以及此前模型理论预测后果的表。

item_list = [{'row': "ROW_{}".format(x), 'prediction': predictions[x]} for x in range(5)]

[{'row': 'ROW_0', 'prediction': 1.0},
 {'row': 'ROW_1', 'prediction': 0.0},
 {'row': 'ROW_2', 'prediction': 0.0},
 {'row': 'ROW_3', 'prediction': 1.0},
 {'row': 'ROW_4', 'prediction': 1.0}]

当初咱们能够创立工作工作模板与人工审核工作流了。具体请参见以下代码片段:

# Create task UI
humanTaskUiResponse = create_task_ui()
humanTaskUiArn = humanTaskUiResponse['HumanTaskUiArn']
print(humanTaskUiArn)
create_workflow_definition_response = sagemaker_client.create_flow_definition(
 FlowDefinitionName= flowDefinitionName,
 RoleArn= role,
 HumanLoopConfig= {
 "WorkteamArn": WORKTEAM_ARN,
 "HumanTaskUiArn": humanTaskUiArn,
 "TaskCount": 1,
 "TaskDescription": "Make sure the labels are correct",
 "TaskTitle": "tabular data a2i demo"
 },
 OutputConfig={"S3OutputPath" : OUTPUT_PATH}
 )
flowDefinitionArn = create_workflow_definition_response['FlowDefinitionArn'] # let's save this ARN for future use

应用以下代码片段以启动人工循环:


ip_content = {"table": test_data.reset_index().drop(columns = ['index', 'label']).head().to_html(),
 'Pairs': item_list
 }

import json
humanLoopName = str(uuid.uuid4())

start_loop_response = a2i.start_human_loop(
 HumanLoopName=humanLoopName,
 FlowDefinitionArn=flowDefinitionArn,
 HumanLoopInput={"InputContent": json.dumps(ip_content)
 }
 )

在本文应用专项团队解决人工审核工作,因而工作人员能够在关上团队创立时接管到的链接,借此获取可视化 UI。

实现人工审核

以下截屏所示,为咱们应用的工作 UI。

上方的表中蕴含以 HTML 模式存在的 pandas 数据框,而 Predictions Table 表则是依据数据集内所有或局部行动静生成而来。Model Prediction 字段由基于此前测试数据集中相应行的模型推理所组成。在生成 UI 时,User Rating 意见(批准或不批准)、Your Prediction 以及 Change Reason 等字段皆为空白。

工作人员应用单选按钮以验证模型预测后果,并公布通过批改的预测后果。当然,工作人员也能够依据须要抉择输出更改起因(如以上截屏所示),借此帮忙数据迷信团队更好地设计上游模型再训练方法。例如,如果工作人员将模型预测判断为误报并公布了起因(例如某项特色可能属于异样值),则数据科学家能够在模型从新训练期间删除此数据点,以避免模型对异样值进行适度拟合。

在工作人员对新的预测后果进行评分并提交答案之后,咱们能够间接在 Amazon S3 中进行可视化输入,也能够间接通过 Amazon SageMaker notebook 环境中实现后果可视化。

查看人工审核后的后果

在提交审核之后,相干后果将被写入至咱们通过人工审核工作流指定的 Amazon S3 内输入地位。以下内容,为此地位上以 JSON 文件格式输入的后果。

l 人工审核回应

l 指向 StartHumanLoop API 的输出内容

l 关联的元数据

大家能够应用此信息来跟踪 ML 输入后果,并将其与人工审核输入关联起来:

import re
import pprint

pp = pprint.PrettyPrinter(indent=4)
for resp in completed_human_loops:
 splitted_string = re.split('s3://' + BUCKET + '/', resp['HumanLoopOutput']['OutputS3Uri'])
 output_bucket_key = splitted_string[1]

 response = s3.get_object(Bucket=BUCKET, Key=output_bucket_key)
 content = response["Body"].read()
 json_output = json.loads(content)
 pp.pprint(json_output)
 print('n')

其中 humanAnswers 键负责提供人工审核员对于各项更改的阐明信息。详见以下代码片段:

 'humanAnswers': [ { 'answerContent': { 'Change Reason': 'worst'
 'perimeter'
 'outlier',
 'True Prediction': '0',
 'predicted1': '1',
 'predicted2': '0',
 'predicted3': '0',
 'predicted4': '1',
 'predicted5': '1',
 'rating1': { 'agree': True,
 'disagree': False},
 'rating2': { 'agree': False,
 'disagree': True},
 'rating3': { 'agree': True,
 'disagree': False},
 'rating4': { 'agree': True,
 'disagree': False},
 'rating5': { 'agree': False,
 'disagree': True}},

至此,咱们曾经能够解析此 JSON 文档以提取相干输入后果,也能够在训练数据集中应用人工审核者提供的输入以从新训练模型,随时间推移一直改善模型推理性能。

资源清理

为防止产生不必要的后续老本,请在不再应用时删除相干资源,例如 Amazon SageMaker 终端节点、Notebook 实例以及模型工件。

总结

本文展现了两个用例,别离通过 Amazon A2I 将表格数据引入人工审核工作流中,且别离对应不可变动态表与动静表。当然,本文对于 Amazon A2I 性能的表述只能算是冰山一角。目前 Amazon A2I 曾经在 12 个 AWS 区域内正式上线,对于更多详细信息,请参阅区域表。

对于视频演示、Jupyter notebook 示例以及对于更多其余用例的详细信息,包含文档解决、内容审核、情感剖析、文本翻译等,请参阅 Amazon A2I 资源。

参考资料

[1] Dua, D. and Graff, C. (2019)。UCI 机器学习库 [http://archive.ics.uci.edu/ml]。加利福尼亚州尔湾市:加州大学信息与计算机科学学院。

正文完
 0