<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AWS &#8211; 機械学習 入門コースの決定版!機械学習エンジニアを目指すならcodexa（コデクサ）</title>
	<atom:link href="https://www.codexa.net/category/aws/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codexa.net</link>
	<description>毎日1400名以上のエンジニアが利用してる機械学習 入門コースの決定版！機械学習に必要な線形代数や統計基礎、Pythonライブラリなどの基礎コースも無料で公開中！</description>
	<lastBuildDate>Wed, 16 Jan 2019 02:43:14 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.7.7</generator>

<image>
	<url>https://www.codexa.net/wp-content/uploads/2017/11/cropped-favicon-32x32.png</url>
	<title>AWS &#8211; 機械学習 入門コースの決定版!機械学習エンジニアを目指すならcodexa（コデクサ）</title>
	<link>https://www.codexa.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ゲームソフトの売行きをXGBoostで予測してみた【Amazon SageMaker ノートブック＋モデル訓練＋モデルホスティングまで】</title>
		<link>https://www.codexa.net/amazon-sagamaker-xgboost-game-sales-predictions/</link>
					<comments>https://www.codexa.net/amazon-sagamaker-xgboost-game-sales-predictions/#respond</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Thu, 21 Dec 2017 07:24:37 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[Kaggle]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=778</guid>

					<description><![CDATA[2017年11月にサービスインした、アマゾンAWSの新しい機械学習サービス「SageMaker」。codexaの機械学習チーム内でも、利用することが増えてきており、機会学習エンジニアの必須プラットフォームになる可能性をひ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>2017年11月にサービスインした、アマゾンAWSの新しい機械学習サービス「SageMaker」。codexaの機械学習チーム内でも、利用することが増えてきており、機会学習エンジニアの必須プラットフォームになる可能性をひしひしと感じています。</p>
<p>さて、先日に公開した、第一弾チュートリアル「<a href="https://www.codexa.net/amazon-sagemaker-tutorial-marketing-offers/" target="_blank" rel="noopener">Amazon SageMakerを使って銀行定期預金の見込み顧客を予測【SageMaker ＋XGBoost 機械学習初心者チュートリアル】</a>」に続いて、今回は第二弾のAmazon SageMaker初心者向けチュートリアルとなります！</p>
<p>前回は銀行の定期預金マーケティングの予測でしたが、今回は<strong>ゲームソフトの売行き予測をXGBoostで行います</strong>。本チュートリアルの概要は下記となります。（チュートリアル参照元は<a href="https://github.com/awslabs/amazon-sagemaker-examples/tree/master/introduction_to_applying_machine_learning/video_game_sales" target="_blank" rel="nofollow noopener">こちら</a>）</p>
<p><span style="text-decoration: underline;"><strong>チュートリアルに掛かる時間</strong></span></p>
<p>1時間〜3時間程度で実施可能です</p>
<p><span style="text-decoration: underline;"><strong>発生するAWS料金</strong></span></p>
<p>最低限のインスタンスを利用して<strong>3ドル〜5ドル</strong>となります。SageMakerの無料枠の利用も可能ですので、使える方は無料枠でお試しください。<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;無料枠を利用しない限りは、料金が発生します。インスタンスの選択など、必ず各自の責任で本チュートリアルを実施ください。&nbsp;</span>
<div class="su-note"  style="border-color:#e2cbcb;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#fce5e5;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">
<p>【重要】</p>
<p><strong>チュートリアル終了後にインスタンスを放置しておくと、無駄な料金が発生していまします。チュートリアル終了後は、必ずインスタンスの停止または削除を行いましょう！</strong></p>
</div></div>
<p><span style="text-decoration: underline;"><strong>本チュートリアルで実施する概要</strong></span></p>
<ul>
<li>Amazon SageMakerのノートブックでデータ前処理</li>
<li>Boto3経由でS3とSagaMakerの連携</li>
<li>モデルトレーニングインスタンスでSageMaker XGBoostの訓練</li>
<li>モデルホスティングインスタンスで訓練済みモデルをホスト</li>
<li>テストデータをホスティングしたモデルを使って予測値を取得</li>
<li>結果確認</li>
</ul>
<p>今回ですが第二回目となりますので、登録や初期設定の詳細に関しては省いています。まだSageMakerを一度も触られたことがない方は、<a href="https://www.codexa.net/amazon-sagemaker-tutorial-marketing-offers/">第一弾目</a>からどうぞ。</p>
<p>では、早速、やってみましょう！</p>
<h3>SageMaker ノートブックインスタンスの立ち上げ</h3>
<p>SageMakerのメリットの一つとして、クラウドでJupyter Notebookが簡単に使えることです。機械学習で必要なライブラリやフレームワークが、すでに使える環境ですので、大きな時間短縮となります。</p>
<p>では、SageMakerへログインをしてノートブックインスタンスの立ち上げを行なっていきましょう。まだSageMakerのアカウントをお持ちでない方は、<a href="https://aws.amazon.com/jp/sagemaker/" target="_blank" rel="nofollow noopener">こちら</a>から登録をお願いいたします。</p>
<p>インスタンスの立ち上げですが、基本的には下記の3つの設定が必要なります。</p>
<ul>
<li>ノートブックインスタンス名</li>
<li>ノートブックインスタンスのタイプ</li>
<li>IAMロール</li>
</ul>
<p>今回はノートブックインスタンス名を「hit-games」と名付けて作成しました。インスタンスのタイプは、一番安い「ml.t2.medium」を利用しています。無料枠が利用可能な方は、こちらへ無料枠用のタイプが出ているかと思いますので、適宜、そちらを選んで下さい。SageMakerの料金設定は<a href="https://aws.amazon.com/jp/sagemaker/pricing/" target="_blank" rel="nofollow noopener">こちらのページ</a>を各自参照して、料金を理解した上での利用をお願い致します。また、<a href="https://www.codexa.net/amazon-sagemaker-tutorial-marketing-offers/" target="_blank" rel="noopener">IAMロールの設定はSageMaker一段目チュートリアルをご参照ください</a>。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-783" src="https://www.codexa.net/wp-content/uploads/2017/12/1.png" alt="" width="807" height="528" srcset="https://www.codexa.net/wp-content/uploads/2017/12/1.png 807w, https://www.codexa.net/wp-content/uploads/2017/12/1-300x196.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/1-768x502.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/1-304x199.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/1-241x158.png 241w" sizes="(max-width: 807px) 100vw, 807px" /></p>
<p>ノートブックインスタンスの立ち上げが完了したら、次はJupyter Notebookで新しいノートを作成しましょう。下記の画面の「New」のドロップダウンから「conda_python3」を選択して、新規ノートブックを作成します。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-784" src="https://www.codexa.net/wp-content/uploads/2017/12/2-1024x460.png" alt="" width="1024" height="460" srcset="https://www.codexa.net/wp-content/uploads/2017/12/2-1024x460.png 1024w, https://www.codexa.net/wp-content/uploads/2017/12/2-300x135.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/2-768x345.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/2-304x137.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/2.png 1153w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>これで、ノートブックインスタンスの準備完了です。次にS3のバケット名とリージョンの確認を行いましょう。<strong>S3とSageMakerのリージョンが異なると、使えませんので気をつけましょう。</strong>S3のコンソールへログインをして、バケット名とリージョンの確認をお願いいたします。本チュートリアルでは、SageMakerの「<strong>米国東部（バージニア北部）</strong>」を利用していますので、s3も同様のリージョンで作られているのが確認できます。</p>
<p><strong><img loading="lazy" class="aligncenter size-full wp-image-785" src="https://www.codexa.net/wp-content/uploads/2017/12/3.png" alt="" width="1005" height="320" srcset="https://www.codexa.net/wp-content/uploads/2017/12/3.png 1005w, https://www.codexa.net/wp-content/uploads/2017/12/3-300x96.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/3-768x245.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/3-304x97.png 304w" sizes="(max-width: 1005px) 100vw, 1005px" /></strong></p>
<p>これで、ノートブックインスタンスの作成は完了です。S３のバケット名ですが、後ほど使いますので、どこかにメモっておきましょう。</p>
<p>次はデータセットの取得とノートブックインスタンスを利用して前処理へ進みましょう！</p>
<h3>データセットの取得</h3>
<p>本チュートリアルで使うデータセットは<a href="https://www.kaggle.com/rush4ratio/video-game-sales-with-ratings/data" target="_blank" rel="noopener">KaggleのVideo Game Sales with Ratings</a>（意訳：ビデオゲームの売上とレビュー）を使います。Kaggleにまだ登録されていない方は、この機会に登録をお勧めいたします。（<a href="https://www.codexa.net/what-is-kaggle/" target="_blank" rel="noopener">Kaggleの詳しい説明はこちらをご参考</a>）</p>
<p>登録完了後に「Data」のページからデータセットのダウロードが可能です。<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Video_Games_Sales_as_at_22_Dec_2016.csv&nbsp;</span>をローカルにダウロードしましょう。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-787" src="https://www.codexa.net/wp-content/uploads/2017/12/4.png" alt="" width="953" height="334" srcset="https://www.codexa.net/wp-content/uploads/2017/12/4.png 953w, https://www.codexa.net/wp-content/uploads/2017/12/4-300x105.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/4-768x269.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/4-304x107.png 304w" sizes="(max-width: 953px) 100vw, 953px" /></p>
<p>データセットのダウロードが完了したら、次はS3へアップロードを行います。SageMakerと同じリージョンのS3のバケット直下へ、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Video_Games_Sales_as_at_22_Dec_2016.csv&nbsp;</span>のアップロードをしてください。</p>
<p>次に、SageMaker ノートブックで、S3へ格納したデータセットを読み込んで、データの前処理を行います。先ほど作成したノートブックを開きましょう。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-790" src="https://www.codexa.net/wp-content/uploads/2017/12/16-1024x254.png" alt="" width="1024" height="254" srcset="https://www.codexa.net/wp-content/uploads/2017/12/16-1024x254.png 1024w, https://www.codexa.net/wp-content/uploads/2017/12/16-300x74.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/16-768x191.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/16-304x75.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/16.png 1040w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>まずは、S3のバケット名の指定、さらにS3で使うプレフィックスとIAM Roleの宣言をしましょう。ノートブックの一番最初のセルへ下記のコードを入力して、<span class="su-label su-label-type-black">Shift + Enter</span>で実行しましょう。</p><pre class="crayon-plain-tag">bucket = 'hideto-ml'
prefix = 'sagemaker/videogames_xgboost'

# IAMのRoleを宣言
import sagemaker
role = sagemaker.get_execution_role()</pre><p>
次に本チュートリアルで使う機械学習系のライブラリのインポートを一括で行います。今回使うライブラリですが、<strong>全てSageMakerにインストール済</strong>ですので、特に事前の作業は必要ありません。</p>
<p><a href="https://www.codexa.net/numpy/" target="_blank" rel="noopener">Numpy</a>や<a href="https://www.codexa.net/pandas/" target="_blank" rel="noopener">Pandas</a>などの機械学習定番のライブラリに加えて、PythonとAWSをブリッジングしてくれるboto3も使います。</p><pre class="crayon-plain-tag"># 必要なライブラリのインポートをしましょう
# すべてsagemakerで用意されていますので追加作業なし
import numpy as np                                
import pandas as pd                               
import matplotlib.pyplot as plt   
from IPython.display import Image                 
from IPython.display import display               
from sklearn.datasets import dump_svmlight_file   
from time import gmtime, strftime                 
import sys                                        
import math                                       
import json
import boto3</pre><p>
次は先ほどKaggleからダウロードして、S3へ格納したファイルの読み込みを行います。ファイル名を指定して、Boto3経由でS3からSageMakerへファイルを移しましょう。さらに、CSVファイルからPandasデータフレームへの変換も行なって、データの表示をしてみましょう。</p><pre class="crayon-plain-tag"># KaggleからダウロードしたデータセットをS3のバケットへ格納
# ファイル名を指定する
raw_data_filename = 'Video_Games_Sales_as_at_22_Dec_2016.csv'


# boto3経由でs3内に格納したデータをSageMakerのノートブックインスタンスへ移します
s3 = boto3.resource('s3')
s3.Bucket(bucket).download_file(raw_data_filename, 'raw_data.csv')


# PandasのデータフレームへCSVファイルを変換
# Pandasの行表示制限のオプション設定を変更
# データを表示させる
data = pd.read_csv('./raw_data.csv')
pd.set_option('display.max_rows', 20)
data</pre><p>
<img loading="lazy" class="aligncenter size-large wp-image-791" src="https://www.codexa.net/wp-content/uploads/2017/12/data_1-1024x179.png" alt="" width="1024" height="179" srcset="https://www.codexa.net/wp-content/uploads/2017/12/data_1-1024x179.png 1024w, https://www.codexa.net/wp-content/uploads/2017/12/data_1-300x53.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/data_1-768x134.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/data_1-304x53.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/data_1.png 1028w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>次は、このデータセットの概要の確認と予測ターゲットの設定を行います。</p>
<h3>データセットの確認と予想ターゲットの設定</h3>
<p>こちらのデータセットですが、KaggleのDataのページにて詳細が記載してあります。各項目の概要を紐解いていきましょう。データの提供元は<a href="http://www.metacritic.com/" target="_blank" rel="nofollow noopener">Metacritic</a>（メタクリティック）という、ゲームや音楽などをレビュー集積するウェブサービスとなっています。</p>
<p>各項目の概要</p>
<ul>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Name&nbsp;</span> ゲームタイトル</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Platform&nbsp;</span> ゲーム機種別</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Year_of_Release&nbsp;</span> ゲーム発売年</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Genre&nbsp;</span></li>
<li>ゲームのカテゴリ</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Publisher&nbsp;</span></li>
<li>ゲーム販売者名</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;NA_Sales&nbsp;</span> 北米の販売数（単位：百万）</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;EU_Sales&nbsp;</span> ECの販売数（単位：百万）</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;JP_Sales&nbsp;</span> 日本の販売数（単位：百万）</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Other_Sales&nbsp;</span> 上記以外の地域の販売数（単位：百万）</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Global_Sales&nbsp;</span> 全世界の合計販売数（単位：百万）</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Critic_Score&nbsp;</span> メタクリティックが統計したスコア</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Critic_Count&nbsp;</span> Critic_Scoreの算出元となるレビュー数</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span> メタクリティックのユーザーがつけた評価スコア</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Count&nbsp;</span> User_Scoreの算出元となるユーザー数</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Developer&nbsp;</span> ゲーム開発名</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Rating&nbsp;</span> アメリカのゲーム利用の年齢制限レーティング</li>
</ul>
<p>データセット概要</p>
<ul>
<li>16719行16列のデータセット</li>
<li>Name（ゲームタイトル）のユニーク数は約1200</li>
<li>Platform（ゲーム機）のユニー数は31</li>
<li>Global_SalesなどSales関連の単位は全てMillion（百万）</li>
<li>Global_Salesの平均値は0.53（つまり53万個の販売数）</li>
</ul>
<p>余談ではありますが、こちらのデータを色々と深掘りしてみると面白いですね！別途、時間がある方は深掘りして見ると、データセットの処理の良い勉強になるかと思います！</p>
<p>さて、次は予測ターゲットの設定を考えましょう。今回の予測ターゲットですが、「<strong>ゲームソフトがヒットするかどうか</strong>」を予測しましょう。ヒットの定義として、<strong>ゲームソフトが100万本以上売れたらヒット（ミリオンセラー）</strong>とします。</p>
<p>ということで、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Global_Sales&nbsp;</span>のデータ値を参照して、予測ターゲット<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y&nbsp;</span>を作成しましょう。さらに、今回のデータセットでのミリオンセラーの分布を確認してみましょう。</p><pre class="crayon-plain-tag"># ターゲットを設定
# Global_Salesで1（100万本）以上の売上を基準としてyを作成
data['y'] = (data['Global_Sales'] &gt; 1)

# ターゲットの分布を確認
plt.bar(['not a hit', 'hit'], data['y'].value_counts())
plt.show()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-792" src="https://www.codexa.net/wp-content/uploads/2017/12/hit-distribution-sagemaker.png" alt="" width="441" height="254" srcset="https://www.codexa.net/wp-content/uploads/2017/12/hit-distribution-sagemaker.png 441w, https://www.codexa.net/wp-content/uploads/2017/12/hit-distribution-sagemaker-300x173.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/hit-distribution-sagemaker-304x175.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/hit-distribution-sagemaker-274x158.png 274w" sizes="(max-width: 441px) 100vw, 441px" /></p>
<p>当然といえば当然ですが、ミリオンセラーの販売実績は非常に高い壁のようですね（笑）。莫大なお金と時間を投じても、売れるゲームと売れないゲームがあるという厳しい現実を表したデータです。</p>
<p>予測ターゲットの設定ができましたので、次はいよいよ特徴量を決めていきましょう。データの各項目を見てみると、予測ターゲット（<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Global_Sales&nbsp;</span>）に特に関係が強うそうなデータとして、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span>と<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Critic_Score&nbsp;</span>が考えられます。この2項目のデータと予測ターゲットyの相関を対数目盛を利用してプロッティングしてみましょう。</p><pre class="crayon-plain-tag"># 次は特徴量を決めます
# ゲームのレビュー（User_ScoreとCritic_Score）と販売量（Global_Sales）の相関性は？
# 対数目盛を使ってグラフにしてみよう
viz = data.filter(['User_Score','Critic_Score', 'Global_Sales'], axis=1)
viz['User_Score'] = pd.Series(viz['User_Score'].apply(pd.to_numeric, errors='coerce'))
viz['User_Score'] = viz['User_Score'].mask(np.isnan(viz["User_Score"]), viz['Critic_Score'] / 10.0)
viz.plot(kind='scatter', logx=True, logy=True, x='Critic_Score', y='Global_Sales')
viz.plot(kind='scatter', logx=True, logy=True, x='User_Score', y='Global_Sales')
plt.show()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-793" src="https://www.codexa.net/wp-content/uploads/2017/12/target_ccorrelation.png" alt="" width="875" height="269" srcset="https://www.codexa.net/wp-content/uploads/2017/12/target_ccorrelation.png 875w, https://www.codexa.net/wp-content/uploads/2017/12/target_ccorrelation-300x92.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/target_ccorrelation-768x236.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/target_ccorrelation-304x93.png 304w" sizes="(max-width: 875px) 100vw, 875px" /></p>
<p>左が<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Critic_Score&nbsp;</span>で右が<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span>のグラフとなります。想像の通り両方のデータはターゲット<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y&nbsp;</span>の予測をするのに使えそうなのが解ります。他にも<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;genre&nbsp;</span>（ゲームのカテゴリ）も当然、ミリオンセラーの要因になりますし、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;ESRB&nbsp;</span>（米ゲーム年齢制限レーティング）も販売対象となるリーチが大きく異なることから（例：全ての年齢対象のソフトより成人対象のソフトはリースが少ない）、予測ターゲットの特徴量として使えるかと思います。ここでは、他の項目とターゲット<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y&nbsp;</span>との相関を出しませんが、各自でデータを確認してみてください。</p>
<p>次ですが、<strong>特徴量として使えない（使わない）項目</strong>を考えましょう。すでにデータをパッと確認したら気づくかと思いますが、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;JP_Sales&nbsp;</span>（日本での販売数）など、予測ターゲットに直接関係のあるデータが含まれています。これらの項目は予測モデルに組み込むべきではありませんので、除外しましょう。、あた、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Name&nbsp;</span>（ゲームタイトル）や<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Year_of_Release&nbsp;</span>（販売開始年）なども除外します。</p><pre class="crayon-plain-tag"># 特徴量として使わない項目を除外
data = data.drop(['Name', 'Year_of_Release', 'NA_Sales', 'EU_Sales', 'JP_Sales',
                  'Other_Sales', 'Global_Sales', 'Critic_Count', 'User_Count', 'Developer'], axis=1)</pre><p>
これで訓練に使う項目のみが残りましたので、次はお決まりの欠損値の確認を行いましょう。<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;missing_values_table&nbsp;</span>の関数を作成して、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;data&nbsp;</span>の各項目（特徴量）の欠損値の状況把握をします。</p><pre class="crayon-plain-tag"># 欠損データの確認 missing_values_tableを作る
def missing_values_table(df):
    mis_val = df.isnull().sum()
    mis_val_percent = 100 * df.isnull().sum()/len(df)
    mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)
    mis_val_table_ren_columns = mis_val_table.rename(
    columns= {0 : 'Missing Values', 1: '% of total values'})
    return mis_val_table_ren_columns

# まずはおきまりの欠損データの状況を確認しておこう
missing_values_table(data)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-794" src="https://www.codexa.net/wp-content/uploads/2017/12/missing_values.png" alt="" width="302" height="219" srcset="https://www.codexa.net/wp-content/uploads/2017/12/missing_values.png 302w, https://www.codexa.net/wp-content/uploads/2017/12/missing_values-300x218.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/missing_values-295x214.png 295w, https://www.codexa.net/wp-content/uploads/2017/12/missing_values-218x158.png 218w" sizes="(max-width: 302px) 100vw, 302px" /></p>
<p>見たところ、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Critic_Score&nbsp;</span>、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span>、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Rating&nbsp;</span>は<strong>50％近くの割合で欠損しています</strong>ね…。機械学習の醍醐味として、この欠損データをどのように処理を行うかで実力の差が出るのですが、今回は<strong>もっともシンプルな方法</strong>で処理をしましょう。そう、その方法とは・・<strong>除外</strong>することです。（失礼しました笑）</p><pre class="crayon-plain-tag"># 欠損データを除外しよう
data = data.dropna()</pre><p>
これで、欠損データは全て除外されて綺麗になりました。欠損データと同様に、<strong>データ値が使えない場合も多々あります</strong>。dataを隅々まで確認すると、どうやら<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span>に<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;tbd&nbsp;</span>というストリングの値が含まれています。<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span>を数値として処理をしたいのに、これは不都合です。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-795" src="https://www.codexa.net/wp-content/uploads/2017/12/9.png" alt="" width="639" height="140" srcset="https://www.codexa.net/wp-content/uploads/2017/12/9.png 639w, https://www.codexa.net/wp-content/uploads/2017/12/9-300x66.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/9-304x67.png 304w" sizes="(max-width: 639px) 100vw, 639px" /></p>
<p>この<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span>の<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;tbd&nbsp;</span>をNaNに変換しましょう。すでに約40%もの<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span>を除外してしまっていますので、これ以上データを絞るのはあまりしたくありません。ですので<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;tbd&nbsp;</span>の値を一度NaNに変換して、さらに相関関係が非常に高い<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Critic_Score&nbsp;</span>を元にNaNへ代入しましょう。</p>
<p>上の図でもわかり通り、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;User_Score&nbsp;</span>は<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Critic_Score&nbsp;</span>の約1/10となっています。完璧な代入には当然なりませんが、それでもこれ以上データを除外するよりかはマシかと思いますので、その流れで<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;tbd&nbsp;</span>を処理しましょう。</p><pre class="crayon-plain-tag"># User_Scoreの数値以外の値を処理
data['User_Score'] = data['User_Score'].apply(pd.to_numeric, errors='coerce')

# Critic_Scoreの1/10をUser_SocoreのNaNへ代入
data['User_Score'] = data['User_Score'].mask(np.isnan(data["User_Score"]), data['Critic_Score'] / 10.0)</pre><p>
データの前処理もほとんど終わりです。次は、予測ターゲットの<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y&nbsp;</span>を扱いやすいように処理して、<strong>データ前処理で定番のダミー変数化</strong>をしましょう。</p><pre class="crayon-plain-tag"># 予測ターゲットを扱いやすいように処理
data['y'] = data['y'].apply(lambda y: 'yes' if y == True else 'no')

# 全ての特徴量をダミー変数化
model_data = pd.get_dummies(data)</pre><p>
これで、特徴量の前処理は完了です！次は過学習対策として、データを3つのグループへ分けましょう。今回のチュートリアルでは全体の70%を学習用データとして分けて、20%を評価用データとして使いましょう。残りの10%は最終のテスト用データとして残しておきます。</p><pre class="crayon-plain-tag"># train_dataを3つのデータセットへ分別
train_data, validation_data, test_data = np.split(model_data.sample(frac=1, random_state=1729), [int(0.7 * len(model_data)), int(0.9 * len(model_data))])</pre><p>
さて、いよいよデータ前処理の最後のステップとなります。最後は、XGBoost用にlibSVM形式へ変換をして、boto3を経由してS3へファイルを送りましょう。</p><pre class="crayon-plain-tag"># libSVM形式へ変換
dump_svmlight_file(X=train_data.drop(['y_no', 'y_yes'], axis=1), y=train_data['y_yes'], f='train.libsvm')
dump_svmlight_file(X=validation_data.drop(['y_no', 'y_yes'], axis=1), y=validation_data['y_yes'], f='validation.libsvm')
dump_svmlight_file(X=test_data.drop(['y_no', 'y_yes'], axis=1), y=test_data['y_yes'], f='test.libsvm')

# boto3経由でlibSVMをS3へ送る
boto3.Session().resource('s3').Bucket(bucket).Object(prefix + '/train/train.libsvm').upload_file('train.libsvm')
boto3.Session().resource('s3').Bucket(bucket).Object(prefix + '/validation/validation.libsvm').upload_file('validation.libsvm')</pre><p>
上記のコードを実行した後に、念のためS3を確認しておきましょう。下記のキャプチャのように、libSVMファイルがS3へ格納されているはずです。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-796" src="https://www.codexa.net/wp-content/uploads/2017/12/s3_libsvm_file.png" alt="" width="721" height="471" srcset="https://www.codexa.net/wp-content/uploads/2017/12/s3_libsvm_file.png 721w, https://www.codexa.net/wp-content/uploads/2017/12/s3_libsvm_file-300x196.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/s3_libsvm_file-304x199.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/s3_libsvm_file-242x158.png 242w" sizes="(max-width: 721px) 100vw, 721px" /></p>
<p>以上でデータの前処理が完了しました！次から、SageMakerのモデルトレーニングインスタンスを立ち上げてモデル構築、さらにはモデルホスティングインスタンスでモデルを使えるようにしましょう。</p>
<h3>モデルトレーニング</h3>
<p>データの処理が完了したところで、次はXGBoostのモデルの訓練を始めましょう。XGBoostですが、多数のハイパーパラメーターが用意されていますが、今回はその中のいくつか初歩的なものを使ってトレーニングを行いましょう。</p>
<div class="su-box su-box-style-default" id="" style="border-color:#14806a;border-radius:3px"><div class="su-box-title" style="background-color:#47B39D;color:#FFFFFF;border-top-left-radius:1px;border-top-right-radius:1px">12月12日 追記</div><div class="su-box-content su-u-clearfix su-u-trim" style="border-bottom-left-radius:1px;border-bottom-right-radius:1px">
<p><strong>ハイパーパラメーターとは？ </strong></p>
<p>機械学習で使われるモデルで、<strong>人間が設定しなくてはいけないパラメーター（設定）</strong>のことです。機械学習では、データを用いて機械が学習するものですが、学習されない項目を人間が設定することにより、結果の良し悪しが変動することが多々あります。</p>
</div></div>
<p>さて、次はノートブックでモデルトレーニングを実行していきましょう。手順として、まずは訓練のジョブ用に必要なパラメータ設定して、その後に訓練のジョブを動かします。</p>
<p>コードを動かす前に重要な点が一つ！<strong>SageMakerですが、ノートブック、モデルトレーニング、モデルホスティングの各インスタンスで料金が異なります。</strong>全てのインスタンスで本チュートリアルでは、全てい最小限のものを利用しています。インスタンスの料金は、各自、必ず理解をした上で実行をお願い致します。</p>
<p>では、モデルトレーニングをやっていきましょう！まずは、パラメーターの設定をしましょう。</p><pre class="crayon-plain-tag">job_name = 'videogames-xgboost-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime())
print("Training job", job_name)

containers = {
                'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
                'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
                'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
                'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'
             }

create_training_params = \
{
    "RoleArn": role,
    "TrainingJobName": job_name,
    "AlgorithmSpecification": {
        "TrainingImage": containers[boto3.Session().region_name],
        "TrainingInputMode": "File"
    },
    "ResourceConfig": {
        "InstanceCount": 1,
        "InstanceType": "ml.c4.xlarge", # こちらでインスタンスタイプが調整可能です！
        "VolumeSizeInGB": 10
    },
    "InputDataConfig": [
        {
            "ChannelName": "train",
            "DataSource": {
                "S3DataSource": {
                    "S3DataType": "S3Prefix",
                    "S3Uri": "s3://{}/{}/train".format(bucket, prefix),
                    "S3DataDistributionType": "FullyReplicated"
                }
            },
            "ContentType": "libsvm",
            "CompressionType": "None"
        },
        {
            "ChannelName": "validation",
            "DataSource": {
                "S3DataSource": {
                    "S3DataType": "S3Prefix",
                    "S3Uri": "s3://{}/{}/validation".format(bucket, prefix),
                    "S3DataDistributionType": "FullyReplicated"
                }
            },
            "ContentType": "libsvm",
            "CompressionType": "None"
        }
    ],
    "OutputDataConfig": {
        "S3OutputPath": "s3://{}/{}/xgboost-video-games/output".format(bucket, prefix)
    },
    "HyperParameters": {
        "max_depth":"3",
        "eta":"0.1",
        "eval_metric":"auc",
        "scale_pos_weight":"2.0",
        "subsample":"0.5",
        "objective":"binary:logistic",
        "num_round":"100"
    },
    "StoppingCondition": {
        "MaxRuntimeInSeconds": 60 * 60
    }
}</pre><p>
次に、モデル訓練のジョブの実行です。こちらですが、本チュートリアルで使用したインスタンス（<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;ml.c4.xlarge&nbsp;</span>）で<strong>約6分程</strong>処理に掛かりました。</p><pre class="crayon-plain-tag">%%time

sm = boto3.client('sagemaker')
sm.create_training_job(**create_training_params)

status = sm.describe_training_job(TrainingJobName=job_name)['TrainingJobStatus']
print(status)

try:
    sm.get_waiter('training_job_completed_or_stopped').wait(TrainingJobName=job_name)
finally:
    status = sm.describe_training_job(TrainingJobName=job_name)['TrainingJobStatus']
    print("Training job ended with status: " + status)
    if status == 'Failed':
        message = sm.describe_training_job(TrainingJobName=job_name)['FailureReason']
        print('Training failed with the following error: {}'.format(message))
        raise Exception('Training job failed')</pre><p>
これで、事前に処理したデータセットとSageMakerのXGBoostの訓練が、モデルトレーニングインスタンス上で完了できました。この訓練したモデルのホスティングをSageMakerを使ってやってみましょう。</p>
<h3>モデルホスティングの実施</h3>
<p>SageMakerのサーバーレスエンドポイントでのホスティングをやってみましょう。</p><pre class="crayon-plain-tag"># スコアリングコンテナとmodel.tar.gzを指定してホスティングモデルを作成する
create_model_response = sm.create_model(
    ModelName=job_name,
    ExecutionRoleArn=role,
    PrimaryContainer={
        'Image': containers[boto3.Session().region_name],
        'ModelDataUrl': sm.describe_training_job(TrainingJobName=job_name)['ModelArtifacts']['S3ModelArtifacts']})

print(create_model_response['ModelArn'])</pre><p>
次にホスティングエンドポイントの設定をいくつかしましょう。具体的には、ホスティングで使うEC2インスタンスの指定や、初期で使うインスタンスの個数、さらにはホストされているモデルの名前の設定をします。</p><pre class="crayon-plain-tag">xgboost_endpoint_config = 'videogames-xgboost-endpoint-config-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime())
print(xgboost_endpoint_config)
create_endpoint_config_response = sm.create_endpoint_config(
    EndpointConfigName=xgboost_endpoint_config,
    ProductionVariants=[{
        'InstanceType': 'ml.t2.medium',
        'InitialInstanceCount': 1,
        'ModelName': job_name,
        'VariantName': 'AllTraffic'}])

print("Endpoint Config Arn: " + create_endpoint_config_response['EndpointConfigArn'])</pre><p>
さて、最後にモデルのホスティングの実行しましょう。こちらですが、完了するまでに16分程度掛かりました。</p><pre class="crayon-plain-tag">%%time

xgboost_endpoint = 'EXAMPLE-videogames-xgb-endpoint-' + strftime("%Y%m%d%H%M", gmtime())
print(xgboost_endpoint)
create_endpoint_response = sm.create_endpoint(
    EndpointName=xgboost_endpoint,
    EndpointConfigName=xgboost_endpoint_config)
print(create_endpoint_response['EndpointArn'])

resp = sm.describe_endpoint(EndpointName=xgboost_endpoint)
status = resp['EndpointStatus']
print("Status: " + status)

try:
    sm.get_waiter('endpoint_in_service').wait(EndpointName=xgboost_endpoint)
finally:
    resp = sm.describe_endpoint(EndpointName=xgboost_endpoint)
    status = resp['EndpointStatus']
    print("Arn: " + resp['EndpointArn'])
    print("Status: " + status)

    if status != 'InService':
        message = sm.describe_endpoint(EndpointName=xgboost_endpoint)['FailureReason']
        print('Endpoint creation failed with the following error: {}'.format(message))
        raise Exception('Endpoint creation did not succeed')</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-797" src="https://www.codexa.net/wp-content/uploads/2017/12/15.png" alt="" width="798" height="128" srcset="https://www.codexa.net/wp-content/uploads/2017/12/15.png 798w, https://www.codexa.net/wp-content/uploads/2017/12/15-300x48.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/15-768x123.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/15-304x49.png 304w" sizes="(max-width: 798px) 100vw, 798px" /></p>
<p>実行したセルの下に、上記のようなメッセージが出れば成功です！</p>
<h3>構築したモデルでテストデータを使って予測</h3>
<p>やっと、①データの前処理②モデルトレーニング③モデルホスティングが完了しました！次はいよいよ、この構築したモデルを使って、予め切り分けておいたテスト用データを使って予測してみましょう。</p><pre class="crayon-plain-tag">runtime = boto3.client('runtime.sagemaker')</pre><p>
</p><pre class="crayon-plain-tag">def do_predict(data, endpoint_name, content_type):
    payload = '\n'.join(data)
    response = runtime.invoke_endpoint(EndpointName=endpoint_name, 
                                   ContentType=content_type, 
                                   Body=payload)
    result = response['Body'].read()
    result = result.decode("utf-8")
    result = result.split(',')
    preds = [float((num)) for num in result]
    preds = [round(num) for num in preds]
    return preds

def batch_predict(data, batch_size, endpoint_name, content_type):
    items = len(data)
    arrs = []
    
    for offset in range(0, items, batch_size):
        if offset+batch_size &lt; items:
            results = do_predict(data[offset:(offset+batch_size)], endpoint_name, content_type)
            arrs.extend(results)
        else:
            arrs.extend(do_predict(data[offset:items], endpoint_name, content_type))
        sys.stdout.write('.')
    return(arrs)</pre><p>
</p><pre class="crayon-plain-tag">%%time
import json

with open('test.libsvm', 'r') as f:
    payload = f.read().strip()

labels = [int(line.split(' ')[0]) for line in payload.split('\n')]
test_data = [line for line in payload.split('\n')]
preds = batch_predict(test_data, 100, xgboost_endpoint, 'text/x-libsvm')

print ('\nerror rate=%f' % ( sum(1 for i in range(len(preds)) if preds[i]!=labels[i]) /float(len(preds))))</pre><p>
これで・・切り分けておいた10%のテストデータを使って、構築したモデルで予測が完了しました。機械学習をやっていると、いつもこの瞬間がドキドキします。癖になりますよね（笑）</p>
<p>予測結果の評価ですが、様々な評価方法が存在します。今回は非常にシンプルに、実際の正解データと予測データを付け合わせたテーブルをPandasで作成して、そちらを確認してみましょう。</p><pre class="crayon-plain-tag">pd.crosstab(index=np.array(labels), columns=np.array(preds))</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-798" src="https://www.codexa.net/wp-content/uploads/2017/12/result_sagemaker.png" alt="" width="264" height="246" srcset="https://www.codexa.net/wp-content/uploads/2017/12/result_sagemaker.png 264w, https://www.codexa.net/wp-content/uploads/2017/12/result_sagemaker-230x214.png 230w, https://www.codexa.net/wp-content/uploads/2017/12/result_sagemaker-170x158.png 170w" sizes="(max-width: 264px) 100vw, 264px" /></p>
<p>こちらが今回の結果となります。テストデータ803件を訓練済みXGBoostモデルで予測をしたところ、<strong>ミリオンセラーと予測した122件のゲームソフトのうち、73件が実際にミリオンセラーでした</strong>！</p>
<p>加えて、今回のモデルでは、<strong>803件のゲーム中、681件はミリオンセラーにならないと予測して、実際は622件が100万本届かなかったゲーム</strong>と言えます。（<strong>うち59件はミリオンセラー</strong>となりました）</p>
<div class="su-note"  style="border-color:#e2cbcb;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#fce5e5;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">
<p>【重要】</p>
<p><strong>チュートリアル終了後にインスタンスを放置しておくと、無駄な料金が発生していまします。チュートリアル終了後は、必ずインスタンスの停止または削除を行いましょう！</strong></p>
</div></div>
<p>&nbsp;</p>
<h3>まとめ</h3>
<p>Amazon SageMakerでXGBoostを使った機械学習チュートリアルですが、いかがでしたでしょうか？<a href="https://www.codexa.net/aws-sagemaker-announcement/" target="_blank" rel="noopener">SageMakerは全てのエンジニアが気軽に機械学習ができることを目的として作られたサービス</a>です。</p>
<p>いくつか癖のある、覚えなくてはいけない箇所（特にモデルホスティング）はあるものの、一概として非常に簡単に、しかも素早く機械学習を実装できるという点では優れたサービスです！</p>
<p>また、機械学習を初めてばかりで、もっと触ってみたいとお考えの方は、下記の初心者向けチュートリアルも是非やってみてください。（下記はAmazon SageMakerではなく、Jupyter Notebookと各ライブラリを使って実施してます）</p>
<ul>
<li><a href="https://www.codexa.net/kaggle-recruit-restaurant-visitor-forecasting-handson/" target="_blank" rel="noopener">Kaggle リクルート ホットペッパーチャレンジ</a></li>
<li><a href="https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/">Kaggle リクルート ホットペッパーチャレンジ</a></li>
<li><a href="https://www.codexa.net/kaggle-titanic-beginner/">Kaggle タイタニック チャレンジ</a></li>
</ul>
<p>以上、SageMakerの初心者向けチュートリアル第二弾でした！近日中に今回使用したXGBoostの詳細チュートリアルも予定していますので、興味のある方はコデクサの<a href="https://www.facebook.com/codexa.net/" target="_blank" rel="noopener">facebook</a>または<a href="https://twitter.com/codexa_net" target="_blank" rel="noopener">Twitter</a>のフォローをお願い致します！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/amazon-sagamaker-xgboost-game-sales-predictions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Amazon SageMakerを使って銀行定期預金の見込み顧客を予測【SageMaker ＋XGBoost 機械学習初心者チュートリアル】</title>
		<link>https://www.codexa.net/amazon-sagemaker-tutorial-marketing-offers/</link>
					<comments>https://www.codexa.net/amazon-sagemaker-tutorial-marketing-offers/#respond</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Tue, 12 Dec 2017 06:14:10 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=676</guid>

					<description><![CDATA[Amazonの新しい機械学習プラットフォーム「Amazon SageMaker（アマゾン・セージメーカー）」ですが、早速、機械学習初心者向けのハンズオンチュートリアル第一弾をまとめました！オンラインで公開されている銀行顧 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Amazonの新しい機械学習プラットフォーム「Amazon SageMaker（アマゾン・セージメーカー）」ですが、早速、機械学習初心者向けのハンズオンチュートリアル第一弾をまとめました！オンラインで公開されている銀行顧客のデータを利用して、Amazon SageMaker＋XGBoostを使って、データの前処理からモデルホスティング、さらに評価確認までを一緒に行ってみましょう。</p>
<div class="su-note"  style="border-color:#e2cbcb;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#fce5e5;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><strong>本チュートリアルですが、AWS 無料枠(Free Tier）を使用していません。ノートブックインスタンス、モデルトレーニング、モデルホスティングで料金が発生します。本チュートリアルを行うのに、3ドル〜5ドル発生します。料金は各自の責任でしっかりと確認した上でコードの実行をお願いします。（料金発生に関する必要な箇所はその都度、注釈を入れています）</strong> </div></div>
<h4>SageMaker入門チュートリアル概要</h4>
<p><strong>所要時間目安<br />
</strong>1時間〜3時間</p>
<p><strong>実行する内容</strong></p>
<ul>
<li>SageMakerノートブックインスタンスの立ち上げ</li>
<li>データの処理</li>
<li>SageMaker XGBoostのモデル訓練</li>
<li>モデルのホスティング</li>
<li>テストデータをホスティングされたモデルで予測計算</li>
<li>モデルの評価</li>
</ul>
<p><strong>参考<br />
</strong><a href="https://bank-tutorial.notebook.us-east-1.sagemaker.aws/notebooks/bank-tutorial-1.ipynb" target="_blank" rel="nofollow noopener">https://bank-tutorial.notebook.us-east-1.sagemaker.aws/notebooks/bank-tutorial-1.ipynb</a></p>
<h3>Amazon SageMakerの登録</h3>
<p>まずは<a href="https://aws.amazon.com/jp/sagemaker/?nc2=h_mo" target="_blank" rel="noopener">Amazon SageMaker</a>への登録を行いましょう。<a href="https://www.codexa.net/aws-sagemaker-announcement/">SageMakerの発表記事</a>でも記載をしましたが、現段階で使えるリージョンはまだ4つのみとなっています。残念ながら東京リージョンは現時点で<strong>未対応</strong>です。本記事では、「<strong>米国東部（バージニア北部）</strong>」のリージョンを使っています。</p>
<div id="attachment_680" style="width: 160px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-680" loading="lazy" class="wp-image-680 size-thumbnail" src="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-regions-150x150.png" alt="" width="150" height="150"><p id="caption-attachment-680" class="wp-caption-text">12月11日時点では4つのリージョンのみ対応</p></div>
<p>Amazon SageMakerへのサインアップが完了するとダッシュボードへ遷移します。早速、ノートブックインスタンスの作成を行ってみましょう。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-682" src="https://www.codexa.net/wp-content/uploads/2017/12/SageMaker-starting-1-1024x312.png" alt="" width="1024" height="312" srcset="https://www.codexa.net/wp-content/uploads/2017/12/SageMaker-starting-1-1024x312.png 1024w, https://www.codexa.net/wp-content/uploads/2017/12/SageMaker-starting-1-300x91.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/SageMaker-starting-1-768x234.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/SageMaker-starting-1-304x93.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/SageMaker-starting-1.png 1110w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>ノートブックインスタンスの作成をクリックすると、次画面でインスタンス作成画面へ遷移します。インスタンスの名前はとりあえず「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;bank-tutorial&nbsp;</span>」として、またノートブックのインスタンスタイプも最小の「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;ml.t2.medium&nbsp;</span>」を選びました。無料枠が使える方は、おそらくこちらで無料枠用のインスタンスが出てくるかと思いますので、ご希望の方はそちらを選んだ方が良いかと思います。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-683" src="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-create-notebook.png" alt="" width="809" height="596" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-create-notebook.png 809w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-create-notebook-300x221.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-create-notebook-768x566.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-create-notebook-290x214.png 290w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-create-notebook-214x158.png 214w" sizes="(max-width: 809px) 100vw, 809px" /></p>
<p>IAMロール（AWS内の権限を管理する機能）ですが、「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;任意のS3バケット&nbsp;</span>」を選択しています。チュートリアルですので、セキュリティ面は深く考えていませんが、<strong>重要なデータを扱う場合は、IAMロールの設定を必ずしっかりと確認しましょう</strong>。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-684" src="https://www.codexa.net/wp-content/uploads/2017/12/IAM-sagemaker.png" alt="" width="826" height="571" srcset="https://www.codexa.net/wp-content/uploads/2017/12/IAM-sagemaker.png 826w, https://www.codexa.net/wp-content/uploads/2017/12/IAM-sagemaker-300x207.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/IAM-sagemaker-768x531.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/IAM-sagemaker-304x210.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/IAM-sagemaker-229x158.png 229w" sizes="(max-width: 826px) 100vw, 826px" /></p>
<p>他のVPCや暗号化キーはオプションとなっていますので、今回は特に指定せずノートブックインスタンスを作成します。</p>
<p>ノートブックインスタンスの作成が完了したら、ノートブックを立ち上げてみましょう。ノートブックインスタンス（下記キャプチャ）のページから、「オープン」をクリックするとJupyter Notebookのトップへ遷移します。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-685" src="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-list.png" alt="" width="935" height="219" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-list.png 935w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-list-300x70.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-list-768x180.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-list-304x71.png 304w" sizes="(max-width: 935px) 100vw, 935px" /></p>
<p>Jupyter Notebookページ（下記キャプチャ）の「New」からconda_python3を選択して、新しいノートブックを立ち上げましょう。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-686" src="https://www.codexa.net/wp-content/uploads/2017/12/creat-new-note-1024x451.png" alt="" width="1024" height="451" srcset="https://www.codexa.net/wp-content/uploads/2017/12/creat-new-note-1024x451.png 1024w, https://www.codexa.net/wp-content/uploads/2017/12/creat-new-note-300x132.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/creat-new-note-768x339.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/creat-new-note-304x134.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/creat-new-note.png 1150w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>ノートブックの画面（下記キャプチャ）へ遷移しますので、解りやすいように名前の変更をしましょう。Jupyterのロゴのすぐ横の「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Untitled&nbsp;</span>」をクリックするとノートブックの名前の変更が可能です。「<strong>bank-tutorial-1</strong>」と名前を変更しておきましょう。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-689" src="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-1024x183.png" alt="" width="1024" height="183" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-1024x183.png 1024w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-300x54.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-768x137.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook-304x54.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-notebook.png 1148w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>最後のステップとして、<strong>AWS&nbsp;S3のバケットネームの確認</strong>を行います。</p>
<p>本チュートリアルでは、後ほどSageMakerのノートブックとS3の連携を行いますので、S3の登録をまだ行っていない方は、<a href="https://aws.amazon.com/jp/s3/" target="_blank" rel="nofollow noopener">こちら</a>からどうぞ。またS3をすでに使っている方でも、リージョンが異なる場合は「<strong>米国東部（バージニア北部）」</strong>にて、新しいバケットの作成をお願いします。<strong>SageMakerとS3の連携ですが、リージョンが異なると行えないようです。</strong></p>
<p><img loading="lazy" class="aligncenter size-full wp-image-687" src="https://www.codexa.net/wp-content/uploads/2017/12/s3-1.png" alt="" width="959" height="314" srcset="https://www.codexa.net/wp-content/uploads/2017/12/s3-1.png 959w, https://www.codexa.net/wp-content/uploads/2017/12/s3-1-300x98.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/s3-1-768x251.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/s3-1-304x100.png 304w" sizes="(max-width: 959px) 100vw, 959px" /></p>
<p>さて、これでアカウント周りの準備は完了です。次のステップでは、機械学習モデル構築の大まかな手順をみていきましょう。</p>
<h3>データセットとモデル構築の概要</h3>
<p>本チュートリアルでは、カルフォルニア大学アーバイン校が公開している「<br />
<a href="https://archive.ics.uci.edu/ml/datasets/Bank+Marketing" target="_blank" rel="noopener">Bank Marketing Data Set</a> （銀行マーケティング・データセット）」を利用します。機械学習エンジニアなら、一度は耳にする初心者向けの非常に有名なデータセットです。</p>
<p>こちらのデータセットですが、ポルトガルのとある銀行が実際に行った、電話による定期貯金のダイレクトマーケティングの結果となります。各ユーザーの年齢や職業、さらには学歴などのデータがあり、ダイレクトマーケティングを行った結果、定期預金へお申し込みをした（ラベル＝１）、お申し込みをしなかった（ラベル＝０）が付与されています。</p>
<p>SageMakerを使ってこのデータセットの前処理を行い、XGBoostを使って予測を行います。本チュートリアルですが、SageMakerノートブックインスタンスを「<strong>ml.t2.medium</strong>」を使用しています。特に問題はありませんでしたが、ところどころ<strong>10分程度</strong>、時間がかかる処理がありました。<strong>ml.t2.medium</strong>ですが、vCPUが2、メモリーが4GBとなっています。もっと大規模な処理を行う場合には、上級インスタンスへ簡単に変更が可能なのは大きなメリットですね。（当然、料金も高くなりますが）</p>
<p>では、早速、Amazon SageMakerのノートブックを使ってデータセットを紐解いていきましょう。</p>
<h3>ノートブックの立ち上げと準備</h3>
<p>すでに前項目でSageMakerのノートブックインスタンスの立ち上げと、S3の設定（または新規登録）を行いましたので、早速ノートブックで下準備をしていきましょう。SageMakerの「ノートブックインスタンス」のページへアクセスしていただき、先ほど作った「bank-tutorial」を立ち上げましょう。</p>
<p>本チュートリアルの通りに設定をした方であればSageMakerのノートブックを立ち上げて、Jupyter Notebookのトップ画面で「<strong>bank-tutorial-1.ipynb</strong>」が作られているかと思います。こちらをクリックして、ノートブックを開きましょう。</p>
<p>準備編として、必要な設定変数とライブラリのインポートを行いましょう。下記のbucketの「XXXXXXXXXXX」ですが、<strong>各自のS3のバケット名へ変更</strong>をしましょう。またSageMakerとS3のリージョンが異なると動きませんので、リージョンが同じかどうか注意が必要です。</p>
<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;prefix&nbsp;</span>で指定したフォルダがS3へ新しく作られます。特に変更は必要ありませんが、適宜変更しても問題ありません。</p>
<p>最後にboto3とIAMのroleの宣言です。boto3ですすが、AWSが開発したPythonとAWSの各種サービスを統合するライブラリとなっています。（詳しくは<a href="https://aws.amazon.com/jp/sdk-for-python/" target="_blank" rel="nofollow noopener">こちら</a>から）</p><pre class="crayon-plain-tag"># S3のバケット名を下記に設定してください
# S3のプレフィックスを設定（変更は不要です）
bucket = 'XXXXXXXXXXX'
prefix = 'sagemaker/xgboost-dm'
 
# IAMのroleの宣言
import boto3
import re
from sagemaker import get_execution_role

role = get_execution_role()</pre><p>
こちらを最初のセルへ入力して、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;Shift + Enter&nbsp;</span>でセルの実行を行いましょう。</p>
<p>次は今回のモデル構築に使う必要なライブラリ各種を一気にインポートしちゃいましょう。</p><pre class="crayon-plain-tag">import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import Image
from IPython.display import display
from sklearn.datasets import dump_svmlight_file
from time import gmtime, strftime
import sys
import math
import json
import os
import sagemaker
from sagemaker.predictor import csv_serializer</pre><p>
機械学習の定番（？）となるNumpy、Pandas、Matplotlibに加えて、ipython（Jupyter Notebook）で表などをプロッティングするモジュール、さらにsagemakerのPython SDKもインポートします。各ライブラリの詳細の説明は行いませんが、見たことのないライブラリがある方は、軽く調べてみると良いかと思います。</p>
<p>SageMakerノートブックでみると、下記キャプチャの様になっているかと思います。正しく処理が行えてれば、各セルの左上の<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;[ ]&nbsp;</span>に番号が表示されます。何かしらの理由で処理が終わらなかったりすると、こちらに[*]と処理中のマークが出ます。</p>
<div class="su-note"  style="border-color:#d2d2d2;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#ececec;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">＊SageMakerのノートブックを立ち上げて、全く同じ内容でセル1を実行したら、処理が完了せず[*]が10分程度表示されました。原因不明でしたので、カーネルをリスタートさせて、全く同じ内容で実行したら今度はちゃんと処理が行われましたが・・念のため、同様の現象が出る方もいるかもしれませんので記載しておきます。 </div></div>
<p><img loading="lazy" class="aligncenter size-large wp-image-690" src="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-jupyter-1024x502.png" alt="" width="1024" height="502" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-jupyter-1024x502.png 1024w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-jupyter-300x147.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-jupyter-768x377.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-jupyter-304x149.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker-jupyter.png 1148w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>さて、次はデータをUCIからデータをダウロードして紐解いていきましょう！</p>
<h3>データセットの取得と確認</h3>
<p>カルフォルニア大学アーバイン校のサイトにてデータセットが公開されていますので、そちらから直接取得しましょう。特に会員登録などは必要ありません。<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;wget&nbsp;</span>でURLから直接ダウロードして、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;unizip&nbsp;</span>（解答）してあげましょう。</p><pre class="crayon-plain-tag"># カルフォルニア大学アーバイン校の公開URLからデータセットをダウロード
!wget https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank-additional.zip
!unzip -o bank-additional.zip</pre><p>
Jupyter Notebookのtreeページを確認すると、ダウロードした<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;bank-additional.zip&nbsp;</span>と解凍された<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;bank-additional&nbsp;</span>というフォルダーが作成されているのが確認できます。</p>
<p>ではこちらのcsvファイルのデータセットを、Pandasのデータフレームとして読み込みましょう。</p><pre class="crayon-plain-tag"># bank-additional-full.csvをdataへ格納
data = pd.read_csv('./bank-additional/bank-additional-full.csv', sep=';')

# Pandasの最大表示カラム数と行数の設定を変更
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_rows', 30)

# 最初の10行を表示
data.head(10)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-693" src="https://www.codexa.net/wp-content/uploads/2017/12/data_head_1.png" alt="" width="800" height="616" srcset="https://www.codexa.net/wp-content/uploads/2017/12/data_head_1.png 800w, https://www.codexa.net/wp-content/uploads/2017/12/data_head_1-300x231.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/data_head_1-768x591.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/data_head_1-278x214.png 278w, https://www.codexa.net/wp-content/uploads/2017/12/data_head_1-205x158.png 205w" sizes="(max-width: 800px) 100vw, 800px" />こちら記事内表示の便宜上、二段に分けて掲載しています。ご覧の通り、「age（年齢）」や「marital（結婚ステータス）」など各ユーザーの情報が格納されています。今後、機械学習を勉強されてる方にも解りやすいよう、簡単に各項目の概要をまとめました。</p>
<ul>
<li>age &#8211; 顧客の年齢</li>
<li>job &#8211; 仕事のカテゴリ</li>
<li>marital &#8211; 結婚ステータス</li>
<li>education &#8211; 学歴</li>
<li>default &#8211; クレジットの支払遅延のステータス</li>
<li>housing &#8211; 不動産ローンの有無</li>
<li>loan &#8211; パーソナルローンの有無</li>
<li>contact &#8211; 銀行と顧客の連絡方法</li>
<li>month &#8211; 最後に連絡をとった月</li>
<li>day_of_week &#8211; 最後に連絡をとった曜日</li>
<li>duration &#8211; 最後の連絡長さ（秒数）</li>
<li>campaign &#8211; このキャンペーン中に銀行が連絡した回数</li>
<li>pdays &#8211; 最後のキャンペーンの連絡から経過した日にち</li>
<li>previous &#8211; このキャンペーン以前に銀行が連絡した回数</li>
<li>poutcome &#8211; 前回のキャンペーンの結果</li>
<li>emp.var.rate &#8211; Employment Variation Rate（詳細説明なし）＊</li>
<li>cons.price.idx &#8211; 消費者物価指数 ＊</li>
<li>cons.conf.idx &#8211; 消費者信頼感指数 ＊</li>
<li>euribor3m &#8211; 3ヶ月スパンユーリボー指標金利 ＊</li>
<li>nr.employed &#8211; 四半期の従業員数 ＊</li>
<li>y &#8211; 顧客が定期預金を申し込みしたかどうか（予測ターゲット）</li>
</ul>
<div class="su-note"  style="border-color:#d2d2d2;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#ececec;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">「＊」の印をつけたものは外部環境要因のデータとなっています。特に「Employment Variation Rate」ですが、詳細の説明がありません。どのような指標なのか不明です。ヨーロッパでは当たり前の指標なのかもしれませんが・・ </div></div>
<p>データセットの各項目の意味が理解できたところで、少し掘り下げてデータセットを紐解いていきましょう。まずは、お決まりの欠損データの確認をしておましょう。</p><pre class="crayon-plain-tag"># データフレームの欠損データをまとめるテーブルの関数
def missing_values_table(df): 
        mis_val = df.isnull().sum()
        mis_val_percent = 100 * df.isnull().sum()/len(df)
        mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)
        mis_val_table_ren_columns = mis_val_table.rename(
        columns = {0 : 'Missing Values', 1 : '% of Total Values'})
        return mis_val_table_ren_columns 

# dataに欠損があるかどうか確認
missing_values_table(data)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-695" src="https://www.codexa.net/wp-content/uploads/2017/12/missing_value_table_data.png" alt="" width="639" height="335" srcset="https://www.codexa.net/wp-content/uploads/2017/12/missing_value_table_data.png 639w, https://www.codexa.net/wp-content/uploads/2017/12/missing_value_table_data-300x158.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/missing_value_table_data-304x159.png 304w" sizes="(max-width: 639px) 100vw, 639px" /></p>
<p>こちら実はデータセットダウロードページでも説明があるのですが、<strong>なんと欠損データが一つもありません（感動）</strong>！欠損データで頭を悩ます必要がないなんて、嬉しい限りです。</p>
<p>次は各項目のデータの分散を確認してみましょう。</p><pre class="crayon-plain-tag"># 各項目の度数分布の表を作成
for column in data.select_dtypes(include=['object']).columns:
    display(pd.crosstab(index=data[column], columns='% observations', normalize='columns'))

# 数値を値として持っている項目のヒストグラム
display(data.describe())
%matplotlib inline
hist = data.hist(bins=30, sharey=True, figsize=(10, 10))</pre><p>
バーっと各項目の度数分布が出てくるのですが、いくつか気になる部分のデータをまとめてみてみましょう。下記画像ですが、左から「job（職業）」「education（学歴）」「martital（結婚ステータス）」の度数分布となっています。</p>
<p>さすが銀行のデータです。職業の項目の「unknown（不明）」の0.8%を筆頭に、他のデータでも不明の項目の割合が比較的小さいです。本記事では細かく触れませんが、他の項目のデータも紐解いていくと、このデータセットの特徴などが見えてきます。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-696" src="https://www.codexa.net/wp-content/uploads/2017/12/job-marital-education.png" alt="" width="627" height="384" srcset="https://www.codexa.net/wp-content/uploads/2017/12/job-marital-education.png 627w, https://www.codexa.net/wp-content/uploads/2017/12/job-marital-education-300x184.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/job-marital-education-304x186.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/job-marital-education-258x158.png 258w" sizes="(max-width: 627px) 100vw, 627px" /></p>
<p>また今回の予測ターゲットとなる「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y&nbsp;</span>」の項目も確認してみましょう。ご覧の通り、「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;no&nbsp;</span>」が約88.7%とデータの大半を占めているのが解ります。こちらは<strong>キャンペーンで顧客が定期預金を申し込みしたかどうかのフラグ</strong>となっているので、「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;no&nbsp;</span>」が多いのも納得できますね。<img loading="lazy" class="aligncenter size-full wp-image-697" src="https://www.codexa.net/wp-content/uploads/2017/12/y_distribution.png" alt="" width="302" height="139" srcset="https://www.codexa.net/wp-content/uploads/2017/12/y_distribution.png 302w, https://www.codexa.net/wp-content/uploads/2017/12/y_distribution-300x138.png 300w" sizes="(max-width: 302px) 100vw, 302px" /></p>
<p>さて、次もお決まりですが、<strong>各項目が予測ターゲットとどのような関係となっているか</strong>を確認していきましょう。</p><pre class="crayon-plain-tag"># 各項目が予測ターゲット「y」にどのように関係してるか確認

for column in data.select_dtypes(include=['object']).columns:
    if column != 'y':
        display(pd.crosstab(index=data[column], columns=data['y'], normalize='columns'))

for column in data.select_dtypes(exclude=['object']).columns:
    print(column)
    hist = data[[column, 'y']].hist(by='y', bins=30)
    plt.show()</pre><p>
</p><pre class="crayon-plain-tag"># 相関係数とScatter Matrixの確認
# 処理完了まで少し時間がかかります

display(data.corr())
pd.plotting.scatter_matrix(data, figsize=(12, 12))
plt.show()</pre><p>
バーっと表やテーブルが出てきますので、深く理解されたい方は、各項目のテーブルを紐解いてみてください。下記の図は、各項目の相関係数（data.corr()）となっています。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-698" src="https://www.codexa.net/wp-content/uploads/2017/12/crrelation_table.png" alt="" width="867" height="305" srcset="https://www.codexa.net/wp-content/uploads/2017/12/crrelation_table.png 867w, https://www.codexa.net/wp-content/uploads/2017/12/crrelation_table-300x106.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/crrelation_table-768x270.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/crrelation_table-304x107.png 304w" sizes="(max-width: 867px) 100vw, 867px" /></p>
<p>いくつかの項目で<strong>高い正の相関と負の相関</strong>が見受けられますね。当然といえば当然ですが、外部環境要因の指標同士は高い相関があるようです。</p>
<p>ざっくりではありますが、データセットを簡単に紐解いてみました。次のステップでは、データセットの前処理、いわゆる「<strong>データクレンジング</strong>」をやっていきましょう。</p>
<h3>データクレンジング（データセット前処理）</h3>
<p>ほぼ全ての機械学習のプロセスで、データセットのクレンジングは必須の工程となっています。何が正しいのか、悪いのかという正解は無く、手探りでトライ＆エラーを繰り返しながら進めていくのが通常です。</p>
<p>ただ、いくつか基本となる「<strong>前処理の前処理</strong>」とでも言いますか、一般的に広く使われている方法・テクニックがあります。</p>
<ul>
<li>欠損データを処理</li>
<li>カテゴリカルデータを処理</li>
<li>特異な分散をしているデータを処理</li>
</ul>
<p>すでに確認した通りで欠損データは含まれませんので今回は対応をしなくて大丈夫ですね。実際に行うデータの前処理ですが、下記の<strong>4つの処理</strong>を行いましょう。各処理の説明も記載しています。</p>
<p><strong>[1] pdaysから連絡の取っていない顧客を抽出する</strong><br />
<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;pdays&nbsp;</span>ですが、「<strong>最後のキャンペーンの連絡から経過した日にち</strong>」となります。すでにデータ確認のステップで見ましたが、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;pdays&nbsp;</span>は「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;999&nbsp;</span>」のデータが非常に多かったです。つまり<strong>前回から連絡を取っていない顧客が大半</strong>と言えます。<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;pdays&nbsp;</span>を少し処理して、999日（つまり連絡を取っていなかった顧客）を「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;1&nbsp;</span>」としてそれ以外を「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;0&nbsp;</span>」とするデータ処理をします。</p>
<p><strong>jobから現在職についてない顧客を抽出する</strong><br />
<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;job&nbsp;</span>（職業）の項目ですが、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;unknown&nbsp;</span>（不明）を含む12種類あります。よくこの項目をみて見ると、「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;student&nbsp;</span>（学生）」や「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;unemployed&nbsp;</span>（失業中）」など<strong>現時点で職についてない</strong>顧客が含まれています。そこで、現在働いているか、働いていないかを切り分けて新しく「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;not_working&nbsp;</span>」（働いていない）という項目を追加する処理を行います。</p>
<p><strong>カテゴリカルデータをダミー変数化する<br />
</strong>ダミー変数とは、数字てはないデータを数字に変換する手法を指します。例えば、今回のデータで言うと、予測ターゲットの「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y&nbsp;</span>」ですが、持っている値が「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;yes&nbsp;</span>」「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;no&nbsp;</span>」となっています。これをダミー変数化すると、もともと一つの項目「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y&nbsp;</span> 」が二つの項目「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y_yes&nbsp;</span>」と「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;y_no&nbsp;</span>」に分裂して、各値に応じて「0」「1」が付与されます。機械学習では、かなり頻繁に行う処理です。Pandasではダミー変数化をするのはとても簡単で、pd.get_dummiesを使うことで、ほぼ自動的にダミー変数化してくれます。（get_dummies以外にも、カテゴリカルデータを数値に変換してくれる<strong>pd.cat.code</strong>という便利な関数もあります）</p>
<p><strong>予測モデルに組み込まない項目の削除</strong><br />
さて、最後に外部環境要因の指標（<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;emp.var.rate&nbsp;</span>）など、今回のトレーニングで使わない項目をpd.dropでデータフレームから削除を行います。</p>
<p>下記が、コードとなります。</p><pre class="crayon-plain-tag"># 以前にコンタクトがなかった人を判別する新しい項目の追加
data['no_previous_contact'] = np.where(data['pdays'] == 999, 1, 0)

# 職業から「職についていない人」（学生など）のフラグを追加
data['not_working'] = np.where(np.in1d(data['job'], ['student', 'retired', 'unemployed']), 1, 0)

# カテゴリカルデータをダミー変数化
model_data = pd.get_dummies(data)

# 今回のモデルで使用しない項目を削除
model_data = model_data.drop(['duration', 'emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed'], axis=1)

# データを確認しよう
mode_data.head(10)</pre><p>
<img loading="lazy" class="aligncenter size-large wp-image-700" src="https://www.codexa.net/wp-content/uploads/2017/12/tables-939x1024.png" alt="" width="939" height="1024" srcset="https://www.codexa.net/wp-content/uploads/2017/12/tables-939x1024.png 939w, https://www.codexa.net/wp-content/uploads/2017/12/tables-275x300.png 275w, https://www.codexa.net/wp-content/uploads/2017/12/tables-768x838.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/tables-196x214.png 196w, https://www.codexa.net/wp-content/uploads/2017/12/tables-145x158.png 145w, https://www.codexa.net/wp-content/uploads/2017/12/tables.png 1025w" sizes="(max-width: 939px) 100vw, 939px" /></p>
<p>ご覧の通り、ダミー変数化してますので、列数が多くなっているのが確認できます。また今回のモデルで使用しない項目が削除されていることも確認しておきましょう。</p>
<p>前処理が完了したので、次はデータを訓練データ、確認用データ、テストデータの3つに分けましょう。その前に機械学習では避けて通れない「<strong>Overfitting（オーバーフィッティング）（過学習）</strong>」について簡単に触れておきましょう。</p>
<p>教師あり学習モデル（Supervised Learning Models）は、与えられたデータで、「<strong>予測した値と実際の値の誤差をどれだけ最小にするか</strong>」を目的としてデザインされています。つまりモデルは、いかに予測値と実際の値の誤差を小さくするための計算を行うわけなんですが、そのプロセスの中で、モデルが、<strong>特異点までもを組み込んで偏った予測</strong>をしてしまうことが多々あります。これが過学習です。</p>
<p>特異点が新しいデータでも見られるパターンであれば、それを組み込んだモデルの予測は正確なものになるのですが、そうでないケースは、その<strong>モデルの正確性は落ちてしまいます</strong>。</p>
<p>この過学習を避けるテクニックは多数ありますが、一般的な方法として、<strong>モデルのトレーニングを一つのデータセットで行うのではなく、新しいデータセットでもトレーニングを行う手法</strong>です。</p>
<p>一先ず今回は「<strong>データを一回だけ訓練させると、そのデータには正確性が高い予測が出るけど・・新しいデータでの予測はそうとは限らないよね。だから元データを複数に分けて、複数回のトレーニングをした方が、今後の新しいデータへの予測に汎用性が高そうじゃない？</strong>」というくらいのニュアンスで理解しておきましょう！</p>
<p>ということで、今回のデータセットですが3つに分けることにします。</p><pre class="crayon-plain-tag"># 前処理したmodel_dataをランダムにソートして3つのデータフレームに分けましょう
train_data, validation_data, test_data = np.split(model_data.sample(frac=1, random_state=1729), [int(0.7 * len(model_data)), int(0.9 * len(model_data))])   # Randomly sort the data then split out first 70%, second 20%, and last 10%

# 念のため各データフレームのサイズを確認
# 全ての合計がmodel_dataのサイズと一致してます
model_data.shape, train_data.shape, validation_data.shape, test_data.shape</pre><p>
さて、とうとうデータ前処理の最終ステップとなります。Amazon SageMaker XGBoostのコンテナのデータフォーマットですが、<a href="https://ja.wikipedia.org/wiki/LIBSVM" target="_blank" rel="nofollow noopener">libSVM</a>となります。libSVMフォーマットですが、feature（特徴量）と予測ターゲット（目的変数）を別々のアーギュメントにしなくてはいけませんので、その処理を行いましょう。</p>
<p>最後に、boto3経由でAWS S3へ、この訓練データセット（libSVM形式）を送っておきます。</p><pre class="crayon-plain-tag"># libSVMファイルの書き出し
dump_svmlight_file(X=train_data.drop(['y_no', 'y_yes'], axis=1), y=train_data['y_yes'], f='train.libsvm')
dump_svmlight_file(X=validation_data.drop(['y_no', 'y_yes'], axis=1), y=validation_data['y_yes'], f='validation.libsvm')
dump_svmlight_file(X=test_data.drop(['y_no', 'y_yes'], axis=1), y=test_data['y_yes'], f='test.libsvm')

# Boto3を使ってS3へファイルをコピーする
boto3.Session().resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'train/train.libsvm')).upload_file('train.libsvm')
boto3.Session().resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'validation/validation.libsvm')).upload_file('validation.libsvm')</pre><p>
最初の準備編で指定したAWS S3のバケットに新しく「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;sagemaker&nbsp;</span>」というフォルダーが作成されているかと思います。繰り返しになりますが、SageMakerのリージョンとS3のリージョンが異なると、処理が行われませんので気をつけてください。</p>
<p>下記のキャプチャのように、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;S3 &gt; <strong>バケット名</strong> &gt; sagemaker &gt; xgboost-dm &gt; train&nbsp;</span>のディレクトリーにtrain.libsvmが新規作成されているばオッケーです。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-701" src="https://www.codexa.net/wp-content/uploads/2017/12/s3-cap-1.png" alt="" width="733" height="461" srcset="https://www.codexa.net/wp-content/uploads/2017/12/s3-cap-1.png 733w, https://www.codexa.net/wp-content/uploads/2017/12/s3-cap-1-300x189.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/s3-cap-1-304x191.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/s3-cap-1-251x158.png 251w" sizes="(max-width: 733px) 100vw, 733px" /></p>
<h3>訓練（トレーニング）の実行</h3>
<p>データセットの確認と前処理が完了しましたので、次はいよいよXGBoostを使ってモデルの構築を行いましょう。その前に、今回使うアルゴリズムとXGBoostの概要を簡単に説明します。</p>
<p>今回の予測モデルのアルゴリズムは「<strong>勾配ブースティング</strong>（<strong>Gradient Boosting</strong>）（<strong>グラディアント・ブースティング</strong>）」を使います。</p>
<p><strong>勾配ブースティングの大まかなステップ</strong></p>
<ul>
<li>多数の小さいシンプルな予測モデルを構築</li>
<li>この最小限予測モデルの「誤差」と「重み」を算出</li>
<li>最小限予測モデルを最適化して一つの予測モデルとして構築</li>
</ul>
<p><strong>いまいち意味が解らなくても心配不要です！</strong>機械学習と一言で言っても、その内実は多数のアルゴリズム＆予測モデルで溢れています。アルゴリズムを理解することで、より深く最適なモデル構築＆予測を行うことができますが、そうでなくても、トライ＆エラーを繰り返すことで予測はできます。</p>
<p>この「勾配ブースティング（Gradient Boosting）」を、より効率的に使いやすしたのが「<strong>XGBoost</strong>」です。XGBoostですがオープンソースで、世界中の機械学習エンジニアの間で人気が非常に高いフレームワークです。（XGBoostを使って、<a href="https://www.codexa.net/what-is-kaggle/" target="_blank" rel="nofollow noopener">Kaggle（機械学習コンペ）</a>の上位になることも可能ですので、初心者用のフレームワークという訳ではありません）</p>
<p>それでは、Amazon SageMakerでXGBoostを使って予測モデルの構築をしてみましょう！やり方は・・驚くくらい単純です。大まかなステップは以下の通り。</p>
<ol>
<li>Amazon SageMakerのXGBoostのためのECRコンテナの場所を指定</li>
<li>訓練データ（libSVM）とS3の連携してあげる</li>
<li>sagemaker.estimator.Estimatorに必要な情報を指定</li>
<li>ハイパーパラメーターの指定</li>
<li>フィッティングと出力データのS3の格納先の指定</li>
</ol>
<p>では、実際にSageMakerノートブックで上記の流れを行ってみましょう。</p><pre class="crayon-plain-tag"># SageMaker XGBoostのためのECRコンテナを指定
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
              'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
              'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
              'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'}</pre><p>
