<jupyter_start><jupyter_text>SageMaker で自分たちの機械学習アルゴリズムの学習・推論を行う ノートブックに含まれる内容- BYOA を SageMaker で行うときの，基本的なやりかた ノートブックで使われている手法の詳細- アルゴリズム: DecisionTreeClassifier- データ: iris  セットアップ<jupyter_code>import boto3
import re

import os
import numpy as np
import pandas as pd
from sagemaker import get_execution_role

# AWS credential で指定された role を返す
role = get_execution_role()
# SageMaker のセッションを作成
import sagemaker as sage
from time import gmtime, strftime

sess = sage.Session()<jupyter_output><empty_output><jupyter_text>学習用データを S3 にアップロードSageMaker の学習時につかうデータは，S3 に置く必要があります．ここでは，ローカルにある iris データをいったん SageMaker SDK の `session` クラスにある `upload_data()` メソッドを使って，ノートブックインスタンスのローカルから S3 にアップロードします．デフォルトでは SageMaker は `sagemaker-{region}-{your aws account number}` というバケットを使用します．当該バケットがない場合には，自動で新しく作成します．`upload_data()` メソッドの引数に `bucket=XXXX` という形でデータを配置するバケットを指定することが可能です．以下を実行する前に，**2 行目の `data/scikit-byo-iris/XX` の `XX` を指定された適切な数字に変更**してください<jupyter_code># S3 プレフィックス
prefix = 'data/scikit-byo-iris/XX'

WORK_DIRECTORY = 'data'
data_location = sess.upload_data(WORK_DIRECTORY, key_prefix=prefix)<jupyter_output><empty_output><jupyter_text>モデルの学習を実行SageMaker で学習を行うために，SageMaker SDK で `Estimator` オブジェクトをつくります．このオブジェクトには，学習をおこなうために以下の設定が含まれます．その上で，`fit()` メソッドで学習を実施します．学習には 5 分程度時間がかかります．* __container name__: 02 のノートブックで作成した ECR のコンテナイメージ* __role__: ジョブを実行する IAM role* __instance count__:  学習ジョブに使うインスタンス数* __instance type__ 学習ジョブに使うインスタンスタイプ* __output path__: 学習の成果物が置かれる S3 の場所* __session__: すぐ上で作成した，SageMaker セッションまた，以下を実行する前に，**3 行目の `decision-trees-sample-XX` の `XX` を指定された適切な数字に変更**してください<jupyter_code>account = sess.boto_session.client('sts').get_caller_identity()['Account']
region = sess.boto_session.region_name
image = '{}.dkr.ecr.{}.amazonaws.com/decision-trees-sample-XX'.format(account, region)

classifier = sage.estimator.Estimator(
    image,
    role,
    1,
    'ml.m4.xlarge',
    output_path="s3://{}/output".format(sess.default_bucket()),
    sagemaker_session=sess)

classifier.fit(data_location)<jupyter_output><empty_output><jupyter_text>また，学習のジョブを実行する際に，ハイパーパラメタを変えて複数のジョブを実行したい場合があります．現在の SageMaker Python SDK の　`Estimato.fit()` メソッドは[非同期実行をサポートしていない](https://github.com/aws/sagemaker-python-sdk/blob/f43b9c3c54b152829e7b683c5a46e4cd2b3d242e/src/sagemaker/estimator.pyL156)ため，ここでは簡単な[ラッパー](util/estimator_wrapper.py)を作って，非同期で実行できるようにしています（なお，[Issue は既に上がっている](https://github.com/aws/sagemaker-python-sdk/issues/4)ため，じきに修正される予定です）．<jupyter_code>from util.estimator_wrapper import EstimatorWrapper

wrapper = EstimatorWrapper(classifier)

wrapper.set_hyperparameters(max_leaf_nodes=10)
wrapper.fit(data_location)
wrapper.set_hyperparameters(max_leaf_nodes=5)
wrapper.fit(data_location)<jupyter_output><empty_output><jupyter_text>モデルの推論を実行推論を行うために，まず学習したモデルをデプロイします．`deploy()` メソッドでは，デプロイ先エンドポイントのインスタンス数，インスタンスタイプを指定します．また併せて，オプションで（リクエストで渡されるデータの）シリアライザと（レスポンスで返されるデータの）デシリアライザを指定することも可能です．モデルのデプロイには 10 分程度時間がかかります．<jupyter_code>from sagemaker.predictor import csv_serializer
predictor = classifier.deploy(
    1,
    'ml.m4.xlarge',
    serializer=csv_serializer)
# 推論用のデータを準備
test_X = pd.DataFrame([[5.0, 3.2, 1.2, 4.3], [4.5, 2.3, 1.3, 0.3], [5.7, 2.8, 4.1, 1.3]])

print(test_X)
# 推論を実行して，結果を表示
for i, row in test_X.iterrows():
    result = predictor.predict(row.values).decode('utf-8')
    print('predict result of data[{}] is "{}"'.format(i, result.rstrip()))<jupyter_output><empty_output><jupyter_text>エンドポイントの削除全て終わったら，エンドポイントを削除します．<jupyter_code>sess.delete_endpoint(predictor.endpoint)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11673699015471167, 'fraction_numerical': 0.02109704641350211, 'mean_word_length': 8.636856368563686, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 25, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '61186', 'license': 'MIT', 'n_tokens_mistral': 2084, 'n_tokens_neox': 1967, 'n_words': 198, 'path': 'bring_your_own_container/scikit_bring_your_own/03_scikit_bring_your_own.ipynb', 'repo_name': 'smrmkt/sagemaker-notebooks', 'size': '3555'}