</p><pre class="crayon-plain-tag"># 訓練データとS3を連携してあげる
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket, prefix), content_type='libsvm')
s3_input_validation = sagemaker.s3_input(s3_data='s3://{}/{}/validation/'.format(bucket, prefix), content_type='libsvm')</pre><p>
さて、次はSageMakerのEstimatorへ必要なパラメーターとハイパーパラメーターの指定をしてあげて、フィッティングを行います！下記コードですが、訓練用のインスタンスとして、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;ml.m4.xlarge&nbsp;</span>を使用しています。処理ですがおおよそ<strong>10分程度で完了</strong>します。参考までにですが、本チュートリアル全体（ノートブック、モデルトレーニング、モデルホスティングの全ての合計）で、<strong>約3〜4ドル</strong>くらいで行えました。</p>
<div class="su-note"  style="border-color:#e2cbcb;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#fce5e5;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">モデルトレーニング用のインスタンスはノートブックインスタンスと別扱いとなっており、別料金が設定されています。各自、各々の責任で設定をお願いします。 </div></div>
<p><img loading="lazy" class="aligncenter size-full wp-image-704" src="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker_fee_1.png" alt="" width="838" height="364" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sagemaker_fee_1.png 838w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker_fee_1-300x130.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker_fee_1-768x334.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/sagemaker_fee_1-304x132.png 304w" sizes="(max-width: 838px) 100vw, 838px" /></p>
<p>さて、いよいよモデルフィッティングとなります！</p><pre class="crayon-plain-tag"># SageMakerのセッション
sess = sagemaker.Session()

# sagemakerのestimatorへ必要項目を指定
xgb = sagemaker.estimator.Estimator(containers[boto3.Session().region_name],
                                    role, 
                                    train_instance_count=1, 
                                    train_instance_type='ml.m4.xlarge',
                                    output_path='s3://{}/{}/output'.format(bucket, prefix),
                                    sagemaker_session=sess)

# ハイパーパラメーターの指定
xgb.set_hyperparameters(max_depth=5,
                        eta=0.2,
                        gamma=4,
                        min_child_weight=6,
                        subsample=0.8,
                        silent=0,
                        objective='binary:logistic',
                        num_class=1, 
                        num_round=100)

# モデルフィッティングと出力先の指定（S3）
xgb.fit({'train': s3_input_train, 'validation': s3_input_validation})</pre><p>
下記が出力されていれば、問題なくフィッティングが完了しています。</p><pre class="crayon-plain-tag"># こちらは入力コードではありません。出力結果です。
[95]#011train-error:0.093961#011validation-error:0.10488
 [04:47:33] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 12 extra nodes, 20 pruned nodes, max_depth=5
 [96]#011train-error:0.094204#011validation-error:0.10488
 [04:47:33] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 20 extra nodes, 24 pruned nodes, max_depth=5
 [97]#011train-error:0.094239#011validation-error:0.105244
 [98]#011train-error:0.094274#011validation-error:0.105123
 [04:47:34] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 4 extra nodes, 24 pruned nodes, max_depth=2
 [04:47:34] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 20 extra nodes, 26 pruned nodes, max_depth=5
 [99]#011train-error:0.094308#011validation-error:0.105365
===== Job Complete =====</pre><p>
ハイパーパラメーターで設定した通り100ラウンドで完了していますね。ここまでのステップで、前処理を行ったデータを使って、XGBoostアルゴリズムの訓練（トレーニング）が完了できました。次は、この訓練したモデルをデプロイしましょう。</p>
<div class="su-note"  style="border-color:#e2cbcb;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#fce5e5;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">モデルホスティング（Model Hosting）のインスタンスの料金は別料金となります。今回のチュートリアルで使用しているリージョン（US East. N. Virginia）のモデルホスティングの料金表が下記となりますので、発生する料金をご理解した上でコードの実行をお願いします。</div></div>
<p><img loading="lazy" class="aligncenter size-full wp-image-705" src="https://www.codexa.net/wp-content/uploads/2017/12/model_hosting_fee_1.png" alt="" width="858" height="579" srcset="https://www.codexa.net/wp-content/uploads/2017/12/model_hosting_fee_1.png 858w, https://www.codexa.net/wp-content/uploads/2017/12/model_hosting_fee_1-300x202.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/model_hosting_fee_1-768x518.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/model_hosting_fee_1-304x205.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/model_hosting_fee_1-234x158.png 234w" sizes="(max-width: 858px) 100vw, 858px" /></p>
<p>それでは、モデルホスティングを行いましょう。下記ですが、<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;ml.c4.xlarge&nbsp;</span>のインスタンスを利用しています。(</p>
<p><strong>処理完了まで約10分程度かかります</strong>）</p><pre class="crayon-plain-tag"># ml.c4.xlargeのインスタンスでデプロイ
xgb_predictor = xgb.deploy(initial_instance_count=1,
                           instance_type='ml.c4.xlarge')</pre><p>
いよいよ、最後のステップ「評価（Evaluation）」となります。次のステップでは、今回、訓練したXGBoostの予測精度を確認してみましょう。</p>
<h3>予測の精度確認（評価 / Evaluation）</h3>
<p>機械学習モデルの評価方法ですが、多数の手法がありますが、本チュートリアルでは一番単純かつ簡単な「<strong>実データとの比較</strong>」を行いましょう。復習となりますが、今回の<strong>予測ターゲットは銀行のキャンペーンの定期預金のお申し込み状況（Yes or No）</strong>でしたね。</p>
<p>訓練したXGBoostアルゴリズムが予測した結果と実際のラベルを照らし合わせて、どれくらいの精度で予測したかを確認してみましょう。</p>
<p>最初のステップとして、評価で使うデータの渡し方と受け取り方を指定してあげます。テストデータですが、現在はSageMakerノートブックのインスタンス上にNumpy配列として置かれています。これをHTTP POSTリクエストで予測モデルに送るために、SageMakerの「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;serializer&nbsp;</span>」を使ってシリアライズ化して、さらに<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;content_type&nbsp;</span>も指定しておきましょう。</p><pre class="crayon-plain-tag"># データの受け渡しのための設定を行っておく
xgb_predictor.content_type = 'text/csv'
xgb_predictor.serializer = csv_serializer</pre><p>
次に前のステップで作成した<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;test_data&nbsp;</span>を500行ずつの小さいバッチに小分けして、XGBoostのエンドポイントで予測を行い、Numpyの配列として出力します。</p><pre class="crayon-plain-tag"># 500行ごとの小バッチに区切ってxgb_predictorで予測算出する
def predict(data, rows=500):
    split_array = np.array_split(data, int(data.shape[0] / float(rows) + 1))
    predictions = ''
    for array in split_array:
        predictions = ','.join([predictions, xgb_predictor.predict(array).decode('utf-8')])

    return np.fromstring(predictions[1:], sep=',')

# 前項目で作成したtest_dataからターゲット項目を削除して予測を出力
predictions = predict(test_data.drop(['y_no', 'y_yes'], axis=1).as_matrix())

# 予測と正解データの比較テーブル
pd.crosstab(index=test_data['y_yes'], columns=np.round(predictions), rownames=['actuals'], colnames=['predictions'])</pre><p>
これで、予測した値が<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;predictions&nbsp;</span>としてNumpy配列に格納されました！さぁ、いよいよ結果確認です。Pandasを使って、実際の正解データと予測した「<span class="su-highlight" style="background:#fce6e6;color:#d70202">&nbsp;predictions&nbsp;</span>」の結果をテーブルにしてあげましょう。</p>
<p>＊追記 3月13日＊<br />
下記、正解 x 予測比較のテーブルのコードが抜け落ちていましたので追記致しました。</p>
<p><strong>（ドラムロール）（ドラムロール）</strong></p>
<p><img loading="lazy" class="aligncenter size-full wp-image-711" src="https://www.codexa.net/wp-content/uploads/2017/12/final_predict.png" alt="" width="172" height="120"></p>
<span class="su-highlight" style="background:#ffffff;color:#f15858">&nbsp;う〜〜〜ん・・・なんとも微妙な感じの予測ですね（苦笑）&nbsp;</span>。テストデータ全4119件中、約4000人の顧客を「<strong>見込み顧客</strong>」として考えて、その中の480名が実際に定期預金へお申し込みをしたと言えます。</p>
<p>これを土台に、特徴量の調整やハイパーパラメーターの調整など、予測精度を改善してみると、より深い理解＆学習になるかと思います！</p>
<p><strong>最後に重要な作業です！！</strong></p>
<p><strong>本チュートリアルが終わったら、余計な料金が発生しないように、今回作成したエンドポイントを削除しましょう。不安な方は、SageMakerの管理画面で「モデル」「エンドポイント」「ノートブック」の状況が確認できますので、不必要なものは適宜、削除または停止をしておいた方が良いかと思います。</strong></p><pre class="crayon-plain-tag"># 作成したエンドポイントの削除
sagemaker.Session().delete_endpoint(xgb_predictor.endpoint)</pre><p>
<h3>まとめとSageMakerの所感</h3>
<p>少々長いチュートリアルになってしまいましたが、Amazon SageMakerは如何でしたでしょうか？個人的な所感ではありますが、機械学習エンジニアにとっては「孫の手」のようなツールだと感じました。</p>
<p>膨大なデータを処理する機械学習ですが、今までクラウド上で処理をされる方も多かったと思いますが、使いたいフレームワークやツールなど、その都度、設定やインストールを行い、全体の管理をするのに、それなりの労力があったかと思います。</p>
<p>また、作成したモデルをホスティングするのに、膨大な作業が必要だったのも事実です。SageMakerを利用することで、機械学習の0から100まで、ほぼ全てのステップが一括して行えるプラットフォームというのは非常に魅力的だと感じました！</p>
<p>他にも似たような機械学習初心者向けチュートリアルをやってみたいという方は、こちらも挑戦してみてください。</p>
<ul>
<li><a href="https://www.codexa.net/kaggle-recruit-restaurant-visitor-forecasting-handson/">Kaggle リクルートレストラン客数予想チャレンジをやってみた – Kaggle初心者ハンズオンチュートリアル</a></li>
<li><a href="https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/">Kaggle メルカリ価格予想チャレンジの初心者チュートリアル</a></li>
<li><a href="https://www.codexa.net/kaggle-titanic-beginner/">【Kaggle初心者入門編】タイタニック号で生き残るのは誰？</a></li>
</ul>
<p>機械学習ではありませんが、ここ最近日本語解禁となった<a href="https://www.codexa.net/alexa-skill-kit-beginner-tutorial/">Amazon Alexa Skill Kit（ASK）の初心者入門チュートリアル</a>も個人的にはおすすめです！（話題のスマートスピーカーAmazon Echoのスキル開発ができます）</p>
<p>以上、速報バージョンのAmazon SageMakerハンズオンチュートリアルとなります！随時、わかりやすいように改善をしていきますので、ご指摘やご意見はコメントにてお願いできればと思います！</p>
<p>追記 2017年12月21日</p>
<p>Amazon SageMakerチュートリアル第二段目を公開しました！<a href="https://www.codexa.net/amazon-sagamaker-xgboost-game-sales-predictions/">ゲームソフトの売行きをXGBoostで予測してみた【Amazon SageMaker ノートブック＋モデル訓練＋モデルホスティングまで】</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/amazon-sagemaker-tutorial-marketing-offers/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWS SageMakerは機械学習のモデル作成からホスティングまでクラウドで単純化してくれます</title>
		<link>https://www.codexa.net/aws-sagemaker-announcement/</link>
					<comments>https://www.codexa.net/aws-sagemaker-announcement/#respond</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Wed, 06 Dec 2017 10:02:05 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=648</guid>

					<description><![CDATA[日本時間11月30日に、AWSのre:InventカンファレンスでAWSの様々な新サービスや大型アップデートが発表されましたが、特に大きな反響がありそうなのがAWS SageMakerです。（読み方はセージメイカーです [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>日本時間11月30日に、AWSのre:InventカンファレンスでAWSの様々な新サービスや大型アップデートが発表されましたが、特に大きな反響がありそうなのが<a href="https://aws.amazon.com/jp/sagemaker/" target="_blank" rel="nofollow noopener">AWS SageMaker</a>です。（読み方は<strong>セージメイカー</strong>です）</p>
<p>まだAWS公式ページも英語での記載のみで、日本語ローカリゼーションが完了していませんでしたので、一足先に、この話題の新サービス「AWS SageMaker（AWSセージメーカー）」の概要をまとめました。</p>
<p>一言でまとめると「<strong>機械学習エンジニアの痒いところに手がとどくサービス</strong>」という印象です。では、早速、この孫の手のようなサービスの詳細を見ていきましょう。</p>
<div class="su-box su-box-style-default" id="" style="border-color:#14806a;border-radius:3px"><div class="su-box-title" style="background-color:#47B39D;color:#FFFFFF;border-top-left-radius:1px;border-top-right-radius:1px">12月21日 追記</div><div class="su-box-content su-u-clearfix su-u-trim" style="border-bottom-left-radius:1px;border-bottom-right-radius:1px">
<p><a href="https://www.codexa.net/amazon-sagemaker-tutorial-marketing-offers/" target="_blank" rel="noopener">第一回目Amazon SageMakerの初心者向け入門チュートリアル</a>の記事を公開しました。銀行の定期貯金キャンペーンの予測問題をAmazon SageMakerとXGBoostを使って予測しました。</p>
<p><a href="https://www.codexa.net/amazon-sagamaker-xgboost-game-sales-predictions/">第二回目ゲームソフトの売行きをXGBoostで予測してみた【Amazon SageMaker ノートブック＋モデル訓練＋モデルホスティングまで】</a>の記事を公開しました。</p>
</div></div>
<h3>AWS SageMaker（AWSセージメーカー）の概要</h3>
<p><img loading="lazy" class="aligncenter size-full wp-image-650" src="https://www.codexa.net/wp-content/uploads/2017/12/aws_sagemaker_head.png" alt="" width="764" height="189" srcset="https://www.codexa.net/wp-content/uploads/2017/12/aws_sagemaker_head.png 764w, https://www.codexa.net/wp-content/uploads/2017/12/aws_sagemaker_head-300x74.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/aws_sagemaker_head-304x75.png 304w" sizes="(max-width: 764px) 100vw, 764px" /></p>
<p>Amazon SageMakerは、端的にいうと<strong>機械学習モデルの開発や訓練、さらにはデプロイメントまで、一つのプラットフォームで管理・効率化してくれるサービス</strong>です。公式AWSのタイトルでは「機械学習を加速する」と書かれており、機械学習エンジニアが一つのプロジェクトで必要とするほぼ全てのステップにおいて、AWS SageMakerを利用することで効率化・スピードアップが可能になります。</p>
<p>そもそも、AWSは既に<a href="https://aws.amazon.com/jp/machine-learning/?nc2=h_m1" target="_blank" rel="nofollow noopener">AWS Machine Learning</a>（AWS機械学習）として、機械学習エンジニア向けのクラウドコンピューティングサービスを展開していました。では、なぜこのタイミングで別の機械学習サービスが出てきたのでしょか？</p>
<p>「<strong>機械学習が使える専門家がまだまだ少なく、さらに、そのほとんどが予算のある大きなテック企業で勤めている状況にある。もっと多くの人が機械学習を利用して欲しければ、普通の開発者にとっても、より利用しやすいものにしなければならない</strong>」</p>
<p>これは、AWSのイベントでのCEO Jeff氏からの言葉です。この通りで、この新サービス「AWS SageMaker」は、ほぼ全ての機械学習エンジニアリング工程を<strong>より簡単に効率よくするためのサービスです。</strong></p>
<p>では、より具体的にAWS SageMakerを見ていきましょう。</p>
<p>AWS SageMakerですが、主に三つの機能で構成されています。</p>
<ol>
<li><strong>オーサリング：</strong><br />
いわゆるデータセットの<strong>前処理の工程</strong>のことです。機械学習の9割はデータセットの前処理だ、と言われているほど重要な工程ですよね。すでに多くの機械学習エンジニアの方が、iPythonやJupyter Notebookなど、セルコーディングを利用されているかと思います。AWS SageMakerでは、Jupyter NotebookをCPUベースやGPUベースなど、クラウド上で利用状況に合わせて簡単にセットアップ＆利用が可能です。（これは既存のAWS Machine Learningでは無いサービスでした）</li>
<li><strong>モデルトレーニング：</strong><br />
モデル構築や学習、さらには評価もクラウドで行えます。すでに多数の学習アルゴリズムが組み込まれているのも大きな特徴の一つですが、加えて、多数のフレームワークやDockerコンテナなどを利用して独自の学習環境を構築もできます。また、大きなメリットとして、学習データなどのをAWS S3が簡単に使えます。（これは既存のAWS Machine Learningでも同様です）</li>
<li><strong>モデルホスティング：<br />
</strong>構築したモデルをリアルタイムで使えるように、HTTPSエンドポイントが提供されます。さらにスケールをすることも容易にできて、複数モデルでのA/Bテストも行うことが可能のようです（これは使って見たいですね！）。</li>
</ol>
<p><img loading="lazy" class="aligncenter size-large wp-image-651" src="https://www.codexa.net/wp-content/uploads/2017/12/aws-sagemaker-2-1024x183.png" alt="" width="1024" height="183" srcset="https://www.codexa.net/wp-content/uploads/2017/12/aws-sagemaker-2-1024x183.png 1024w, https://www.codexa.net/wp-content/uploads/2017/12/aws-sagemaker-2-300x54.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/aws-sagemaker-2-768x137.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/aws-sagemaker-2-304x54.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/aws-sagemaker-2.png 1433w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<h3>AWS SageMakerの使うメリット</h3>
<p>さて、すでに概要を見ただけでも、使ってみるメリットがありそうですが、より詳しくAWS SageMakerのメリットを見ていきましょう。</p>
<ul>
<li><strong>機械学習プロセスを高速化してくれる</strong><br />
データセットの前処理から、モデルトレーニング、さらにはデプロイまで、AWS SageMakerでクラウドで、さらに一つのプラットフォームで行う事により、機械学習を使うプロセスが従来よりも短い時間で済みます。</li>
<li><strong>豊富なフレームワークとアルゴリズム</strong><br />
現在、世の中にでている機械学習のフレームワークは<strong>全て</strong>AWS SageMakerで使うことが可能です。いちいち使いたいフレームワークをセットアップしたりする必要がありません。また独自で開発したい方でも、Dockerコンテナを持ち込むことも当然可能です。</li>
<li><strong>訓練ずみのモデルへ簡単にアクセス<br />
</strong>HTTPSエンドポイントが提供されているので、AWS SageMakerで構築したモデルを、余計なステップを踏むことがなく、既存のウェブアプリケーションへデプロイをすることが可能です。</li>
</ul>
<p>&nbsp;</p>
<h3>料金体系と提供リージョン</h3>
<p>さて、気になるAWS SageMakerの料金ですが、クラウドならではの従量課金となっています。使用した秒数ごとに課金され、最低利用料金や事前に支払わなくてはいけない前金などはありません。</p>
<p>AWS SageMakerの料金ですが、主に3つに分類されます。一つ目がオンデマンド機械学習インスタンス、機械学習ストレージ、Notebooksやホスティングする際のデータ処理費用の三つとなります。</p>
<p>嬉しい事に、AWS SageMakerですが、AWS無料枠の適用もあります。サインアップから最初の2ヶ月間のみ、下記が無料枠の中で利用することが可能です。</p>
<ul>
<li>notebookを使用したモデル構築  250時間（t2.meduim）</li>
<li>訓練コンピューティング 50時間（m4.xlarge）</li>
<li>モデルホスティング 125時間（m4.xlarge）</li>
</ul>
<p>現時点でAWS SageMakerを使えるリージョンは4つのみとなります。</p>
<ul>
<li>US Eash (N. Virginia)</li>
<li>US Eash (Ohio)</li>
<li>US West (Oregon)</li>
<li>EC (Ireland)</li>
</ul>
<p>まだ東京リージョンでは利用できませんので、ひとまずは海外リージョンを利用して、試して見てください。これは私の予測ですが、東京リージョンでも早々に解放になるかと思います。（そう願います！）</p>
<p>英語ドキュメントになりますが、<a href="https://aws.amazon.com/jp/sagemaker/pricing/" target="_blank" rel="nofollow noopener">詳しい価格表</a>はこちらをご覧ください。</p>
<h3>まとめ</h3>
<p>AWSですが、人工知能関連（機械学習）のサービスを続々とリリースしています。同イベントでは、<a href="https://www.codexa.net/aws-ml-solutions-lab/">Amazonの機械学習専門家が機械学習導入を手助けしてくれるAWS ML Solutions Labの開始</a>もありましたが、アマゾンの人工知能周りのサービスの注力度が伝わりますね。</p>
<p>また近日中にAmazon SageMakerのハンズオンチュートリアルも公開しますので、ご興味がある方は、ぜひメルマガまたはSNSのフォローをお願い致します！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/aws-sagemaker-announcement/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWS機械学習から新サービス！AWS ML Solutions Labは機械学習の専門家とのマッチング</title>
		<link>https://www.codexa.net/aws-ml-solutions-lab/</link>
					<comments>https://www.codexa.net/aws-ml-solutions-lab/#respond</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Wed, 29 Nov 2017 03:16:50 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=588</guid>

					<description><![CDATA[機械学習の処理をクラウド（Machine Learning As a Service）で行う流れは、すでに一般的なものになりつつあります。MicrosoftやAWSなど、大手の会社からは毎日のように新しいサービスのリリー [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>機械学習の処理をクラウド（<a href="https://www.codexa.net/mlaas-comparison/">Machine Learning As a Service</a>）で行う流れは、すでに一般的なものになりつつあります。MicrosoftやAWSなど、大手の会社からは毎日のように新しいサービスのリリースがありますが、米国11月22日にAWSから今までのサービスとは少し異なる新サービスの告知がありました。</p>
<p>その名も「Amazon ML Solutions Lab（アマゾン・機械学習・ソリューション・ラボ）」です！何が変わっているかと言うと、この新サービスはクラウドコンピューティングなどではなく、AWSに所属している機械学習の専門家と顧客を結びつけて、機械学習活用のコンサルティングを行うサービスなのです。</p>
<p>まだ発表されて間もないサービスではありますが、グローバル展開を開始当初から行うようです。現時点では、<a href="https://aws.amazon.com/jp/ml-solutions-lab/?nc1=h_ls" target="_blank" rel="nofollow noopener">Amazon ML Solutions Lab</a>のページは英語となっていますので、日本で当サービスを利用するのは少し時間がかかりそうです。</p>
<p><strong>機械学習を導入したい！けど・・それを使える人材もいないし・・どこまで費用対効果があるのかも分からないから初期投資を積極的には行えない・・なんて考えている会社さんも多数いるかと思います。</strong></p>
<p>Amazon ML Solutions Labがどんなサービスなのか？などの概要をまとめました。</p>
<p>&nbsp;</p>
<h3>Amazon ML Solutions Labとは？</h3>
<p>まずは概要から見ていきましょう。読み方ですが、「アマゾン・エムエル・ソリューションズ・ラボ」です。名前に入っている「ML」ですが、「Machine Learning」（機械学習）の略語です。</p>
<p>冒頭でも触れましたが、本サービスは通常のクラウドコンピューティングサービスではなく、いわゆる「コンサルティング」のサービスとなります。</p>
<p>アマゾンでは20年以上も前から機械学習（人工知能分野）に積極的に投資・社内活用をしており、世界でも屈指の最先端な機械学習専門家が所属をしています。</p>
<p>また一方で、自社のサービスやプロダクト、社内事務などで機械学習を利用してみたいと考えている企業は多数ありますが・・、「<strong>どこから手をつけて良いのか分からない</strong>」と漠然とした課題を抱えています。</p>
<p>今回のサービスでは、まさにそのような課題を抱えている企業向けの「<strong>コンサルティング</strong>」サービスです。より具体的なサービスの詳細をみていきましょう！</p>
<h3>機械学習を導入するまでのステップ</h3>
<p>Amazon ML Solutions Labが顧客へ機械学習ソリューションの導入方法として、3つのステップが用意されています。</p>
<ol>
<li><strong>ブレインストーミングと課題定義</strong><br />
機械学習をどのように使えば良いのか？社内で解決すべき問題の定義や、それに伴う解決の方法などをアマゾンの機械学習専門家と一緒にアイデアを出しながら煮詰めていきます。機械学習の根本的な仕組みや、豊富な活用事例を理解している専門家が初期段階から一緒にアイデアを出せるのはとても有意義かと思います。</li>
<li><strong>カスタムメイドのモデリング</strong><br />
次のステップでは、機械学習専門家があなたの会社のデータを使ってソリューションを作成する工程となります。例えば自社事業の売上予測をするにしても、どのような項目を使うのか？また予測をする手法もたくさんあるが、どれを使えば最適に運用が可能なのか？などなど機械学習を導入する際に直面する多数の課題を、専門家と一緒に解決をしていきます。機械学しゅを使える専門家もこれから増えていくと思いますが、一人の専門家の経験値や限られます。対してAmazonでは物流やセキュリティー、不正検出、与信判断、文章解析、サプライマネージメントなどなど・・ほぼ全ての領域で機械学習を活用しており、それぞれの分野の専門家が自社の課題を解決してくれるのはメリットがでかいですね！</li>
<li><b>自社で運用するための教育とトレーニング</b><br />
多くのかたが勘違いする部分ですが、機械学習を活用したシステムを作っても、ずーっと使える訳ではありません。常にメンテナンスやモデルの調整などは必須です。Amazon ML Solutions Labでは、機械学習を活用したシステムの作成の後の「<strong>運用</strong>」が行えるように、自社のエンジニアの教育をしてくレます。</li>
</ol>
<p><img loading="lazy" class="aligncenter size-full wp-image-591" src="https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-services.png" alt="" width="671" height="398" srcset="https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-services.png 671w, https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-services-300x178.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-services-304x180.png 304w, https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-services-266x158.png 266w" sizes="(max-width: 671px) 100vw, 671px" /></p>
<p>日本でも機械学習の導入を検討している会社さん向けのマッチング会社がいくつか出てきていますが、マッチングを行う側の知識や経験がどれくらいあるかのは非常に疑問な部分ではあります。また、機械学習を活用したシステム開発を行なっている企業でも、得意・不得意はあり、全ての分野で経験を積んでいる会社はごく少数です。</p>
<p>それを考えると、Amazon ML Solutions Labを利用するのは非常にメリットが高いと言えるのではないでしょうか！</p>
<h3>Amazon ML Solutions Labの料金</h3>
<p>さて、気になる料金ですが・・まだ明確になっていません。現時点では、<a href="https://aws.amazon.com/jp/ml-solutions-lab/?nc1=h_ls" target="_blank" rel="nofollow noopener">ML Solutions Labのサイト上で見積もりのお申し込み</a>をした後に、担当者から連絡がくるとのことです。</p>
<p>すでにアメリカで利用している企業もあるのでは？と色々なサイトなどを見て回ったのですが、現状ではどのくらいのコストが掛かるのかは不明でした。いくつかのメディアが直接、AWSヘ料金のお問い合わせをしているようですが、まだ返答が無いようです。</p>
<p>すでに本サービスへお申し込みを行なっている企業名は明かされています。</p>
<p>米新聞社「ワシントン・ポスト」（AmazonのCEOジェフ・ベゾス氏に買収されています）やトヨタ自動車の米国の子会社「TOYOTA RESEARCH INSTITUTE」、またジョンソン・ジョンソンの製薬事業を行なっているJanssenなどです。</p>
<p>そもそも事業形態がコンサルティングに近いので、一概に料金表を掲載するのも難しいのはわかりますが・・どれくらいのコスト感で利用できるのかは気になるところですね。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-592" src="https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-customers-ex-1024x256.png" alt="" width="1024" height="256" srcset="https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-customers-ex-1024x256.png 1024w, https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-customers-ex-300x75.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-customers-ex-768x192.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-customers-ex-304x76.png 304w, https://www.codexa.net/wp-content/uploads/2017/11/AWS-ML-customers-ex.png 1048w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<h3>その他の気になる部分</h3>
<p>料金を含めて、まだ詳細が明らかになっていない部分も多いですが、現時点でわかっている部分をまとめました。</p>
<p><strong>①通常どれくらいの期間が掛かるのか？</strong></p>
<p style="padding-left: 30px;">Amazon ML Solutions Labでは通常の提携機関として3ヶ月〜6ヶ月となるそうです。ただし、あくまで「通常」とのことで、例外もどうやらありそうです。</p>
<p><strong>②機械学習を活用して問題解決は100%できますか？</strong></p>
<p style="padding-left: 30px;">端的な回答としては「<strong>保証はできません</strong>」とのことです。機械学習が活躍できる範囲ですが、ほぼ全ての業種の様々な業務（物流や販売、マーケティングに到るまで）をカバーしていますが、それでも問題解決ができないケースもあります。Amazon ML Solutions Labを利用したとしても、機械学習が問題を解決するのをAmazonが保証するものではありません。</p>
<p><strong>③このサービスが使える地域は？日本では使えるの？</strong></p>
<p style="padding-left: 30px;">Amazon ML Solutions Labですが、当初からグローバル展開をするとのことで、原則として日本でも使えます。おそらくサービスの特性上、多数の顧客を抱えるモデルではないと思いますので、興味がある方は、早めにAWSへお問い合わせをお勧めいたします！</p>
<hr>
<p>AWSから新しくリリースされた「Amazon ML Solutions Lab（アマゾン・エムエル・ソリューションズ・ラボ）」のご紹介でした。褒め称えた記事になってしまいましたが・・客観的にみても、機械学習の導入を検討されている企業にとってはメリットの高いソリューションかと思います。</p>
<p>経済産業省の調査ですと、日本では<a href="https://www.codexa.net/ai-human-resources-shortage/">2020年までに人工知能などの先端技術を扱えるエンジニアが約4.８万人不足</a>すると言われています。</p>
<p>今後も、このような機械学習導入支援サービスは様々な会社から出てきそうですね！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/aws-ml-solutions-lab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
