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

<image>
	<url>https://www.codexa.net/wp-content/uploads/2017/11/cropped-favicon-32x32.png</url>
	<title>Kaggle &#8211; 機械学習 入門コースの決定版!機械学習エンジニアを目指すならcodexa（コデクサ）</title>
	<link>https://www.codexa.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kaggle初心者必見！Kaggle Notebookの使い方を徹底解説</title>
		<link>https://www.codexa.net/kaggle-notebook-for-beginners/</link>
					<comments>https://www.codexa.net/kaggle-notebook-for-beginners/#respond</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Fri, 19 Jun 2020 06:18:07 +0000</pubDate>
				<category><![CDATA[Kaggle]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=2214</guid>

					<description><![CDATA[Kaggle Notebookの使い方をKaggle 初心者向けに徹底解説しました。データの取り扱い方法、ライブラリの追加の仕方などを詳しくまとめました。]]></description>
										<content:encoded><![CDATA[<p>本稿ではKaggleの初心者向けにKaggle Notebookの基本的な使い方を解説します。本記事で紹介するKaggle Notebookとは機械学習エンジニアのためのKaggleというプラットフォームのサービスです。このKaggleでは、企業や研究者がデータを投稿し、世界中の統計解析やデータ分析の専門家が機械学習モデルの最適さを競い合うコンペ（競技大会）が開催されています。本来Kaggle Notebookはコンペ参加者向けに提供されているものです。</p>
<p>Kaggleについてもっと知りたい方は<a href="https://www.codexa.net/what-is-kaggle/">Kaggleとは？機械学習初心者が知っておくべき3つの使い方</a>を参考にしてみてください。</p>
<div class="su-note"  style="border-color:#dadada;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:#f4f4f4;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">
<p><strong>Jupyter Notebookとは </strong></p>
<p>Jupyter Notebookとは機械学習エンジニアが愛用するとても便利なソフトウェアです。PythonやRなどの言語を使い、プログラムを実行する機能を有します。またコードとは別に、マークダウンという機能が存在します。これはコードの説明をする際に便利で普通の文章を打ち込むことができる機能です。これにより、他人がコードを読んだ時、よりあなたのコードを理解しやすくなります。それに加えて、コードを全体での実行だけでなく、一部分ずつ実行できるという特徴（詳しくは後述）もあり、機械学習の様々なタスクを行う上でとても便利です。</p>
</div></div>
<div class="su-note"  style="border-color:#dadada;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:#f4f4f4;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">
<p>注釈:Kaggleはサービス全体を私用での目的にのみに制限しています。商用での利用等は禁止されています。Kaggle Notebookをご利用の前に必ず利用規約を参照してください。</p>
<p><a href="https://www.kaggle.com/terms">Kaggle Terms</a></p>
</div></div>
<h3>Kaggle Notebookが人気の3つの理由</h3>
<p>ここでは、なぜKaggle Notebookなのかを、「開発環境」「環境構築」「Kaggleとの連携」の三つの理由をもとに解説していきます。</p>
<h4>最低限の開発環境を無料で利用可能</h4>
<p>数千、数万という比較的機械学習では少ないデータ数を扱う際や、シンプルな機械学習モデルを作る際などにはそれほどのマシンスペックは求められません。しかし機械学習の性質上、数百、数千万という膨大なデータや計算が複雑なアルゴリズムを含むモデルを作成する機会が多々あります。その際に、マシンスペックが理由で計算ができないことがあります。Kaggle NotebookではGPUやTPUの利用ができるため、より機械学習に向いた開発環境です。（GPU・TPUは後述します）</p>
<h4>環境構築が不要</h4>
<p>機械学習のモデルの実装のために、多くのライブラリやフレームワークが必要です。ライブラリは目的に応じて自身の環境へインストールする必要があります。環境構築は特にプログラミング初学者には複雑で手間がかかる場合があります。しかし、Kaggle Notebookでは機械学習で使わられる代表的なライブラリが利用可能な状態で提供されます。そのため初心者でも複雑な環境構築をせずに機械学習の環境が利用できるのは大きなメリットの一つです。ただし全てのライブラリ・ フレームワークがインストールされている訳ではありません。追加でインストールが必要なライブラリもあります。例えば日本語の形態素解析で使用されるライブラリ「mecab」 はKaggle Notebookにはインストールされていません。ライブラリの追加方法は後ほど詳しく解説します。</p>
<h4>Kaggleとの連携</h4>
<p>Kaggle NotebookはもちろんKaggleの利用に最適化された開発環境となっています。データ分析コンペに参加する際は特に便利に感じることができるでしょう。例えばデータをダウンロードをせずにコンペ用のデータセットを使用できたり、アウトプットした予測値をワンクリックで提出できます。</p>
<h3>Kaggle Notebookの使い方(基本編)</h3>
<p>この基本編では、Kaggle Notebookを扱う上で基礎と以下の操作方法を解説します。Kaggle Notebookを初めて扱う方は一緒に操作を行ってみてください。</p>
<ul>
<li>アクセスおよび起動の仕方</li>
<li>セルとボタンの説明</li>
<li>データの使い方</li>
<li>ライブラリの追加の仕方</li>
</ul>
<h4 class="text-cell-section-header">アクセスおよび起動の仕方</h4>
<p>Kaggle Notebookの使用するには<a href="https://www.kaggle.com/account/login?phase=startRegisterTab&amp;returnUrl=%2F" target="_blank" rel="noopener">無料会員登録</a>が必要です。ログイン後に<a href="https://www.kaggle.com/">Kaggleトップページ</a>の左の欄の「Notebooks」をクリックするとノートブックのトップページへ遷移します。ノートブックのトップページの「+New Notebook」をクリックしてください。</p>
<p>図２の「Select language」で使用言語を選択することが可能です。現在はPythonと<a href="https://www.codexa.net/what-is-r/">R言語</a>の2種類の言語を選択できます。次に「Select type」でNotebookかScriptを選択してください。目的に応じてどちらの種類を使用するのかは異なります。本稿ではNotebookを解説します。</p>
<div id="attachment_2256" style="width: 603px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2256" loading="lazy" class="wp-image-2256 " src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_1.png" alt="" width="593" height="347" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_1.png 1137w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_1-300x176.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_1-768x450.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_1-1024x600.png 1024w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_1-304x178.png 304w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_1-270x158.png 270w" sizes="(max-width: 593px) 100vw, 593px" /><p id="caption-attachment-2256" class="wp-caption-text">図２</p></div>
<p>「SHOW ADVANCED SETTINGS」は高度な設定のため、原則は変更は不要です。そのまま「Create」ボタンをクリックしてNotebookの作成をしましょう。「ADVANCED SETTINGS」の内容については、本記事の最後の項で解説をします。</p>
<h4>セルとボタン説明</h4>
<p>図3のように一つ一つのコードを入れる行をJupyter Notebookでは「セル」と呼びます。セルの中へPythonのコードを入力し、実行することができます。Notebookの最大の特徴はこのセルにあります。Notebookでは全体を一括実行だけでなく、セル単位でコードを実行することができるので、データの細かい分析やEDA（<a href="https://www.codexa.net/basic-exploratory-data-analysis-with-python/">探索的データ分析</a>）をする際など、すべてのコードを実行する必要がない場合に便利です。（図３を参照）</p>
<div id="attachment_2250" style="width: 1531px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2250" loading="lazy" class="wp-image-2250 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6.png" alt="" width="1521" height="123" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6.png 1521w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6-300x24.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6-768x62.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6-1024x83.png 1024w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6-304x25.png 304w" sizes="(max-width: 1521px) 100vw, 1521px" /><p id="caption-attachment-2250" class="wp-caption-text">図３</p></div>
<p>次に左上に図4のような3つのボタンがあります。 一番左はセルを下に一つ追加、真ん中はセルを実行。一番左は、Notebook「全体のコードを実行」です。Kaggle Notebookでは便利なショートカットキーの設定が用意されています。最も頻繁に使われるショートカットキーの一つに「<span class="su-label su-label-type-info">Shift ＋ Enter</span>」があります。これには「選択中のセルを実行し、下にセルを追加」という機能を有している非常に便利なショートカットキーなのでぜひ使ってみてください。</p>
<div id="attachment_2252" style="width: 251px" class="wp-caption alignnone"><img aria-describedby="caption-attachment-2252" loading="lazy" class="wp-image-2252 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_8.png" alt="" width="241" height="42" /><p id="caption-attachment-2252" class="wp-caption-text">図４</p></div>
<p>Notebookでの作業が終わったら必ず保存をしましょう。図5の「Save Version」 をクリックすることでノートブックの保存が可能です。注意点として、Kaggle Notebookの仕様の一つに、最後の操作から１時間経過してしまうと、ページの更新が必要になるというものがあります（windowsでのF5）。これを行った際、コードは消えませんが実行結果や出力したファイルが消えてしまうので、１時間以上、デスクの前から席を外す場合はこちらのセーブボタンで保存するようにしておきましょう。</p>
<div id="attachment_2253" style="width: 247px" class="wp-caption alignnone"><img aria-describedby="caption-attachment-2253" loading="lazy" class="wp-image-2253 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_9.png" alt="" width="237" height="46" /><p id="caption-attachment-2253" class="wp-caption-text">図５</p></div>
<h4>データの使い方</h4>
<p>機械学習モデル開発の際にとても重要になるものがデータです。データなくして機械学習開発ははじまりません。そのような機械学習を勉強する際に一番大事なものと言っても過言でないデータの扱い方について、触れていきたいと思います。</p>
<p>最初に、Notebook右上の青字の「+ Add data」をクリックしていただくと 図６のような画面が出てくると思います。自分のデータを使いたいときは「Upload」をクリックし、自分のデータをアップロードすれば、 Kaggle Notebook上ですぐに使えるようになります。自習の際はもちろん、なにか自分の成果物を作りたいとき、さらにはコンペにて外部データを用いてより良いモデルを作りたい時に必要なデータは 「Datasets」で探すことができます。そしてKaggleのコンペで使われているデータは「Competition Data」 をクリックしコンペ名を入力すれば探すことができます。</p>
<div id="attachment_2257" style="width: 1034px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2257" loading="lazy" class="wp-image-2257 size-large" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_2-1024x581.png" alt="" width="1024" height="581" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_2-1024x581.png 1024w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_2-300x170.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_2-768x435.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_2-304x172.png 304w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_2-279x158.png 279w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_2.png 1141w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-2257" class="wp-caption-text">図６</p></div>
<p>本項では試しに、有名なタイタニックコンペのファイル(train.csv)をKaggle Notebook上で使用し、読み込みまで行ってみたいと思います。</p>
<p>図6-1の左の青枠の「Competition Data」をクリックしていただき、右の検索欄に「Titanic」と入力していただくと、Titanicのコンペが出てきます。そしたら右の「Add」を押していただけばNotebook上でそのデータが使用可能になります。(コンペティションのデータセットはノートブックに追加しても、自分のデータセットには入れる必要がなく使用することができます。)</p>
<div id="attachment_2276" style="width: 769px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2276" loading="lazy" class="wp-image-2276 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/titanic_2.png" alt="" width="759" height="226" srcset="https://www.codexa.net/wp-content/uploads/2020/06/titanic_2.png 759w, https://www.codexa.net/wp-content/uploads/2020/06/titanic_2-300x89.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/titanic_2-304x91.png 304w" sizes="(max-width: 759px) 100vw, 759px" /><p id="caption-attachment-2276" class="wp-caption-text">図6-1</p></div>
<p>次に図７の右上の矢印をクリックしていただくと、このNotebook上のディレクトリを表示することができ、Notebook上のファイル構造を確認することができます。 それを確認することで、今回はinputフォルダの中にtitanicフォルダが入っていて、 その中に目的のtrain.csvのデータがあることがわかります。</p>
<div id="attachment_2258" style="width: 332px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2258" loading="lazy" class="wp-image-2258 " src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_3.png" alt="" width="322" height="405" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_3.png 351w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_3-238x300.png 238w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_3-170x214.png 170w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_3-125x158.png 125w" sizes="(max-width: 322px) 100vw, 322px" /><p id="caption-attachment-2258" class="wp-caption-text">図7-1</p></div>
<p>(&#8216;../input/titanic/train.csv&#8217;)このようなファイルパスを指定してあげることにより無事データを取り込み、出力させることができました。</p>
<div id="attachment_2259" style="width: 1317px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2259" loading="lazy" class="wp-image-2259 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_4.png" alt="" width="1307" height="595" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_4.png 1307w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_4-300x137.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_4-768x350.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_4-1024x466.png 1024w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_4-304x138.png 304w" sizes="(max-width: 1307px) 100vw, 1307px" /><p id="caption-attachment-2259" class="wp-caption-text">図7-2</p></div>
<h4>ライブラリの追加</h4>
<p>この項に入る前に、ライブラリという言葉を少し紹介させていただきます。</p>
<p>プログラミングの作業をより簡単に効率的に進めるために、ライブラリというものが存在します。このライブラリとは道具箱のようなもので、この中には色々な小道具が入っています。本来この小道具たちは１からプログラムを組んで作らなければいけないのですが、このライブラリを使うことでその過程を省略し、すぐに使うことができます。</p>
<p>Kaggle Notebookには一般的に使われるライブラリは既にインストールしてあり、importすることによってすぐに使えるようになっていますが、一部のライブラリはインストールが必要な場合があります。本稿では、名前から人種を判別するライブラリである「<a href="https://pypi.org/project/ethnicolr/">Ethnicolr</a>」を用いてライブラリの追加の方法を紹介します。</p>
<p>図8-1にて「ethinicolr」をimportしようとしますが、「ModuleNotFoundError:No module namese &#8216;ethnicolr&#8217;」と出てきます。これは、ライブラリやフレームワークがインストールされていない状態でimportをしようとすると出るエラーです。</p>
<div id="attachment_2205" style="width: 725px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2205" loading="lazy" class="wp-image-2205 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/library_4.png" alt="" width="715" height="173" srcset="https://www.codexa.net/wp-content/uploads/2020/06/library_4.png 715w, https://www.codexa.net/wp-content/uploads/2020/06/library_4-300x73.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/library_4-304x74.png 304w" sizes="(max-width: 715px) 100vw, 715px" /><p id="caption-attachment-2205" class="wp-caption-text">図8-1</p></div>
<p>図8-1でこのライブラリがimportされていないことが確認できたので、図8-2でpipを使いethnicolrをインストールしたいと思います。図8-2のようにダウンロードが始まり、エラーが出なかったら無事インストールが完了したことになります。</p><pre class="crayon-plain-tag">"""
pipでインストールする際の書き方
pip install ライブラリ名
"""</pre><p>
<div id="attachment_2204" style="width: 716px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2204" loading="lazy" class="wp-image-2204 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/library_2.png" alt="" width="706" height="250" srcset="https://www.codexa.net/wp-content/uploads/2020/06/library_2.png 706w, https://www.codexa.net/wp-content/uploads/2020/06/library_2-300x106.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/library_2-304x108.png 304w" sizes="(max-width: 706px) 100vw, 706px" /><p id="caption-attachment-2204" class="wp-caption-text">図8-2</p></div>
<div>
<div>
<p>ライブラリのインストールが完了したら、再度importを試してみましょう。図8-3のようにエラーメッセージが何も表示されなかった場合は無事importが終わり、Notebook内でそのライブラリが使える状態であることを表しています。</p>
<div id="attachment_2202" style="width: 724px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2202" loading="lazy" class="wp-image-2202 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/library_3.png" alt="" width="714" height="96" srcset="https://www.codexa.net/wp-content/uploads/2020/06/library_3.png 714w, https://www.codexa.net/wp-content/uploads/2020/06/library_3-300x40.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/library_3-304x41.png 304w" sizes="(max-width: 714px) 100vw, 714px" /><p id="caption-attachment-2202" class="wp-caption-text">図8-3</p></div>
</div>
<div>
<div class="su-note"  style="border-color:#dadada;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:#f4f4f4;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">
<p>注釈:pipインストールをする際には、Kaggle Notebookとインターネットの接続が必須になります。電話番号で本人認証をすると接続できるようになります。</p>
</div></div>
</div>
<h3>Kaggle Notebookの使い方(応用編)</h3>
<p>こちらの応用編では、基本編のように絶対に必要な知識とまではいきませんが、知っているとより便利な機能を紹介させていただきます。Notebookの共有およびデータの共有などのコラボレーション機能について紹介します。、Kaggleには個人としてコンペに参加する方法とチームとしてコンペに参加する二つの参加の仕方があります。チームでの参加の際に、この応用編での知識が役立ってくれると思います。</p>
<h4>Notebookの共有</h4>
<p>こちらでは、一緒に作業したい友人やチームメンバーとのNotebookのシェアの仕方を紹介します。</p>
<p>まずは共有したいNotebookを開いていただいて、図９の「file」から「Share」を選択していただきます。</p>
<div id="attachment_2260" style="width: 188px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2260" loading="lazy" class="wp-image-2260" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_5.png" alt="" width="178" height="461" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_5.png 267w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_5-116x300.png 116w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_5-83x214.png 83w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_5-61x158.png 61w" sizes="(max-width: 178px) 100vw, 178px" /><p id="caption-attachment-2260" class="wp-caption-text">図９</p></div>
<p>図10の「Privacy」の部分を「Public」に変更すると、Kaggleを利用している全世界の人に対して公開してしまうので、チームとしてNotebookを共有しあう場合は基本的にチーム内だけでの共有になる「Private」を選択しましょう。</p>
<p>次に、シェアしたい友人などのKaggle内のユーザー名を入力し、選択します。そうすると、「Can view」か「Can edit」を選べるようになります。そして、もし共有相手にNotebookを見てもらうだけで、編集は許可しない場合は「Can view」（閲覧権限）。もし編集まで許可するのであれば「Can edit」（編集権限）を選択して下さい。それで、右下の「Save」をクリックすれば、共有完了です。</p>
<div id="attachment_2261" style="width: 544px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2261" loading="lazy" class="wp-image-2261 " src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_6.png" alt="" width="534" height="395" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_6.png 787w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_6-300x221.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_6-768x567.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_6-290x214.png 290w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_6-214x158.png 214w" sizes="(max-width: 534px) 100vw, 534px" /><p id="caption-attachment-2261" class="wp-caption-text">図10</p></div>
<h4>データの共有</h4>
<p>共同作業をする際に、お互いで学習済みモデルをシェアしたり、前処理済みのテーブルデータをシェアしたりなど、Notebookの共有と共に共同作業中にとても重要なものがデータセットのシェアです。ここではKaggle上でどうやってデータセットのシェアを行うかを紹介します。</p>
<p>Kaggle NotebookのEditorを終了し、Kaggleのトップページにもどってください。図１２にある左のDataをクリックし、その中の「YOUR DATASETS」をクリックします。</p>
<div id="attachment_2254" style="width: 691px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2254" loading="lazy" class="wp-image-2254 " src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_13.png" alt="" width="681" height="216" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_13.png 1435w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_13-300x95.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_13-768x244.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_13-1024x325.png 1024w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_13-304x97.png 304w" sizes="(max-width: 681px) 100vw, 681px" /><p id="caption-attachment-2254" class="wp-caption-text">図11</p></div>
<p>その次に共有したいデータを選択し、上の「Settings」のところで、「Add user」に共有したい相手を指定して、先ほどのように権限を指定して、「Save」をクリックすればシェアの完了です。</p>
<div id="attachment_2262" style="width: 673px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2262" loading="lazy" class="wp-image-2262 " src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_7.png" alt="" width="663" height="289" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_7.png 1427w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_7-300x131.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_7-768x335.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_7-1024x447.png 1024w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_7-304x133.png 304w" sizes="(max-width: 663px) 100vw, 663px" /><p id="caption-attachment-2262" class="wp-caption-text">図12</p></div>
<h3>とても便利な２つのオプション機能</h3>
<p>ここまで、Kaggle Notebookについての基本を紹介させていただきました。この項では、ショートカットキーとアクセラレータの使用方法の知っていると、とても便利な二つのオプション機能について紹介させていただきます。</p>
<h4>ショートカットキー</h4>
<p>このNotebookには数十個のショートカットキーが存在します。このショートカットを覚えれば、いちいちキーボードから手を離してマウスやタッチパッドに手をわざわざ移動させる必要がなくとても便利で時間の節約に役立ちます。</p>
<p>まず、ショートカットを覚える前に、覚えておかなければいけないことが一つあります。それは、Notebookのセルには「コマンドモード」と「編集モード」の二つの状態があることです。</p>
<h5>編集モード</h5>
<div id="attachment_2250" style="width: 1531px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2250" loading="lazy" class="wp-image-2250 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6.png" alt="" width="1521" height="123" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6.png 1521w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6-300x24.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6-768x62.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6-1024x83.png 1024w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_6-304x25.png 304w" sizes="(max-width: 1521px) 100vw, 1521px" /><p id="caption-attachment-2250" class="wp-caption-text">図13</p></div>
<p>セルの中に、タイピングの縦線が見えており、セルの中身が白い状態</p>
<p>この状態ではセルの中に文字を書いたり、文字に対して操作をしたいときに使う状態（セル内をクリックで編集モードに）</p>
<h5>コマンドモード</h5>
<div id="attachment_2251" style="width: 1527px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2251" loading="lazy" class="wp-image-2251 size-full" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_7.png" alt="" width="1517" height="98" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_7.png 1517w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_7-300x19.png 300w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_7-768x50.png 768w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_7-1024x66.png 1024w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_7-304x20.png 304w" sizes="(max-width: 1517px) 100vw, 1517px" /><p id="caption-attachment-2251" class="wp-caption-text">図14</p></div>
<p>セルの中身が灰色になっている状態。</p>
<p>この状態ではセル自体に何か操作をしたい時に使います。例えばセル自体を削除したり、追加したり。（セルの外をクリックすることでコマンドモードに）</p>
<h5>使う頻度の高いショートカットキー一覧</h5>
<p>ここで紹介するものは特に使用頻度の高い、セルを操作するキーです。セルを操作する際は常にコマンドモードにしてあることを確認しましょう。使用するOSはwindowsでの説明になりますが、macOSでのcommandがwindowsでのCtrlとほぼ同じ働きをするので、macOSの方も参考にしていただけます。</p>

<table id="tablepress-10" class="tablepress tablepress-id-10 tablepress-responsive">
<thead>
<tr class="row-1 odd">
	<th class="column-1">ショートカットキー</th><th class="column-2">働き</th>
</tr>
</thead>
<tbody class="row-hover">
<tr class="row-2 even">
	<td class="column-1">Ctrl + S</td><td class="column-2">保存および上書き保存</td>
</tr>
<tr class="row-3 odd">
	<td class="column-1">B</td><td class="column-2">指定セルの下にセルを挿入</td>
</tr>
<tr class="row-4 even">
	<td class="column-1">Y</td><td class="column-2">コードセルに変換</td>
</tr>
<tr class="row-5 odd">
	<td class="column-1">M</td><td class="column-2">マークダウンセルに変換</td>
</tr>
<tr class="row-6 even">
	<td class="column-1">C</td><td class="column-2">セルをコピー</td>
</tr>
<tr class="row-7 odd">
	<td class="column-1">X</td><td class="column-2">選択したセルをカット</td>
</tr>
<tr class="row-8 even">
	<td class="column-1">V</td><td class="column-2">カットやコピーしたものを貼り付け	</td>
</tr>
<tr class="row-9 odd">
	<td class="column-1">DD（D二回入力）</td><td class="column-2">選択したセルの削除</td>
</tr>
</tbody>
</table>
<!-- #tablepress-10 from cache -->
<h4>アクセラレータの使用</h4>
<div class="su-note"  style="border-color:#dadada;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:#f4f4f4;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">
注釈:アクセラレータを使用する際は、インターネット接続と同様に電話番号での本人認証が必要になりますので、アクセラレータを使用する際Kaggleで電話番号を登録しておきましょう。<br />
</div></div>
アクセラレータとは、GPUやTPUというものを使い、ディープラーニングの計算効率を上げてくれる便利なものです。その違いというのはどれくらいかというと、通常のKaggle Notebookではプログラムの計算にCPUしか使いません。しかし、GPUに同じ計算をさせると4-5倍は違うといわれています。さらに最近Googleが発表したTPUに関しては、ディープラーニング専用に開発されたものであるため、GPUより更に高速になると考えられています。</p>
<p>その機械学習においてとても優秀なアクセラレータの使い方は、先ほどデータを確認するために押していただいた右上の矢印をクリックします。次に、画像のように「Accelerator」の「None」をクリックするとGPUかTPUどちらを使うかを選ぶことができます。</p>
<div id="attachment_2263" style="width: 292px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2263" loading="lazy" class="wp-image-2263" src="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_8.png" alt="" width="282" height="519" srcset="https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_8.png 357w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_8-163x300.png 163w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_8-116x214.png 116w, https://www.codexa.net/wp-content/uploads/2020/06/kaggle_b_8-86x158.png 86w" sizes="(max-width: 282px) 100vw, 282px" /><p id="caption-attachment-2263" class="wp-caption-text">図16</p></div>
<p>このアクセラレータを使う際に注意点が３つだけあります。一つ目は、GPUおよびTPUはそれぞれ週に３０時間しかつかうことができません。二つ目はアクセラレータを起動すると、使えるメモリが通常１６GBから１３GBに３GBも減ってしまうことです。三つ目はアカウントを二つ以上作ることが禁止されているということです。アクセラレータの上限使用時間になってしまった場合、新しくアカウントを作りそちらでアクセラレータを使用すればいいと思うかもしれませんが、kaggleの公式がその行為は処罰の対象であるとし禁止しています。ですが、このアクセラレータは上手に使えるようになると、とても心強い味方になってくれるはずなので、ぜひ使ってみてください。</p>
<h3>まとめ</h3>
<p>本稿では、Kaggle Notebookを使い、機械学習モデル開発を始める方法を紹介しました。 紹介しました通り、Kaggle Notebookは機械学習初学者はもちろんのこと、初心者でない方にも使っていただけるNotebookですので、是非各々の使い方を模索して、機械学習モデル開発に 役立ててください。</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/kaggle-notebook-for-beginners/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>機械学習を使って630万件のレビューに基づいたアニメのレコメンド機能を作ってみよう（機械学習 k近傍法 初心者向け）</title>
		<link>https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/</link>
					<comments>https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/#respond</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Tue, 13 Mar 2018 01:54:49 +0000</pubDate>
				<category><![CDATA[Kaggle]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=1138</guid>

					<description><![CDATA[「この商品を購入したお客様はこちらも一緒にお買い上げいただいてます」「このビデオを見た方はこちらも見てます」。このようなオススメをされた経験はありませんか？これらは、「レコメンド機能（レコメンドエンジン）」と呼ばれるも [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>「この商品を購入したお客様はこちらも一緒にお買い上げいただいてます」「このビデオを見た方はこちらも見てます」。このようなオススメをされた経験はありませんか？これらは、「<strong>レコメンド機能（レコメンドエンジン）</strong>」と呼ばれるもので、近年ではインターネット上の様々なECやサービスで使われています。</p>
<p>レコメンド機能ですが、実にありとあらゆる業種で活用されています。</p>
<ul>
<li>商品（EC）</li>
<li>映画</li>
<li>音楽</li>
<li>ニュース</li>
<li>動画</li>
<li>&#8230;その他多数</li>
</ul>
<p>今回の機械学習初心者向けチュートリアルでは、<strong>k近傍法（K-nearest neighbor）というアルゴリズムを利用して、アニメのレコドメンド機能をPythonを使って一緒に構築</strong>してみましょう！</p>
<h3>レコメンド機能（エンジン）とは？</h3>
<p>まずは、このレコメンド機能とは何かについて一緒に紐解いていきましょう。レコメンド機能とは、データを活用して顧客やユーザーに「お勧め」を提供する情報フィルタリングシステムです。</p>
<p>冒頭でも触れましたが、顧客それぞれの興味や購入履歴に基づいている事から、それぞれの顧客の趣味嗜好に合わせたユーザー体験を提供することが可能な訳です。優秀なレコメンド機能は、ユーザー体験を改善することにより、多くの売上を生み出し、さらには顧客満足度を高めることに大いに役立ちます！</p>
<p>企業は、より優秀なレコメンド機能を構築するために、非常に多くのデータを集めています。集めたデータの量と質により、レコメンド機能の精度が上がることで、より大きな売上と高い顧客満足度へ直結するためです。</p>
<p>ちょっと想像して見てください。<strong>もしあなたに機械学習の師匠とも呼べる親しい先輩がいたとして、その先輩が機械学習入門書をお勧めしてくれたら、かなり高い確率でその書籍を購入することを検討しますよね？</strong></p>
<p>なぜなら、あなたは、その先輩の機械学習の知識を信頼している訳ですし、さらには、先輩があなたの機械学習の知識量を知っていることを分かっているため、<strong>自分にはその入門書が適切</strong>だと考える訳です。</p>
<p>このような「<strong>お勧めのプロセス</strong>」と似たような体験を、企業は「<strong>レコメンド機能</strong>」として提供している訳です。ただし、<strong>大きな違いとしては、個人的なつながりのある「先輩」の代わりを、膨大かつ多種多様なデータで代用</strong>しているのです。</p>
<p>「レコメンド機能」または、その機能の中核となる「レコメンドエンジン」は、多種多様なビジネスに大きな利益をもたらす重要な機能となっており、<strong>機械学習の技術が大きく活用されている分野</strong>です！</p>
<h3>レコメンドエンジンの2つの種類</h3>
<p>レコメンド機能の中核となるのが、レコメンドエンジンな訳ですが、大きく分類すると2つの種類があります。ここでは、この2種類のレコメンド機能の概要と、それぞれのメリット/デメリットを簡単に見ていきましょう。</p>
<div id="attachment_1141" style="width: 1034px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-1141" loading="lazy" class="wp-image-1141 size-large" src="https://www.codexa.net/wp-content/uploads/2018/03/types-of-engine-1024x627.png" alt="" width="1024" height="627" srcset="https://www.codexa.net/wp-content/uploads/2018/03/types-of-engine-1024x627.png 1024w, https://www.codexa.net/wp-content/uploads/2018/03/types-of-engine-300x184.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/types-of-engine-768x471.png 768w, https://www.codexa.net/wp-content/uploads/2018/03/types-of-engine-304x186.png 304w, https://www.codexa.net/wp-content/uploads/2018/03/types-of-engine-258x158.png 258w, https://www.codexa.net/wp-content/uploads/2018/03/types-of-engine.png 1064w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-1141" class="wp-caption-text">ソース:<a href="https://www.marutitech.com/wp-content/uploads/2017/05/Collaborative-Filtering-min.png">こちら</a></p></div>
<p>英語ではありますが、上記の図を見ながら考えてみましょう。レコメンドエンジンには「<strong>協調フィルタリング（Collaborative Filtering）</strong>」と「<strong>コンテンツに基づくフィルタリング（Content-Based Filtering）</strong>」の2種類があります。</p>
<h4>協調フィルタリングとは？</h4>
<p>協調フィルタリングとは、<strong>コミュニティー全体を基にしたレコメンドシステムで、あなたの趣味嗜好や興味が、反映される形のレコメンドエンジン</strong>となります。協調フィルタリングは、<strong>あなたの趣味嗜好と類似しているユーザーを探し出して、そのユーザー達の嗜好に基づいて、オススメを行います</strong>。</p>
<p>AmazonなどのECサイトの多数では、ユーザーの事細かな情報を持っていますよね。例えば年齢や、住所、商品の購入履歴からレビューなどなど。協調フィルタリングでは、このような各ユーザーの行動（データ）に基づいて、類似したデータを用いることでオススメが可能なわけです。</p>
<p>もっと簡単に言えば、例えばあなたが犬の首輪を購入して、次にトイレットペーパーを購入したとします。この2つの商品を購入したユーザーの情報を分析したところ、「USBメモリ」の購入の確率が高いことが判明したので、あなたにUSBメモリの購入をオススメする流れが「協調フィルタリング」です。（あくまで例です笑）</p>
<p>上記の例を見ても分かる通り、非常に強力なレコメンドエンジンだと思われますが、実は弱点もあります。協調フィルタリングの主な弱点としては、「<strong>新しいユーザー</strong>」に弱いことです。これは、上の具体例を考えてみると分かりやすいですが、ユーザーへオススメするためのデータが不足しているので、オススメが出来ない（または極端に精度が悪い）わけです。</p>
<p><strong>今回の記事では、この「協調フィルタリング」の仕組みを利用したレコメンド機能を構築します。</strong></p>
<h4>コンテンツに基づくフィルタリングとは？</h4>
<p>では、もう一方のレコメンド機能も軽く見てみましょう。先の協調フィルタリングでは、「<strong>コミュニティ全体の動きに基づいて</strong>」オススメを行いましたが、こちらは「<strong>あなたの履歴と類似性に基づいて</strong>」推薦をしてくれます。</p>
<p>具体的な例で考えてみましょう。例えば、本屋さんのアンケートで「SF」が好きだと答えたとしましょう。そうすると、当然ですが、この書店から届くオススメは「SF」または「SFに類似したカテゴリ」の書籍となる訳ですよね。</p>
<p>このコンテンツに基づくフィルタリングでは、ユーザーが「SF」が好きだと言っているのに、いきなり「料理のレシピ本」のオススメはしない訳です。</p>
<p>このように、このシステムでは以前に好きだった（または購入した）アイテムの特性をみて、それらに似たアイテムを推薦してくれます。例えばECで機械学習の本を購入して高い評価を残したら、そのあとに、そのサイトからオススメされる書籍が機械学習関連になりますよね。</p>
<p>まとめると、「<strong>協調フィルタリング＝類似したユーザーに基づいて推薦</strong>」で、「<strong>コンテンツに基づくフィルタリング＝あなたの履歴に基づいて類似性のある商品を推薦</strong>」となります。参考までにですが、この2つのレコメンドエンジンを合体させた「<strong>ハイブリッド</strong>」を利用しているケースもあります。</p>
<h3>企業におけるレコメンド機能の実例</h3>
<p>次は、実際に企業で使われているレコメンド機能の実例について紹介させていただきます。冒頭でも触れた通り、レコメンド機能は、売上や顧客満足に密接に関わることから、多くの企業で使われています。</p>
<p>ここで紹介するのはごく一部ですが、特に優れているレコメンドエンジンの実例として見ていきましょう。</p>
<h4>【実例1】アマゾン</h4>
<p>レコメンド機能の先駆者とも言われるアマゾンですが、サイト内の様々な箇所でレコメンド機能がフル活用されています。下の図ですが、アマゾンで「<strong>深層学習</strong>」の書籍の詳細ページに表示されているものです。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-1143" src="https://www.codexa.net/wp-content/uploads/2018/03/amazon-recommend-1024x649.png" alt="" width="1024" height="649" srcset="https://www.codexa.net/wp-content/uploads/2018/03/amazon-recommend-1024x649.png 1024w, https://www.codexa.net/wp-content/uploads/2018/03/amazon-recommend-300x190.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/amazon-recommend-768x487.png 768w, https://www.codexa.net/wp-content/uploads/2018/03/amazon-recommend-304x193.png 304w, https://www.codexa.net/wp-content/uploads/2018/03/amazon-recommend-249x158.png 249w, https://www.codexa.net/wp-content/uploads/2018/03/amazon-recommend.png 1104w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>赤枠で囲っている部分がレコメンド機能で表示されている項目です。図を見れば一目で分かりますが、他のユーザーの購入履歴を基に、この「深層学習」の本と一緒に購入されている書籍をセットでオススメしてくれますし、さらには自身の購入履歴に基づいて、私が購入しそうな商品をオススメしてくれます。</p>
<p>このように、機械学習とユーザー購買履歴データを活用することで、非常にパワフルなツールとなります。一昔前までは、多くのサービスで、単純に「プログラミング」のカテゴリに該当する書籍を推薦していましたが、機械学習を活用することにより、より的確なオススメが可能になる訳です。</p>
<h4>【実例2】ネットフリックス</h4>
<p>Netflix（ネットフリックス）もレコメンド機能を活用している企業として、頻繁に引き合いに出されます。利用されている方も多いと思いますが、ネットフリックスとは、テレビ番組や映画などをインターネットで視聴できる動画サービスです。</p>
<p>ユーザーがNetflixへログインをすると、<strong>トップページで表示される動画は各ユーザーごとに異なります</strong>。これは、そのユーザーの視聴履歴、さらに、ユーザー全体のトレンドやあなたとの類似性などに基づいて「<strong>オススメの番組/動画</strong>」が随時表示される訳です。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-1144" src="https://www.codexa.net/wp-content/uploads/2018/03/Your-Guide-To-Using-Netflix-Japan-15-1024x415.jpg" alt="" width="1024" height="415" srcset="https://www.codexa.net/wp-content/uploads/2018/03/Your-Guide-To-Using-Netflix-Japan-15-1024x415.jpg 1024w, https://www.codexa.net/wp-content/uploads/2018/03/Your-Guide-To-Using-Netflix-Japan-15-300x122.jpg 300w, https://www.codexa.net/wp-content/uploads/2018/03/Your-Guide-To-Using-Netflix-Japan-15-768x312.jpg 768w, https://www.codexa.net/wp-content/uploads/2018/03/Your-Guide-To-Using-Netflix-Japan-15-304x123.jpg 304w, https://www.codexa.net/wp-content/uploads/2018/03/Your-Guide-To-Using-Netflix-Japan-15.jpg 1358w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>米Netflixでは機械学習エンジニアお馴染みの「<a href="https://www.kaggle.com/">Kaggle</a>（カグル）」で100万ドル（約1億円）の賞金をかけて、この<strong>協調フィルタリング（レコメンド機能）の精度を競うコンペ</strong>を開催したこともあります。Netflixは、480,189ユーザーの17,770個の映画における、1億個のレビューをデータセットとして公開して、彼らが利用しているレコメンドエンジンの精度を10%向上することを目的としてコンペを実施していました。（参考：<a href="https://www.codexa.net/what-is-kaggle/" target="_blank" rel="noopener">Kaggleとは</a>）</p>
<p>Netflixにとって、<strong>レコメンド機能が10%向上することは、賞金の約1億円よりも価値が高い</strong>と考えている訳です。レコメンド機能がビジネスに対して大きな成果をもたらしている証拠かと思います。</p>
<h4>【実例 3】YouTube</h4>
<p>レコメンド機能の実例の3つ目はYouTubeの活用事例を紹介します。YouTubeを見ていると、「<strong>関連する動画</strong>」として、様々な動画を紹介してくれますよね？これも機械学習をフル活用した、最先端のレコメンド機能の良い事例です。</p>
<p>おそらくYouTubeを利用されているほとんどの方が、この「<strong>関連動画</strong>」の機能を使ったことがあるかと思います。今見ている動画に関連した動画はもちろん、例えば何かしらのシリーズであれば、その続編であったり、テイストが似たような動画だったりと、非常に便利な機能ですよね。</p>
<p>また、ユーザー個別にカスタマイズされているのも非常に実感できます。例えば、友達や知り合いのPCでYouTubeをブラジングすると気づくのですが、普段は自分用にカスタマイズされた「関連動画」ですが、他のPCだといつもと使い勝手が違うと感じるはずです。<img loading="lazy" class="aligncenter size-full wp-image-1145" src="https://www.codexa.net/wp-content/uploads/2018/03/youtube-logo.jpg" alt="" width="250" height="176" srcset="https://www.codexa.net/wp-content/uploads/2018/03/youtube-logo.jpg 250w, https://www.codexa.net/wp-content/uploads/2018/03/youtube-logo-224x158.jpg 224w" sizes="(max-width: 250px) 100vw, 250px" /></p>
<p>ここで紹介したレコメンド機能はごく一部ですが、<strong>レコメンド機能と機械学習がビジネスにとってどれほど重要な役割を果たしてるか</strong>が、お判り頂けたかと思います。</p>
<p>では、実際にこのレコメンド機能をKaggleのデータセットを利用して構築して見ましょう！</p>
<h3>データセットのについて（アニメお勧めデータベース）</h3>
<p>まずは、本チュートリアルで利用するデータセットについて説明します。今回ですが、「Anime Recommendations Database（アニメお勧めデータベース）」という、myanimelist.netの76,000ユーザーのアニメのレビューデータを利用します。参考までにですが、このデータ元の「<strong>myanimelist.net</strong>」は、海外で有名なアニメのサイトで最新から古いタイトルまで非常に幅広いアニメのデータベースを取り揃えています。</p>
<p>このデータセットですが「<span class="su-label su-label-type-info">anime.csv</span>」と「<span class="su-label su-label-type-info">ratings.csv</span>」の2つのCSVファイルにより構成されています。2つのCSVファイルの概要は下記の通りです。</p>
<h4>anime.csv 概要</h4>
<ul>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;anime_id&nbsp;</span> 各アニメのユニークID</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;name&nbsp;</span> アニメタイトル</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;genre&nbsp;</span> アニメの属するカテゴリ</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;type&nbsp;</span> メディアタイプ（例：映画、テレビetc）</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;episodes&nbsp;</span> アニメのエピソード数</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;rating&nbsp;</span> 最大10の平均レーティング</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;members&nbsp;</span> 当該アニメのグループに参加するユーザー数</li>
</ul>
<h4>ratings.csv 概要</h4>
<ul>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;user_id&nbsp;</span> ユニークユーザーID</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;anime_id&nbsp;</span> 当該ユーザーがレートしたアニメID</li>
<li><span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;rating&nbsp;</span> 当該ユーザーのレーティング</li>
</ul>
<p>この2つのCSVファイルを利用してレコメンド機能を構築しましょう。このデータセットですが、おそらくアニメ関連で公開されているデータセットで一番規模が大きいものかと思います。</p>
<p>データの入手方法ですが、下記のKaggleページより<strong>会員登録後にダウロードが可能</strong>です。下記のリンクから、「<span class="su-label su-label-type-info">rating.csv</span>」と「<span class="su-label su-label-type-info">anime.csv</span>」のダウロードを行いましょう。</p>
<p><a href="https://www.kaggle.com/CooperUnion/anime-recommendations-database">アニメデータのダウンロード（Kaggle &#8211; 英語）</a></p>
<h3>Pythonでレコメンド機能を構築してみよう</h3>
<p><strong>ここからは実際にPythonを使って、k近傍方（k-nearest neighbor）のアルゴリズムを使用して、基本的な「協調フィルタリング」のレコメンドエンジンを構築</strong>しましょう！</p>
<p>本チュートリアルですが<strong>Python3.6と複数のオープンソースライブラリを使用</strong>しています。ライブラリに関しては、よほど古いバージョンでなければ、特に問題ないと思いますが、Pythonは2.xをお使いの方はPython 3.xを使用してください。</p>
<h4>必要なライブラリのインポート</h4>
<p>まずはお決まりですが、使うライブラリののインポートから行いましょう。ご自身の環境にこれらのライブラリがインストールされていない場合は、インストールが必要です。</p>
<p>環境の構築が面倒い方は、Amazon SageMaker（アマゾン・セージメーカー）もオススメです。SageMakerですが、アマゾンのクラウドで機械学習に必要なライブラリのほぼ全てがインストールされており、簡単に機械学習を始めることが可能です。（詳しくは<a href="https://www.codexa.net/aws-sagemaker-announcement/" target="_blank" rel="noopener">SageMakerのこちらの記事</a>をご参照ください）</p><pre class="crayon-plain-tag"># 使用するライブラリのインポート
import pandas as pd
import numpy as np 
from scipy.sparse import csr_matrix
from sklearn.neighbors import NearestNeighbors</pre><p>
次に、早速、CSVファイルをPandasのデータフレーム形式で読み込んであげましょう。CSVファイルですが<a href="https://www.kaggle.com/CooperUnion/anime-recommendations-database">Kaggleのこちらのページ</a>からダウロードが可能です。また、ファイルを保存した先が異なる場合は、下記のコードでファイルパスも指定してあげましょう。</p><pre class="crayon-plain-tag"># CSVファイルをデータフレーム形式として読み込み
# 保存先が異なる場合はパスも指定してあげましょう

ratings = pd.read_csv('rating.csv')
anime = pd.read_csv('anime.csv')</pre><p>
本チュートリアルで使用するNumpyなどのライブラリですが、機械学習では頻繁に使用されるツールです。今回、初めて使用される方は、下記の無料入門コースがオススメです！</p>
<ul>
<li><a href="https://www.codexa.net/numpy/" target="_blank" rel="noopener">Numpy 使い方 入門</a></li>
<li><a href="https://www.codexa.net/pandas/" target="_blank" rel="noopener">Pandas 使い方 入門</a></li>
<li><a href="https://www.codexa.net/matplotlib/" target="_blank" rel="noopener">Matplotlib 使い方入門</a></li>
</ul>
<h4>データを確認して見ましょう</h4>
<p>データの読み込みが完了したので、次はデータの探索をしてみましょう。機械学習では、初めて触るデータはざっくりといじってみて、どのようなデータなのかを把握する作業が一般的です。（詳しくは「<a href="https://www.codexa.net/basic-exploratory-data-analysis-with-python/" target="_blank" rel="noopener">探索的データ解析（EDA）</a>」の記事をご覧ください）</p>
<p>まずは、おきまりの<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;head()&nbsp;</span>でデータの最初の5行を表示してみましょう。</p><pre class="crayon-plain-tag"># ratingのデータフレームの最初の5行を表示
ratings.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1146" src="https://www.codexa.net/wp-content/uploads/2018/03/rating_head.png" alt="" width="194" height="164" srcset="https://www.codexa.net/wp-content/uploads/2018/03/rating_head.png 194w, https://www.codexa.net/wp-content/uploads/2018/03/rating_head-187x158.png 187w" sizes="(max-width: 194px) 100vw, 194px" /></p><pre class="crayon-plain-tag"># animeデータフレームの最初の五行を表示
anime.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1147" src="https://www.codexa.net/wp-content/uploads/2018/03/anime_head.png" alt="" width="812" height="174" srcset="https://www.codexa.net/wp-content/uploads/2018/03/anime_head.png 812w, https://www.codexa.net/wp-content/uploads/2018/03/anime_head-300x64.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/anime_head-768x165.png 768w, https://www.codexa.net/wp-content/uploads/2018/03/anime_head-304x65.png 304w" sizes="(max-width: 812px) 100vw, 812px" /></p>
<p>次に、この<span class="su-label su-label-type-info">anime</span>のデータフレームの<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;members&nbsp;</span>の値で並び替えをしてみましょう。この<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;members&nbsp;</span>の値ですが、各アニメの購読メンバー数となていますので、並び替えをすることにより、このデータセット内にあるアニメの中の人気順が把握できるかと思います。</p><pre class="crayon-plain-tag"># animeのデータフレームをmemberの値で並び替え
anime.sort_values('members', ascending= False)[:10]</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1148" src="https://www.codexa.net/wp-content/uploads/2018/03/anime_sorted.png" alt="" width="829" height="309" srcset="https://www.codexa.net/wp-content/uploads/2018/03/anime_sorted.png 829w, https://www.codexa.net/wp-content/uploads/2018/03/anime_sorted-300x112.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/anime_sorted-768x286.png 768w, https://www.codexa.net/wp-content/uploads/2018/03/anime_sorted-304x113.png 304w" sizes="(max-width: 829px) 100vw, 829px" /></p>
<p>タイトルが英語名なので少し見辛いですが、どうやらこのデータセットで最も購読メンバー数が高いのは「<strong>デス・ノート</strong>」のようです。2位に「<strong>進撃の巨人</strong>」、「<strong>ソードアート・オンライン</strong>」や「<strong>鋼の錬金術師</strong>」なども上位ですね。</p>
<p>次に<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;describe()&nbsp;</span>の関数を使って、基本統計量を確認してみましょう。</p><pre class="crayon-plain-tag"># animeの基本統計量の確認
round(anime.describe(),2)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1149" src="https://www.codexa.net/wp-content/uploads/2018/03/describe_anime.png" alt="" width="267" height="258" srcset="https://www.codexa.net/wp-content/uploads/2018/03/describe_anime.png 267w, https://www.codexa.net/wp-content/uploads/2018/03/describe_anime-221x214.png 221w, https://www.codexa.net/wp-content/uploads/2018/03/describe_anime-164x158.png 164w" sizes="(max-width: 267px) 100vw, 267px" /></p>
<p>上の図の基本統計量のテーブルを見てみると、このデータの特性が見えてくるかと思います。例えば、<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;members&nbsp;</span>の列を見て頂きたいのですが、こちらはmin（最小値）が5.0、max（最大値）が1013917となっています。最小値と最大値のレンジとしては、かなり大きく離れていますね。</p>
<p>また、このデータセット内のアニメの25%が225名以下の購読者数に対して、上位25%は9000名以上の購読者数がいます。人気のアニメとそうでないアニメの差が激しいのも確認できます。</p>
<p>次は同様に<span class="su-label su-label-type-info">ratings</span>のデータフレームの基本統計量も確認してみましょう。</p><pre class="crayon-plain-tag"># ratingsの基本統計量の確認
round(ratings.describe(),2)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1150" src="https://www.codexa.net/wp-content/uploads/2018/03/rating_describe.png" alt="" width="290" height="254" srcset="https://www.codexa.net/wp-content/uploads/2018/03/rating_describe.png 290w, https://www.codexa.net/wp-content/uploads/2018/03/rating_describe-244x214.png 244w, https://www.codexa.net/wp-content/uploads/2018/03/rating_describe-180x158.png 180w" sizes="(max-width: 290px) 100vw, 290px" /></p>
<p>上記の基本統計量のテーブルをみて、一つ特異なデータがあるのがわかります。<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;rating&nbsp;</span>のカラムのmin（最小値）が<strong>-1</strong>とあります。レーティングですが、これはユーザーが各アニメにつけた評価ですよね？最小値の値が「<strong>-1</strong>」というのはデータとして特異なのが解るかと思います。</p>
<p>データセットの説明文を読んでみると、この「<strong>-1</strong>」ですが、「<strong>アニメを観たことがあるが、レーティング（評価）を付与しなかった</strong>」という意味とのことです。このように、データには様々な癖のようなものがあり、それらを最初の段階で把握するのは機械学習において非常に重要な作業です。</p>
<p>次は、このユーザーレーティング（アニメの評価値）のデータ分散を可視化して確認してみましょう。下記コードで、ratingのヒストグラムの生成を行います。（ヒストグラムなどの統計の基本知識が不安な方は、<a href="https://www.codexa.net/statistics-for-machine-learning-first/" target="_blank" rel="noopener">統計入門コース</a>をご参考ください）</p><pre class="crayon-plain-tag"># ratingsのヒストグラムを作成
ratings['rating'].hist(bins=11, figsize=(10,10), color = 'red')</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1151" src="https://www.codexa.net/wp-content/uploads/2018/03/distribution.png" alt="" width="626" height="578" srcset="https://www.codexa.net/wp-content/uploads/2018/03/distribution.png 626w, https://www.codexa.net/wp-content/uploads/2018/03/distribution-300x277.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/distribution-232x214.png 232w, https://www.codexa.net/wp-content/uploads/2018/03/distribution-171x158.png 171w" sizes="(max-width: 626px) 100vw, 626px" /></p>
<p>レーティングのヒストグラムを確認してみると、「<strong>-1</strong>」（見たけどレーティングなし）と「<strong>7以上</strong>」の値がデータのほとんどを占めているのが分かりますね。このように可視化をすることで、データの特性がより素早く確認することが可能です。</p>
<h3>データの前処理をしよう</h3>
<p>さて、データの一通りの確認ができたら、次はデータの前処理を行います。<strong>データの前処理とは、機械学習で利用する前にデータの処理を行うことで、機械が学習をスムーズに行えるようにする為の作業</strong>です。</p>
<p>まずはじめに、これから構築するレコメンドエンジンの質を向上する為、<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;members&nbsp;</span>（当該のアニメのグループに所属しているユーザー数）が<strong>10,000以下のデータを足切り</strong>をしましょう。足切りすることにより、これから構築するレコメンド機能が、<strong>メンバー数が少ないアニメ（つまり比較的人気の低いアニメ）をオススメしないよう</strong>になります。</p>
<p>＊参考までにですが、今回は10,000という値を閾値（いきち）として選びましたが、この値は適当に決めた値であり、本来であれば、より詳細を確認しながら設定するものです。</p><pre class="crayon-plain-tag"># membersの値が10,000より大きいデータのみに変更
anime = anime[anime['members'] &gt; 10000]</pre><p>
次は、こちらも機械学習で定番の作業ですが、欠損値の処理を行いましょう。実際のプロジェクトなどで使うデータセットですが、<strong>殆どの場合でデータが「欠損（つまり欠けている）」</strong>います。完璧に全てのデータが揃っている方が珍しいくらいです。実際に機械学習のアルゴリズムを使ってモデルを構築する前に、この欠損したデータは何かしらの処理をしなくてはいけません。</p><pre class="crayon-plain-tag"># 欠損データの確認
anime.isnull().sum()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1152" src="https://www.codexa.net/wp-content/uploads/2018/03/isnull_sum.png" alt="" width="147" height="145" /></p>
<p>今回のアニメのデータセットでも、非常に少ない割合ではありますが欠損が確認できます。欠損データの扱いですが、こちらも様々な処理方法がありますが、今回は一番単純な方法・・・<strong>削除</strong>をしましょう。</p><pre class="crayon-plain-tag"># 欠損データをdropna()でデータセットから取り除く
anime = anime.dropna()</pre><p>
必要最低限ではありますが、これで<span class="su-label su-label-type-info">anime</span>のデータのクリーニングが出来ましたので、次は<span class="su-label su-label-type-info">rating</span>のデータにも簡単な前処理を加えてあげましょう。</p>
<p>先のデータ確認の項目でやりましたが、<span class="su-label su-label-type-info">ratings</span>のデータには「<strong>-1（見たけど評価しなかった）</strong>」が含まれています。まずは、この「-1」のデータを取り除きましょう。</p><pre class="crayon-plain-tag"># raitingの値が0以上のみ残す
ratings = ratings[ratings.rating &gt;= 0]</pre><p>
念のため、改めて<span class="su-label su-label-type-info">ratings</span>の基本統計量を確認しておきましょう。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-1153" src="https://www.codexa.net/wp-content/uploads/2018/03/cleaned_ratings.png" alt="" width="291" height="253" srcset="https://www.codexa.net/wp-content/uploads/2018/03/cleaned_ratings.png 291w, https://www.codexa.net/wp-content/uploads/2018/03/cleaned_ratings-246x214.png 246w, https://www.codexa.net/wp-content/uploads/2018/03/cleaned_ratings-182x158.png 182w" sizes="(max-width: 291px) 100vw, 291px" /></p>
<p>ご覧の通り先ほどはレーティングの最小値（min）が-1とありましたが、データの前処理を行いましたので「1」へと変わっているのが確認できます。不要なデータを取り除きましたが、まだ<strong>6,337,241件のレーティングと非常に膨大なデータ</strong>が残っていますね！</p>
<p>次に<span class="su-label su-label-type-info">anime</span>と<span class="su-label su-label-type-info">ratings</span>のデータを「<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;anime_id&nbsp;</span>」を軸にして、「user_id」毎に切り分けてマージさせましょう。</p><pre class="crayon-plain-tag"># animeとratingsの2つのデータフレームをマージさせる
mergeddf = ratings.merge(anime, left_on = 'anime_id', right_on = 'anime_id', suffixes= ['_user', ''])

# 合体したデータフレームの最初の5行を表示
mergeddf.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1154" src="https://www.codexa.net/wp-content/uploads/2018/03/meargeddf_head.png" alt="" width="811" height="170" srcset="https://www.codexa.net/wp-content/uploads/2018/03/meargeddf_head.png 811w, https://www.codexa.net/wp-content/uploads/2018/03/meargeddf_head-300x63.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/meargeddf_head-768x161.png 768w, https://www.codexa.net/wp-content/uploads/2018/03/meargeddf_head-304x64.png 304w" sizes="(max-width: 811px) 100vw, 811px" /></p>
<p>これで、2つの異なるデータフレームが、ユーザーIDごとに切り分けられた一つのデータフレームとしてマージ（合体）しました。（参照：pandasの<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;merge()&nbsp;</span>は非常に重要な処理です。<a href="https://www.codexa.net/pandas/" target="_blank" rel="noopener">詳しくはPandas入門コースをご参照ください</a>）</p>
<p>参考までに、このマージさせたデータフレームの基本統計量も確認しておきましょう。</p><pre class="crayon-plain-tag"># mergeddfの基本統計量の確認
round(mergeddf.describe(),2)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1155" src="https://www.codexa.net/wp-content/uploads/2018/03/mergeddf_desc.png" alt="" width="464" height="249" srcset="https://www.codexa.net/wp-content/uploads/2018/03/mergeddf_desc.png 464w, https://www.codexa.net/wp-content/uploads/2018/03/mergeddf_desc-300x161.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/mergeddf_desc-304x163.png 304w, https://www.codexa.net/wp-content/uploads/2018/03/mergeddf_desc-294x158.png 294w" sizes="(max-width: 464px) 100vw, 464px" /></p>
<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;count&nbsp;</span>（データの個数）も揃ってますし、特に問題なさそうですね！</p>
<p>さて、ここまでいじってきたデータセットですが、今回のレコメンド機能に使うデータは「<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;user_id&nbsp;</span>」「<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;name&nbsp;</span>」「<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;rating_user&nbsp;</span>」の3項目のみです。データの前処理の最後の項目として、<strong>使わないデータ項目の削除と重複データのカットを行いましょう。</strong></p><pre class="crayon-plain-tag"># 不必要な項目と重複項目を削除
mergeddf = mergeddf[['user_id','name','rating_user']]
mergeddf = mergeddf.drop_duplicates(['user_id','name'])

# head()で最初の5行を表示
mergeddf.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1156" src="https://www.codexa.net/wp-content/uploads/2018/03/head_fin.png" alt="" width="315" height="173" srcset="https://www.codexa.net/wp-content/uploads/2018/03/head_fin.png 315w, https://www.codexa.net/wp-content/uploads/2018/03/head_fin-300x165.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/head_fin-304x167.png 304w, https://www.codexa.net/wp-content/uploads/2018/03/head_fin-288x158.png 288w" sizes="(max-width: 315px) 100vw, 315px" /></p>
<p>さて、次の処理ですが、<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;name&nbsp;</span>（アニメのタイトル名）がデータフレームのインデックスに、<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;user_id&nbsp;</span>をカラムとして、ピボットさせましょう。文字で見ると、いまいち分かりにくいかも知れませんが、実際にデータフレームを処理して見てみると分かるかと思います。</p>
<p>またピボットの処理と併せて、ユーザーが評価していないアニメに関しては <span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;fillna(0)&nbsp;</span>で「<strong>0</strong>」の値を入れてあげましょう。</p><pre class="crayon-plain-tag"># データフレームのピボット
anime_pivot = mergeddf.pivot(index= 'name',columns='user_id',values='rating_user').fillna(0)
anime_pivot_sparse = csr_matrix(anime_pivot.values)</pre><p>
こちらのピボットの処理ですが、アニメのタイトル名（name）をデータフレームのインデックスとして、各カラムがユーザーを表しています。当該のユーザーがレーティングをして入れば、数字が入っており、レーティングがないアニメに関しては「0」と値が入っています。簡単なイラストで表すと下記のような図です。</p>
<p>参考までにですが、このようにほとんどのデータの値が「0」となるような行列を「<strong>疎行列（そぎょうれつ &#8211; Sparse martrix）」</strong>と呼びます。</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-1158" src="https://www.codexa.net/wp-content/uploads/2018/03/SparseMatrix-1024x341.png" alt="" width="1024" height="341" srcset="https://www.codexa.net/wp-content/uploads/2018/03/SparseMatrix-1024x341.png 1024w, https://www.codexa.net/wp-content/uploads/2018/03/SparseMatrix-300x100.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/SparseMatrix-768x256.png 768w, https://www.codexa.net/wp-content/uploads/2018/03/SparseMatrix-304x101.png 304w, https://www.codexa.net/wp-content/uploads/2018/03/SparseMatrix.png 1512w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>では、実際にピボット処理を行ったこの疎行列の最初の10行を表示させて見ましょう。</p><pre class="crayon-plain-tag"># anime_pivotの最初の10行を表示
anime_pivot.head(10)</pre><p>
<img loading="lazy" class="aligncenter size-large wp-image-1159" src="https://www.codexa.net/wp-content/uploads/2018/03/sparse_matrix_head-1024x289.png" alt="" width="1024" height="289" srcset="https://www.codexa.net/wp-content/uploads/2018/03/sparse_matrix_head-1024x289.png 1024w, https://www.codexa.net/wp-content/uploads/2018/03/sparse_matrix_head-300x85.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/sparse_matrix_head-768x217.png 768w, https://www.codexa.net/wp-content/uploads/2018/03/sparse_matrix_head-304x86.png 304w, https://www.codexa.net/wp-content/uploads/2018/03/sparse_matrix_head.png 1191w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>先ほど説明した通り、データフレームのindex（上記表でいう一番左の部分）がアニメのタイトルになっており、各列がユーザーのIDを表しているのが分かります。</p>
<h3>k近傍法（k-nearest neighbors）でレコメンド機能を構築</h3>
<p>さて、いよいよ本題のレコメンド機能の構築です！今回構築するレコメンド機能ですが、<strong>k近傍法</strong>（ケイ・きんぼうほう）というアルゴリズムを利用してモデルを構築します。k近傍法ですが英語の「k-nearest neighbor（ケイ・ニアレスト・ネイバー）」またはその頭文字を取って「<strong>KNN</strong>」と呼ばれることも多いので、覚えておくと便利かと思います。</p>
<p>では、このk近傍法とは一体どのようなアルゴリズムなんでしょうか？</p>
<p>k近傍法ですが最も単純なアルゴリズムと呼ばれており、<strong>クラスタリングのアルゴリズムの一種で、一般的に分類問題などで利用されます</strong>。今回のチュートリアルの例で考えると、とあるアニメのタイトルを入力した際に、そのアニメのneighbors（ご近所さん）を探して、距離が近い（類似性が高い）アニメのタイトルをオススメとして返してくれます。</p>
<p>かなりざっくりとした説明ですが、より詳しくk近傍法について調べて見たい方は、<a href="http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_ml/py_knn/py_knn_understanding/py_knn_understanding.html">こちらのページ</a>をご参照ください。</p>
<p>では、実際にこのk近傍法のアルゴリズムと事前に処理したデータセットを使ってモデルを構築してみましょう！今回ですが、初心者向けのチュートリアルですので、Pythonの機械学習ライブラリ「<strong>Scikit-learn（またはSklearnとも呼ばれる）</strong>」を利用しましょう。</p><pre class="crayon-plain-tag"># Scikit-learnのライブラリを利用します
# n_neiborsやalgorithm、metricなど重要なアーギュメントを設定しています
knn = NearestNeighbors(n_neighbors=9,algorithm= 'brute', metric= 'cosine')

# 前処理したデータセットでモデルを訓練
model_knn = knn.fit(anime_pivot_sparse)</pre><p>
これで、モデルの構築と前処理したデータセットでの訓練が完了です！ライブラリを使うと、想像以上に簡単ですよね？では、いよいよ、この構築したアニメのレコメンド機能の実力を試してみましょう！</p>
<h3>構築したレコメンド機能を試してみる</h3>
<p>まず最初に、今回のデータセットですが全てアニメタイトルが英名で記載されており、探すのに一苦労しますので、簡単な検索機能を作ってあげましょう。試しに「hajime」で検索してみます。</p><pre class="crayon-plain-tag"># データセットのタイトルをキーワードで検索
def searchanime(string):
    print(anime_pivot[anime_pivot.index.str.contains(string)].index[0:])
    
searchanime('Hajime')</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1160" src="https://www.codexa.net/wp-content/uploads/2018/03/search_func.png" alt="" width="625" height="212" srcset="https://www.codexa.net/wp-content/uploads/2018/03/search_func.png 625w, https://www.codexa.net/wp-content/uploads/2018/03/search_func-300x102.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/search_func-304x103.png 304w" sizes="(max-width: 625px) 100vw, 625px" /></p>
<p>タイトルに「hajime」を含むアニメの一覧が戻ってきましたね。<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;searchanime(&#8221;)&nbsp;</span>にキーワードを入力すると、そのワードを含むアニメタイトルが戻ってきます。ご自身で色々なアニメで確認される際は、是非こちらの機能を使ってみてください。（文字ですが大文字小文字のケースセンシティブなのでご注意を）</p>
<p>では、いよいよ構築したレコメンド機能の実力を試してみましょう！<strong>アニメタイトルを入力すると、モデルは10個のオススメのアニメタイトルを返してくれる</strong>はずです。</p>
<p>まずは…私が個人的に好きな「<strong>はじめの一歩</strong>（Hajime no Ippo）」からみてみましょう！</p><pre class="crayon-plain-tag"># 「はじめの一歩」に対してのオススメのアニメ10個
Anime = 'Hajime no Ippo'

distance, indice = model_knn.kneighbors(anime_pivot.iloc[anime_pivot.index== Anime].values.reshape(1,-1),n_neighbors=11)
for i in range(0, len(distance.flatten())):
    if  i == 0:
        print('Recommendations if you like the anime {0}:\n'.format(anime_pivot[anime_pivot.index== Anime].index[0]))
    else:
        print('{0}: {1} with distance: {2}'.format(i,anime_pivot.index[indice.flatten()[i]],distance.flatten()[i]))</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1161" src="https://www.codexa.net/wp-content/uploads/2018/03/res_1.png" alt="" width="582" height="209" srcset="https://www.codexa.net/wp-content/uploads/2018/03/res_1.png 582w, https://www.codexa.net/wp-content/uploads/2018/03/res_1-300x108.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/res_1-304x109.png 304w" sizes="(max-width: 582px) 100vw, 582px" /></p>
<p>う〜ん…ある意味正しいといえば正しいのですが、「はじめの一歩」と入力したら<strong>上位5位は全て「はじめの一歩」のシリーズがオススメとして返ってきています。</strong>結果としては少し面白みにかけましたが、「はじめの一歩」が好きな人にオススメするタイトルとしては、ある意味一番正しい答えのようにも感じます。</p>
<p>ちなみに、<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;distance&nbsp;</span>とありますが、こちらの数値が低ければ低いほど、類似性が高い、つまりオススメ度が高いことを表しています。</p>
<p>では次は…個人的に大絶賛のアニメ「<strong>君の名は</strong>」で調べてみましょう！</p><pre class="crayon-plain-tag"># 「君の名は」を見たことがあるあなたにオススメのアニメは・・・
Anime = 'Kimi no Na wa.'

distance, indice = model_knn.kneighbors(anime_pivot.iloc[anime_pivot.index== Anime].values.reshape(1,-1),n_neighbors=11)
for i in range(0, len(distance.flatten())):
    if  i == 0:
        print('Recommendations if you like the anime {0}:\n'.format(anime_pivot[anime_pivot.index== Anime].index[0]))
    else:
        print('{0}: {1} with distance: {2}'.format(i,anime_pivot.index[indice.flatten()[i]],distance.flatten()[i]))</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-1162" src="https://www.codexa.net/wp-content/uploads/2018/03/res_2.png" alt="" width="752" height="182" srcset="https://www.codexa.net/wp-content/uploads/2018/03/res_2.png 752w, https://www.codexa.net/wp-content/uploads/2018/03/res_2-300x73.png 300w, https://www.codexa.net/wp-content/uploads/2018/03/res_2-304x74.png 304w" sizes="(max-width: 752px) 100vw, 752px" /></p>
<p>おおお！レコメド機能が推薦してくれたのは・・</p>
<p>1位「僕だけがいない街」<br />
2位「Re:ゼロから始める異世界生活」<br />
3位「四月は君の嘘」<br />
4位「ReLife」<br />
5位「ワンパンマン」</p>
<p>「ワンパンマン」がランクインしていることで、色々と考えさせられる結果ではありますが（笑）、他のタイトルを見ても、<strong>個人的には「四月は君の嘘」以外は全て見たことがあり、かつ私の中では高評価なアニメ</strong>です！「四月は君の嘘」に関しても、少し調べて見ましたが・・これは観てみたい！と思わされました。</p>
<p>と、いうことで・・今回のアニメレコメンドシステムですが、（個人的には）<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;合格点&nbsp;</span>かと思います！</p>
<h3>まとめ</h3>
<p>今回は機械学習ライブラリを使って、非常に単純なレコメンドシステムを構築してみました。いかがでしたでしょうか？決して、精度の高いレコメンド機能とは言えませんでしたが、これを土台として機械学習を活用したレコメンド機能の構築の最初の一歩になれば幸いです。</p>
<p>別種類の「<strong>コンテンツに基づくフィルタリング</strong>」のレコメンド機能に関しても、また後日、チュートリアルを予定しています。ご興味がある方は、 <a href="https://twitter.com/codexa_net">Twitterのフォロー</a>を頂けると幸いです。</p>
<p>また、他にも「<strong>ゲームの売上予測</strong>」や「<strong>タイタニック号の生存予測</strong>」など、初心者でも気軽に行える機械学習チュートリアルを公開していますので、是非、別のチュートリアルにも挑戦してみてください。</p>
<ul>
<li><a href="https://www.codexa.net/kaggle-titanic-beginner/" target="_blank" rel="noopener">タイタニック号で生き残るのは誰？</a></li>
<li><a href="https://www.codexa.net/amazon-sagamaker-xgboost-game-sales-predictions/" target="_blank" rel="noopener">ゲームソフトの売行きをXGBoostで予測してみた</a></li>
<li><a href="https://www.codexa.net/keras-lstm-cryptos-forecast/" target="_blank" rel="noopener">ビットコインとイーサリアムの翌日の価格を予測する方法</a></li>
</ul>
<p>以上、「<strong>機械学習を使って630万件のレビューに基づいたアニメのレコメンド機能を作ってみよう</strong>」となります。チュートリアルに最後までお付き合い頂きまして、ありがとうございます！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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>Kaggle リクルートレストラン客数予想チャレンジをやってみた &#8211; Kaggle初心者ハンズオンチュートリアル</title>
		<link>https://www.codexa.net/kaggle-recruit-restaurant-visitor-forecasting-handson/</link>
					<comments>https://www.codexa.net/kaggle-recruit-restaurant-visitor-forecasting-handson/#respond</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Mon, 04 Dec 2017 03:35:54 +0000</pubDate>
				<category><![CDATA[Kaggle]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=598</guid>

					<description><![CDATA[先日にメルカリがKaggleで投稿商品の販売価格予測のコンペを開始したばかりですが、2017年11月29日にリクルートから第二弾目となるKaggleコンペティションが公開されました！ リクルートのKaggleコンペ第一回 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>先日にメルカリがKaggleで投稿商品の販売価格予測のコンペを開始したばかりですが、2017年11月29日にリクルートから第二弾目となるKaggleコンペティションが公開されました！</p>
<p>リクルートのKaggleコンペ第一回目は同社が運営するクーポンサイト「ポンパレ」の顧客情報からの購入するクーポンの予測（レコメンデーション）を行うものでした。</p>
<p>今回の第二回目のKaggleリクルートコンペでは、同じく同社が運営する「ホットペッパー」と「Airレジ（飲食店向けPOSレジアプリ）」のデータを利用して、<strong>レストランのお客さんの数を予測</strong>するコンペとなっています。</p>
<p>すでに簡単な予測モデルでのカーネル（Kaggleの公開コーディング）が立ち上がっておりますので、そちらを参考にしながら、Kaggle初心者向けのハンズオンチュートリアルを早速まとめました。</p>
<div class="su-note"  style="border-color:#e5b0af;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:#ffcac9;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">
<p>Kaggleへチームで参加してみませんか？codexaではチームメイトとのマッチングを行なっています。お気軽に<a href="https://www.codexa.net/contact/" target="_blank" rel="nofollow noopener">お問い合わせ</a>から<strong>KaggleプロフィールURL</strong>と一緒にご連絡ください。</p>
</div></div>
<p>では、早速概要とシンプルな予測モデルをPythonを使って作ってみましょう！</p>
<h3>Kaggleリクルート レストラン客数予測チャレンジ概要</h3>
<p>まずは概要から紐解いていきましょう。英語が苦手な方向けの内容なので、問題ない方は<a href="https://www.kaggle.com/c/recruit-restaurant-visitor-forecasting" target="_blank" rel="nofollow noopener">Recruit Restaurant Visitor Forecasting</a>をご覧ください。</p>
<ul>
<li>2017年11月29日にKaggleリクルートチャレンジ（ホットペッパー）が開始</li>
<li>2018年1月30日が参加申し込みおよびチーム申請の最終期限</li>
<li>2018年2月6日が最終提出の締め切り</li>
<li>賞金は1位12,000米ドル、2位8,000米ドル、3位5,000米ドル</li>
<li>評価はRMSLEのスコア</li>
<li>提出ファイルはidとvisitorsの2カラム
<ul>
<li>idはair_store_idとvisit_dateをアンダースコアーで連結する</li>
<li>air_store_id以外にhpg(Hot Pepper Gourmet)のidもあるので要注意</li>
</ul>
</li>
</ul>
<p>蛇足ですが、リクルートが以前に行なったクーポン予測のコンペでは、賞金が1位30,000ドルでしたので、今回のコンペは賞金が半分以下になってしまいましたね。とはいえ、日系の会社からKaggleへの参加は嬉しいものです！日本人カグラーで上位を目指していきましょう！</p>
<p>それでは、Kaggleリクルートレストラン客数予測チャレンジの初心者向けハンズオンチュートリアルをやってみましょう。</p>
<h3>このチュートリアルでやる内容＆対象の方</h3>
<p>本記事ですがKaggleまたは機械学習初心者向けのチュートリアルとなっています。すでにKaggleで活躍されている方、機械学習を長年やっている方には物足りない内容となっていますので、ご注意ください。</p>
<p><strong>このチュートリアルでやる内容</strong></p>
<ul>
<li>Kaggleリクルートのデータセットの確認</li>
<li>色々な平均を出して予測をする（後ほど詳しくやります）</li>
<li>Kaggleへファイルを提出（スコア確認）</li>
</ul>
<p><strong>使うもの</strong></p>
<ul>
<li>Python 3.6</li>
<li>Pandas</li>
<li>Numpy</li>
<li>Kaggleアカウント</li>
<li>Jupyter Notebook（必須ではありません）</li>
</ul>
<p>Jupyter Notebookですが、必須ではありません。Pythonのみを使って処理は可能ですが、あると便利です。多くのデーターサイエンティストが使っているツールですので、まだインストールされていない方は、この機会にいかがでしょうか？（<a href="http://jupyter.org/" target="_blank" rel="nofollow noopener">ダウロードはこちらからどうぞ</a>）</p>
<p>またPandasとNumpyのバージョンはさほど大きな影響はありませんが、Python2.7をお使いの方は、正しく処理できませんので3.6へのアップデートをご検討ください。</p>
<p>最後にデータを使うには、Kaggleリクルートコンペへの参加と利用規約の同意が必須となります。Kaggleの無料会員アカウントで可能なので、まだKaggleへ登録されていない方は<a href="https://www.kaggle.com" target="_blank" rel="nofollow noopener">こちら</a>から登録をお願いします。</p>
<p>では、早速データをみていきましょう！</p>
<h3>Kaggleリクルートのデータ確認</h3>
<p>Kaggleリクルートチャレンジ2ではデータセットが全部で8つリクルートから提供されています。データは大きく分けると2種類あり、「ホットペッパー」と「Airレジ」の各サービスの2016年〜2017年4月までの予約情報（予約日時や予約人数）が提供されています。</p>
<ul>
<li>air_reserve.csv
<ul>
<li><strong>Airレジ経由の予約情報</strong></li>
<li>air_store_id &#8211; Airレジ固有のレストランID</li>
<li>visit_datetime &#8211; 予約時のお店訪問予定時間</li>
<li>reserve_datetime &#8211; 予約をした時の時間</li>
<li>reserve_visitors &#8211; 予約人数</li>
</ul>
</li>
<li>hpg_reserve.csv
<ul>
<li><strong>ホットペッパー経由の予約情報</strong></li>
<li>hpg_store_id &#8211; ホットペッパー固有のレストランID</li>
<li>visit_datetime &#8211; 予約時のお店訪問予定時間</li>
<li>reserve_datetime &#8211; 予約をした時の時間</li>
<li>reserve_visitors &#8211; 予約人数</li>
</ul>
</li>
<li>air_store_info.csv
<ul>
<li><strong>Airレジのレストラン情報</strong></li>
<li>air_store_id &#8211; Airレジ固有ID</li>
<li>air_genre_name &#8211; レストランのジャンル</li>
<li>air_area_name &#8211; レストランの所属エリア</li>
<li>latitude &#8211; 緯度</li>
<li>longitude &#8211; 経度</li>
</ul>
</li>
<li>hpg_store_info.csv
<ul>
<li><strong>ホットペッパーのレストラン情報</strong></li>
<li>hpg_store_id &#8211; ホットペッパー固有ID</li>
<li>air_genre_name &#8211; レストランのジャンル</li>
<li>air_area_name &#8211; レストランの所属エリア</li>
<li>latitude &#8211; 緯度</li>
<li>longitude &#8211; 経度</li>
</ul>
</li>
<li>store_id_relation.csv
<ul>
<li><strong>AirレジとホットペッパーのIDリレーション</strong></li>
<li><strong>両サービスを使っているお店のみ</strong></li>
<li>hpg_store_id &#8211; ホットペッパー固有ID</li>
<li>air_store_id &#8211; Airレジ固有ID</li>
</ul>
</li>
<li>air_visit_data.csv
<ul>
<li><strong>Airレジの各レストランの日付ごとの実客数</strong></li>
<li>air_store_id &#8211; AirレジID</li>
<li>visit_date &#8211; 日付</li>
<li>visitors &#8211; 実客数</li>
</ul>
</li>
<li>sample_submission.csv
<ul>
<li><strong>提出ファイルのサンプルフィーマット</strong></li>
<li><strong>予測しなくてはいけない日付も入っている</strong></li>
<li><strong>idの項目など少し特徴がある</strong></li>
<li>id &#8211; air_store_idとvisit_dateを連結させたid</li>
<li>visitors &#8211; 予想客数（店＆日付のコンビネーション）</li>
</ul>
</li>
<li>data_info.csv
<ul>
<li><strong>カレンダー日付の基本的な情報</strong></li>
</ul>
</li>
</ul>
<p>ファイル数は多いですが、実際に予測に使える項目は思ったよりも少なさそうです。次に本チュートリアルでやる予測の手法をみていきましょう</p>
<h3>Kaggleリクルート レストラン予測の手法</h3>
<p>本チュートリアルですが、すでにKaggleで公開されているカーネルを参考に、初心者向けに書き直しています。公開されているコードとなりますので、当然ですがこちらの予測では100%上位ランクインできません！ただ、この予測を手始めに、色々な発展系を作るのはありだと思います。</p>
<p>早速、予測の手法をみていきましょう。</p>
<h4>予測するデータ</h4>
<p>これはsample_submission.csvを紐解くとわかりますが、予測しなくてはいけないデータは、Airレジを使っている821店舗のレストランの2017年4月最終週〜2017年5月末日までの各日にちのお客さん来店数となります。821店舗×39日間で32019行がsample_submission.csvに格納されています。全ての行のvisit（つまり来客数）を予測しなくてはいけません。</p>
<h4>ステップ① 過去データの曜日の中央値（median）を算出</h4>
<p>予測するレストランの過去の来客数データから、曜日ごとの中央値（median）を算出します。過去の来客数データはair_visit_data.csvに入っています。ただし、日付、レストランID、実客数のみしかありませんので、このデータに曜日を追加して、レストランIDと曜日毎に実客数をまとめて中央値（median）を算出します。</p>
<p>中央値（median）と平均値（mean）は似ていますが、異なりますので注意しましょう。簡単な説明ではありますが、下記のとあるレストランの月曜日〜水曜日の3週間分の来客数を見てください。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-646" src="https://www.codexa.net/wp-content/uploads/2017/12/mean_vs_median.png" alt="" width="661" height="186" srcset="https://www.codexa.net/wp-content/uploads/2017/12/mean_vs_median.png 661w, https://www.codexa.net/wp-content/uploads/2017/12/mean_vs_median-300x84.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/mean_vs_median-304x86.png 304w" sizes="(max-width: 661px) 100vw, 661px" /></p>
<p>月曜日の平均値は25名で、中央値は25名とたまたま一緒でしたが、他の曜日では平均値と中央値は異なります。<strong>中央値は、データを並べたときに「真ん中」にある値</strong>をさします。今回のステップ1での予測では、この中央値（メディアン）を使います。</p>
<h4>ステップ② 重み付き平均（加重平均）を算出</h4>
<p>二つ目のステップとして、予測ターゲットを「重み付き平均」を使って算出します。まず簡単にですが、重み付き平均について説明をします。下記の表をまずご覧ください。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-623" src="https://www.codexa.net/wp-content/uploads/2017/12/wmean.png" alt="" width="605" height="182" srcset="https://www.codexa.net/wp-content/uploads/2017/12/wmean.png 605w, https://www.codexa.net/wp-content/uploads/2017/12/wmean-300x90.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/wmean-304x91.png 304w" sizes="(max-width: 605px) 100vw, 605px" /></p>
<p>とある学校でAとBのクラスがあり、その平均点とクラスの人数を表しています。AとBのクラスの合わせた全体の平均点は82点となります。ただし、クラスの人数に差がありますので、人数が多いクラウスの方が重要（全体の平均点へ与える影響が大きい）と考えるのが加重平均の考え方です。</p>
<p>求め方としては各クラスの平均点にクラス人数をかけたものを足して、全体の人数で割ります。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-624" src="https://www.codexa.net/wp-content/uploads/2017/12/wmean_how.png" alt="" width="270" height="95" /></p>
<p>最初の表に出ていますが、このようにクラスの人数＝重みをつけて改めて平均を計算すると、85.5点と算術平均と比べて高くなるのがわかります。</p>
<p>今回の予測ですが、複雑な計算は抜きにして、この重み平均も使ってみましょう。そもそもの議論として、どのような項目を使って「重み」を算出するのかは大きな議論となりますが、今回は単純にair_visit_data.csvの日付を重みとして利用します。前述しましたが、こちらのデータには2016年から2017年4月までの各店舗の実客数が日付ごとに入っています。</p>
<p>古い日付には重み（重要度）を低く、予測しなくはいけない2017年4月の直近のデータには重み（重要度）を高くします。</p>
<p>この重みを使って、各レストランの「<strong>曜日</strong>」「<strong>祝日フラグ</strong>」の項目にまとめて加重平均を算出します。意味合いとしては、「<strong>Aのレストランの祝日ではない火曜日は、過去1年間のデータで直近に重みをおいた加重平均で19名来店する可能性があります</strong>」という予測が可能です。</p>
<h4>ステップ3 中央値と加重平均のさらに平均を算出</h4>
<p>とうとうステップ3で、Kaggleへ提出する予測データを作ります。今まで2通りの方法で予測を算出してきましたが、最後の処理としてステップ1（中央値）とステップ2（加重平均）で算出した数値の、<strong>さらに平均をとって</strong>最終の予測データとしましょう。</p>
<p>Aをステップ1で求めた中央値（meadin）、Bをステップ2で求めた加重平均（wmean）とした時に、さらにその2つの数値の平均を下記の3つの異なる平均で求めてみましょう！</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-626" src="https://www.codexa.net/wp-content/uploads/2017/12/mean_calculate.png" alt="" width="655" height="184" srcset="https://www.codexa.net/wp-content/uploads/2017/12/mean_calculate.png 655w, https://www.codexa.net/wp-content/uploads/2017/12/mean_calculate-300x84.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/mean_calculate-304x85.png 304w" sizes="(max-width: 655px) 100vw, 655px" /></p>
<p>最後に求めた平均をCSVファイルへ書き出して、Kaggleへ投稿すればスコアもつきます！実際に3つの異なる平均で計算した予測データは、それが一番優秀なモデルなのか？も判明します。</p>
<p><strong>では、実際にKaggleリクルートレストラン予測チャレンジからデータをダウロードして、Pythonを使って予測を計算してみましょう！</strong></p>
<h3>過去データの曜日の中央値を算出しよう</h3>
<p>では、早速Pythonを使ってデータの処理と必要な値を算出していきましょう。またデータセットのCSVヲダウロードされていない方は、Kaggleへ無料会員登録を行い<a href="https://www.kaggle.com/c/recruit-restaurant-visitor-forecasting/data" target="_blank" rel="nofollow noopener">こちらからダウンロード</a>しましょう。</p>
<p>まずは必要なライブラリをインポートしましょう。</p><pre class="crayon-plain-tag"># numpyなど必要なライブラリをインポート

import numpy as np
import pandas as pd 
import glob, re</pre><p>
次にsample_submission.csvを読み込んで確認してみましょう。</p><pre class="crayon-plain-tag"># sample_submission.csvを読みこんでヘッダー情報&amp;Shapeの確認

test_df = pd.read_csv('sample_submission.csv')
test_df.head(20)
test_df.shape

(32019, 4)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-606" src="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_csv_head.png" alt="" width="259" height="259" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_csv_head.png 259w, https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_csv_head-150x150.png 150w, https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_csv_head-214x214.png 214w, https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_csv_head-158x158.png 158w" sizes="(max-width: 259px) 100vw, 259px" /></p>
<p>sample_submission.csvですが、Kaggleへの提出データの形式となっています。こちらに入ってるAirレジのレストランと日付を使って、予測（実客数）の予測をしなくてはいけません。前の項目でも軽く触れましたがIDの形式がすこしややこしいですね。「air_ストアID_日付」と3つの情報がアンダースコアで連結されています。前処理として、このIDを情報毎に分解しましょう。</p><pre class="crayon-plain-tag"># 元々のIDからstore_idとvisit_dateを切り出します
test_df['store_id'] = test_df['id'].str[:20]
test_df['visit_date'] = test_df['id'].str[21:]

# 提出ファイルのサンプルでvisitorsは意味がないのでdropしましょう
test_df.drop(['visitors'], axis=1, inplace=True)

# 日付の型をobjectからdatetimeに変換しておきましょう
test_df['visit_date'] = pd.to_datetime(test_df['visit_date'])

# 念のためカラム情報の確認
test_df.info()

# ヘッダー情報もみておきましょう
test_df.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-607" src="https://www.codexa.net/wp-content/uploads/2017/12/test_df_head_dtypes.png" alt="" width="704" height="138" srcset="https://www.codexa.net/wp-content/uploads/2017/12/test_df_head_dtypes.png 704w, https://www.codexa.net/wp-content/uploads/2017/12/test_df_head_dtypes-300x59.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/test_df_head_dtypes-304x60.png 304w" sizes="(max-width: 704px) 100vw, 704px" /></p>
<p>左がtest_dfのカラム情報で右がヘッダー情報となります。元々のIDに入っていたstore_idとvisit_dateを処理して別のカラムに分けました。visit_dateはdatetimeとして型の変更もしています。</p>
<p>次はair_visit_data.csvの読み込みと前処理をしましょう。air_visit_data.csvですが、Airレジの各レストランの日付と実客数のデータとなります。つまり予測しなくてはいけないレストランの過去の実客数の実績データです。<strong>このデータを処理してレストラン/曜日毎の「中央値（Median）」を算出しましょう。</strong></p><pre class="crayon-plain-tag"># air_visit_data.csvを読み込む、parse_datesでdatetime型へ変換しておく
air_data = pd.read_csv('air_visit_data.csv', parse_dates=['visit_date'])

# サイズを確認しておきましょう
air_data.shape

(252108, 3)

# ヘッダー情報
air_data.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-609" src="https://www.codexa.net/wp-content/uploads/2017/12/air_visit_data_csv_head.png" alt="" width="268" height="149" /></p>
<p>air_visit_data.csvは単純な構造ですね。visit_dateはdatetime型として扱えるようにparse_datesのアーギュメントを使いましょう。</p>
<p>予測で使うsample_submission.csvの中から一つだけレストランIDを取り出して、air_visit_data.csvのデータを参照してみましょう。今回はsample_submission.csvの最上部に載っていたID「air_00a91d42b08b08d9」を参照してみます。</p><pre class="crayon-plain-tag"># 予測するレストランIDを1つ使ってair_dataから実客数をみてみる
check_store_sample = air_data[air_data['air_store_id'] == 'air_00a91d42b08b08d9']

# 基本統計量の確認
check_store_sample.describe()

# visit_dateの確認
check_store_sample.visit_date.describe()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-612" src="https://www.codexa.net/wp-content/uploads/2017/12/check_store_sample_data-1.png" alt="" width="403" height="217" srcset="https://www.codexa.net/wp-content/uploads/2017/12/check_store_sample_data-1.png 403w, https://www.codexa.net/wp-content/uploads/2017/12/check_store_sample_data-1-300x162.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/check_store_sample_data-1-304x164.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/check_store_sample_data-1-293x158.png 293w" sizes="(max-width: 403px) 100vw, 403px" /></p>
<p>左がvisitorsの基本統計量、右がvisit_dateの情報となります。レストランID「air_00a91d42b08b08d9」では、平均26.0名、標準偏差12.43、最小1名〜最大99名のお客さんが来ていたことがわかります。右のvisit_dateを確認する通り、「2016年7月1日〜2017年4月22日」の期間のデータとなります。（こちらはデータセットの前処理ではありません。単純にデータがどうなっているのか確認のために出しました）</p>
<p>さて、本題に戻ってair_dataを訓練データとして使うために前処理を行なっていきましょう。前処理でやる事としては、主に下記の3つです。</p>
<ul>
<li>2017-01-28以降のデータの切り出し</li>
<li>visit_dateを基に曜日のデータ作成</li>
<li>曜日とレストランIDを基にグルーピングして中央値を算出</li>
</ul>
<p>日付から曜日への変換ですが、pandasのdayofweekを使用して、dow（Day of Week）としてカラムに追加しています。dayofweekですが、曜日を文字列としてではなく数値（0=月曜日、6=日曜日）として出力しますので注意しましょう。</p><pre class="crayon-plain-tag"># air_dataの日付（visit_date）を曜日（dow）へ変換する
air_data['dow'] = air_data['visit_date'].dt.dayofweek

# air_dataから2017-01-28以降のデータを切り出して訓練データ「train」へ格納
train = air_data[air_data['visit_date'] &gt; '2017-01-28'].reset_index()

# trainとtest_dfも日付を曜日へ変換して「dow」をカラム追加する
train['dow'] = train['visit_date'].dt.dayofweek
test_df['dow'] = test_df['visit_date'].dt.dayofweek

#データを確認しておきましょう
test_df.head()
train.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-613" src="https://www.codexa.net/wp-content/uploads/2017/12/test_df_train_head.png" alt="" width="784" height="159" srcset="https://www.codexa.net/wp-content/uploads/2017/12/test_df_train_head.png 784w, https://www.codexa.net/wp-content/uploads/2017/12/test_df_train_head-300x61.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/test_df_train_head-768x156.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/test_df_train_head-304x62.png 304w" sizes="(max-width: 784px) 100vw, 784px" /></p>
<p>左がtrainで右がtest_dfのヘッダー情報です。両データ共に日付から変換された曜日（dow）が入っているのが確認できます。</p>
<p>さて、次はtrainからair_store_idとdowをグルーピングして、median（中央値）を取り出しましょう。</p><pre class="crayon-plain-tag"># pandasのagg関数で使うリストを作成
aggregation = {'visitors' : {'total_visitors' : 'median'}}

# trainからair_store_idとdowをグルーピングしてvisitorsの中央値（median）を算出
agg_data = train.groupby(['air_store_id', 'dow']).agg(aggregation).reset_index()

# agg_dataのカラム名をつける
agg_data.columns = ['air_store_id', 'dow', 'visitors']
agg_data['visitors']= agg_data['visitors']

# agg_dataを確認しよう
agg_data.head(12)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-614" src="https://www.codexa.net/wp-content/uploads/2017/12/agg_data_head.png" alt="" width="243" height="301" srcset="https://www.codexa.net/wp-content/uploads/2017/12/agg_data_head.png 243w, https://www.codexa.net/wp-content/uploads/2017/12/agg_data_head-242x300.png 242w, https://www.codexa.net/wp-content/uploads/2017/12/agg_data_head-173x214.png 173w, https://www.codexa.net/wp-content/uploads/2017/12/agg_data_head-128x158.png 128w" sizes="(max-width: 243px) 100vw, 243px" /></p>
<p>air_data（air_visit_data.csv）から各レストランIDごとに各曜日（dow）のお客さんの中央値のデータができました。こちらのデータですが、平均値（mean）ではなくて、中央値（median）ですので注意しましょう。</p>
<p>Kaggleへ提出するデータ（sample_submission.csv）から前処理したtest_dfと、各レストランの実客数データ（air_visit_data.csv）を処理して中央値を算出して作ったagg_dataをマージさせましょう。最後にfinalとして、Kaggleへの提出データに必要なidとvisitorsを切り取りましょう。</p><pre class="crayon-plain-tag"># test_dfとagg_dataのstoreid_id、dowをすり合わせmergeさせる
merged = pd.merge(test_df, agg_data, how='left', left_on=['store_id', 'dow'], right_on=['air_store_id', 'dow'])

# idとvisitorsだけをfinalへ格納
final = merged[['id', 'visitors']]

# finalのヘッダー情報
final.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-616" src="https://www.codexa.net/wp-content/uploads/2017/12/final_head.png" alt="" width="261" height="146" /></p>
<p>元々のid（air_レストランID_日付）とagg_dataで処理したvisitors（レストランIDと曜日を基にair_visit_data.csvの実客数の中央値）だけ残しています。</p>
<p>上記のヘッドでも確認できますが、finalのデータの中にNaNが入っていますね。どれくらいNaNが入っているのか確認してみましょう。</p><pre class="crayon-plain-tag"># NaNを探してテーブルにする関数
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 

# finalのNaNを確認してみよう
missing_values_table(final)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-617" src="https://www.codexa.net/wp-content/uploads/2017/12/final_missing_vl.png" alt="" width="249" height="78" /></p>
<p>当然idは全て埋まっていますが、visitorsに1114個のNaNがあるのがわかります。全体の3.48%がNaNとなっています。これではまずいので・・こちらのNaNへ0を入れておきましょう。</p><pre class="crayon-plain-tag"># fillna関数を使ってvisitorsのNaNへ0を入れておく
final.fillna(0, inplace=True)

# 念のため確認
missing_values_table(final)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-618" src="https://www.codexa.net/wp-content/uploads/2017/12/final_filled.png" alt="" width="254" height="80" /></p>
<p>visitorsのカラムも全て何かしらの値が入ったことが確認できます。さて、ひとまずここまでで、予測しなくてはいけないAirレジレストランの各日付に対して、過去の曜日と実客数のデータから算出をした中央値を予測値としてもつデータができました。</p>
<p>次は、ステップ2として、、重み付き平均を算出しましょう。</p>
<h3>重み付き平均（加重平均）を算出</h3>
<p>ステップ2へ移る前に、他のCSVファイルもデータフレームに読み込んでしまいましょう。下記ですが、Kaggleリクルートチャレンジからダルロードしたファイルを同一フォルダーに入れていないと動きませんのでご注意ください。</p><pre class="crayon-plain-tag"># 全てのCSVを一気に読み込む
# glob.glob('')に適切なファイルのパスを指定してください
dfs = { re.search('/([^/\.]*)\.csv', fn).group(1):pd.read_csv(
    fn) for fn in glob.glob('./*.csv')}
for k, v in dfs.items(): locals()[k] = v

# 読み込んだファイルを確認
print('data frames read:{}'.format(list(dfs.keys())))

data frames read:['air_store_info', 'date_info', 'store_id_relation', 'hpg_reserve', 'air_reserve', 'air_visit_data', 'sample_submission', 'hpg_store_info']</pre><p>
これで各CSVファイルのファイル名＝データフレーム名として、読み込みが完了しました。前の項目で触れましたが、重み付き平均は「<strong>曜日</strong>」と「<strong>祝日フラグ</strong>」の項目別にまとめて出します。祝日ですが、リクルートから提供されているdata_info.csvを少し処理する必要があります。</p>
<p>まずはdate_infoを確認してみましょう。</p><pre class="crayon-plain-tag"># data_infoの祝日フラグが1（オン）のデータを確認
date_info[date_info['holiday_flg'] == 1].head(10)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-631" src="https://www.codexa.net/wp-content/uploads/2017/12/date_info_head.png" alt="" width="270" height="250" srcset="https://www.codexa.net/wp-content/uploads/2017/12/date_info_head.png 270w, https://www.codexa.net/wp-content/uploads/2017/12/date_info_head-231x214.png 231w, https://www.codexa.net/wp-content/uploads/2017/12/date_info_head-171x158.png 171w" sizes="(max-width: 270px) 100vw, 270px" /></p>
<p>index1とindex2のレコードを見るとわかりますが、祝日フラグには週末でも祝日の場合は「1」とフラグが立っているのがわかります。前処理として、まずはこちらのフラグを週末の場合（土曜日or日曜日）は、祝日であってもフラグを0とする処理を行いましょう。</p><pre class="crayon-plain-tag"># date_infoから土日で祝日フラグが「1」のレコードを探してweekend_hdaysに格納
weekend_hdays = date_info.apply((lambda x:(x.day_of_week=='Sunday' or x.day_of_week=='Saturday') and x.holiday_flg==1), axis=1)

# date_infoの該当の箇所のフラグを1から0へ更新をする
date_info.loc[weekend_hdays, 'holiday_flg'] = 0</pre><p>
これで祝日＝土日ではない平日のお休みというデータとなります。</p>
<p>次のステップとしては、日付を基に「重み」を作成しましょう。前述しましたが、日付が古いものには少ない重みを、予測する日付に近い（新しい日付）には多い重みを与えましょう。</p><pre class="crayon-plain-tag"># 該当の日付＋1　÷ 全部の日付の個数で重みを計算
# date_info.indexの値が小さい＝より昔のデータ
date_info['weight'] = (date_info.index + 1) / len(date_info) 

#ヘッダーとテイルの情報を出して確認してみよう
date_info.head()
date_info.tail()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-632" src="https://www.codexa.net/wp-content/uploads/2017/12/date_info_weight.png" alt="" width="637" height="151" srcset="https://www.codexa.net/wp-content/uploads/2017/12/date_info_weight.png 637w, https://www.codexa.net/wp-content/uploads/2017/12/date_info_weight-300x71.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/date_info_weight-304x72.png 304w" sizes="(max-width: 637px) 100vw, 637px" /></p>
<p>左がheadで右がtailとなります。こちらの表で確認できる通り日付2016-01-01の重みは「0.001934」に対して、2017-05-31の重みは「1.000000」となっています。つまり予測しなくてはいけない日程に近いほど重要度が高いということが言えます。</p>
<p>重みの処理もできましたので、次のステップは実際に重み付き平均を算出することです。やり方としては、air_visit_data(Airレジの各レストランの実客数データ）に上記で算出したWeight（重み）を加えて、visitors（実客数）をnp.log1pを使って対数にして、「air_store_id」「day_of_week」「holiday_flg」（各レストランID、曜日、祝日フラグ）でグルーピングをして 重み付き平均を算出します。</p><pre class="crayon-plain-tag"># air_visit_dataと重みを追加したdate_infoをマージさせてvisit_dataを作成
# visit_dataから不必要なcalendar_dateを落とす
visit_data = air_visit_data.merge(date_info, left_on='visit_date', right_on='calendar_date', how='left')
visit_data.drop('calendar_date', axis=1, inplace=True)

# visit_dataの実客数にnp.log1pの対数関数を使って処理
visit_data['visitors'] = visit_data.visitors.map(pd.np.log1p)

# visit_dataの確認
visit_data.head(10)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-633" src="https://www.codexa.net/wp-content/uploads/2017/12/visit_data.png" alt="" width="463" height="254" srcset="https://www.codexa.net/wp-content/uploads/2017/12/visit_data.png 463w, https://www.codexa.net/wp-content/uploads/2017/12/visit_data-300x165.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/visit_data-304x167.png 304w, https://www.codexa.net/wp-content/uploads/2017/12/visit_data-288x158.png 288w" sizes="(max-width: 463px) 100vw, 463px" /></p>
<p>上記の通り、事前に算出した「重み（weight）」、さらに実客数をnp.log1pで処理した数値が「visitors」へ処理が加わっているのが確認できます。</p>
<p>これで、やっと「レスストランID」「曜日」「祝日」に応じた重み付き平均の算出が可能になりました！本チュートリアルの前半で、重み付き平均の求め方をやっていますので、忘れてしまった方は改めて確認しておきましょう。</p><pre class="crayon-plain-tag"># wmean（重み付き平均）の式を格納
wmean = lambda x:( (x.weight * x.visitors).sum() / x.weight.sum() )


# グルーピングして重み付き平均を算出
visitors = visit_data.groupby(
    ['air_store_id', 'day_of_week', 'holiday_flg']).apply(wmean).reset_index()
visitors.rename(columns={0:'visitors'}, inplace=True) 

# データを確認
visitors.head(10)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-634" src="https://www.codexa.net/wp-content/uploads/2017/12/visitors_head.png" alt="" width="347" height="255" srcset="https://www.codexa.net/wp-content/uploads/2017/12/visitors_head.png 347w, https://www.codexa.net/wp-content/uploads/2017/12/visitors_head-300x220.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/visitors_head-291x214.png 291w, https://www.codexa.net/wp-content/uploads/2017/12/visitors_head-215x158.png 215w" sizes="(max-width: 347px) 100vw, 347px" /></p>
<p>これで、レストランID、曜日、祝日フラグごとの客数の「重み平均」が算出されました。上のヘッダー情報をみてもわかりますが、index1とindex2は同じレストランID「air_00a91d42b08b08d9」で曜日も「Monday（月曜日）」と一緒ですが、祝日フラグが異なりますので、各レコードに重み平均が算出されています。</p>
<p>さて、次の処理として、この重み付き平均で算出した予測客数を、sample_submissionのデータのレストランIDや日付を基に客数を埋めていきましょう。(sample_submissionに予測しなくてはいけない日付やレストランIDが入っていましたね）</p><pre class="crayon-plain-tag"># sample_submissionのIDをレストランIDや日付に分ける
sample_submission['air_store_id'] = sample_submission.id.map(
    lambda x: '_'.join(x.split('_')[:-1]))
sample_submission['calendar_date'] = sample_submission.id.map(lambda x: x.split('_')[2])

# 重み付き平均で予測したvisitorsとsample_submissionをマージする
sample_submission.drop('visitors', axis=1, inplace=True)
sample_submission = sample_submission.merge(date_info, on='calendar_date', how='left')
sample_submission = sample_submission.merge(
    visitors, on=['air_store_id', 'day_of_week', 'holiday_flg'], how='left')

# データセットを確認してみよう
sample_submission.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-635" src="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_head.png" alt="" width="674" height="153" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_head.png 674w, https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_head-300x68.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_head-304x69.png 304w" sizes="(max-width: 674px) 100vw, 674px" /></p>
<p>これで、事前に処理をした「重み付き平均」の客数が各レストラン毎に入りました。次に欠損データの確認と処理を行いましょう。まずは、欠損データをmissing_values_tableで確認してみましょう。</p><pre class="crayon-plain-tag"># sampe_submissionの欠損データを確認
missing_values_table(sample_submission)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-636" src="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing.png" alt="" width="279" height="191" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing.png 279w, https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing-231x158.png 231w" sizes="(max-width: 279px) 100vw, 279px" /></p>
<p>visitorsで重み付き平均が入っていないレコードが668個もありますね。一番最初に重み付き平均を入れた時は過去データの「レストランID」「曜日」「祝日フラグ」に基づいて入れましたが、それに該当していないレコードが欠損していますので、今度は「祝日フラグ」の条件を除いて、「レストランID」「曜日」に基づいて重み付き平均を入れていきましょう。</p><pre class="crayon-plain-tag"># 「air_store_id」と「 day_of_week」のみで欠損データに重み平均を入れる
missings = sample_submission.visitors.isnull()
sample_submission.loc[missings, 'visitors'] = sample_submission[missings].merge(
    visitors[visitors.holiday_flg==0], on=(
        'air_store_id', 'day_of_week'), how='left')['visitors_y'].values

# 改めて欠損データの確認
missing_values_table(sample_submission)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-637" src="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing2.png" alt="" width="283" height="193" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing2.png 283w, https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing2-232x158.png 232w" sizes="(max-width: 283px) 100vw, 283px" /></p>
<p>上の条件で約200の欠損データが埋まりましたが、まだ448個あります。最後は「曜日」の条件も省いて、単純に「レストランID」にのみの重み付き平均を欠損データへ埋めておきましょう。</p><pre class="crayon-plain-tag"># 「air_store_id」のみの重み付き平均を計算して欠損データへ入れる
missings = sample_submission.visitors.isnull()
sample_submission.loc[missings, 'visitors'] = sample_submission[missings].merge(
    visitors[['air_store_id', 'visitors']].groupby('air_store_id').mean().reset_index(), 
    on='air_store_id', how='left')['visitors_y'].values

# 欠損データを確認
missing_values_table(sample_submission)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-638" src="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing3.png" alt="" width="281" height="190" srcset="https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing3.png 281w, https://www.codexa.net/wp-content/uploads/2017/12/sample_submission_missing3-234x158.png 234w" sizes="(max-width: 281px) 100vw, 281px" /></p>
<p>これで全ての欠損データが埋まったのが確認できます。</p>
<p>最後にこのsample_submissionをKaggleリクルートレストランチャレンジの提出規定の形に整えましょう。visitorsですが、現段階ではnp.log1pで対数となっていますので、np.expm1で実際の予測した客数に戻してから、カラムを規定のフォーマットに戻します。</p><pre class="crayon-plain-tag"># visitorsをnp.expm1で処理して実客数へ戻す
sample_submission['visitors'] = sample_submission.visitors.map(pd.np.expm1)

# 提出フォーマットの規定に合うように処理してsub_fileへ格納
sample_submission = sample_submission[['id', 'visitors']]
final['visitors'][final['visitors'] ==0] = sample_submission['visitors'][final['visitors'] ==0]
sub_file = final.copy()

# データの確認
sub_file.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-639" src="https://www.codexa.net/wp-content/uploads/2017/12/sub_file_head.png" alt="" width="263" height="145" /></p>
<p>これで、重み付き平均で予測をしたデータが「sub_file」としてKaggleへ提出データのフォーマットへ戻ったのが確認できます。次はとうとう最後のステップ「中央値と加重平均のさらに平均を算出」をして最終の予測データを出して、Kaggleでスコアを確認してみましょう。</p>
<h3>中央値と加重平均のさらに平均を算出</h3>
<p>現段階でfinaleのvisitorsへは、ステップ1で算出した「曜日の中央値 」が客数予測値として入っています。またsample_submissionのvisitorsへは、ステップ2で算出をした「重み付き平均」の客数予測値が入っています。</p>
<p>最後に、このふた通りの客数予測をさらに3つの手法で平均を算出してKaggleへデータを提出してみましょう。Aがfinal[&#8216;visitors&#8217;]でBがsample_submission[&#8216;visitors&#8217;]として、簡単に求めることが可能です。</p>
<p>各平均を求めて、それぞれ別名でcsvファイルに書き出しましょう。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-640" src="https://www.codexa.net/wp-content/uploads/2017/12/mean_calculate-1.png" alt="" width="655" height="184" srcset="https://www.codexa.net/wp-content/uploads/2017/12/mean_calculate-1.png 655w, https://www.codexa.net/wp-content/uploads/2017/12/mean_calculate-1-300x84.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/mean_calculate-1-304x85.png 304w" sizes="(max-width: 655px) 100vw, 655px" /></p><pre class="crayon-plain-tag"># 算術平均をnp.meanで算出
sub_file['visitors'] = np.mean([final['visitors'], sample_submission['visitors']], axis = 0)
sub_file.to_csv('sub_math_mean_1.csv', index=False)

# 相乗平均を算出
sub_file['visitors'] = (final['visitors'] * sample_submission['visitors']) ** (1/2)
sub_file.to_csv('sub_geo_mean_1.csv', index=False)

# 調和平均を算出
sub_file['visitors'] = 2/(1/final['visitors'] + 1/sample_submission['visitors'])
sub_file.to_csv('sub_hrm_mean_1.csv', index=False)</pre><p>
ローカルに「sub_math_mean_1.csv」「sub_geo_mean_1.csv」「sub_hrm_mean_1.csv」の三つのファイルが出力されて入れば成功です。それでは、気になる予測の結果をKaggleへ投稿して確認してみましょう！</p>
<h3>【結果】予測したファイルをKaggleへ投稿</h3>
<p><a href="https://www.kaggle.com/c/recruit-restaurant-visitor-forecasting/submit" target="_blank" rel="nofollow noopener">Recruit Restaurant Visitor Forecasting Submit</a>のページでファイルの提出が可能です。下記が、三つのファイルをKaggleへ提出した結果となります。Nameの部分が最後に出力したCSVファイル名となっています。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-641" src="https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_1.png" alt="" width="951" height="209" srcset="https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_1.png 951w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_1-300x66.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_1-768x169.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_1-304x67.png 304w" sizes="(max-width: 951px) 100vw, 951px" /><img loading="lazy" class="aligncenter size-full wp-image-642" src="https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_2.png" alt="" width="951" height="209" srcset="https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_2.png 951w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_2-300x66.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_2-768x169.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_2-304x67.png 304w" sizes="(max-width: 951px) 100vw, 951px" /></p>
<p><img loading="lazy" class="aligncenter size-full wp-image-643" src="https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_3.png" alt="" width="951" height="207" srcset="https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_3.png 951w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_3-300x65.png 300w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_3-768x167.png 768w, https://www.codexa.net/wp-content/uploads/2017/12/kaggle_result_3-304x66.png 304w" sizes="(max-width: 951px) 100vw, 951px" /></p>
<p>あまりスコアに大差はありませんが、どうやら最後の処理で「調和平均」で処理をした結果が一番良いスコアがでています。（つまり一番予測モデルとしての精度が優秀）参考までにですが、こちらのスコアは<strong>338名中の現在147位</strong>となっています！</p>
<h3>Kaggleリクルートへ挑戦しよう</h3>
<p>本チュートリアルでは、Kaggleリクルートチャレンジ2のデータを実際に触ってみて、Pythonを使って様々な平均を算出して予測をしました。</p>
<p>来年1月末までが最終提出の期限となっていますので、ぜひ、より精度の高い予測モデルの作成に挑んでみましょう！まだいまいちに不安な方は、他にもカーネルで多数の予測モデルが公開されています。カーネルを一つ一つ紐解くことで、データの前処理やモデリングなど参考になることは多くあります！</p>
<p>codexaでもKaggleのタイタニックや、メルカリチャレンジのハンズオンも同様に公開していますので、もう少し初心者向けハンズオンをやってみたいという方は、こちらも是非、やってみてください。</p>
<p><a href="https://www.codexa.net/kaggle-titanic-beginner/" target="_blank" rel="noopener">【Kaggle初心者入門編】タイタニック号で生き残るのは誰？</a></p>
<p><a href="https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/" target="_blank" rel="noopener">Kaggle メルカリ価格予想チャレンジの初心者チュートリアル</a></p>
<p>以上、Kaggleリクルートレストラン客数予測チャレンジの初心者向けチュートリアルでした！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/kaggle-recruit-restaurant-visitor-forecasting-handson/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kaggle メルカリ価格予想チャレンジの初心者チュートリアル</title>
		<link>https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/</link>
					<comments>https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/#comments</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Sat, 25 Nov 2017 11:40:28 +0000</pubDate>
				<category><![CDATA[Kaggle]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=554</guid>

					<description><![CDATA[短期間で日本のスタートアップシーンを大きく揺るがした超大型スタートアップの「メルカリ」が、Kaggle（Kaggleとは？）にて競争コンペを公開しました！ 私が記憶している限りだと、おそらく「リクルート」に次いで、日系企 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>短期間で日本のスタートアップシーンを大きく揺るがした超大型スタートアップの「メルカリ」が、Kaggle（<a href="https://www.codexa.net/what-is-kaggle/">Kaggleとは？</a>）にて競争コンペを公開しました！</p>
<p>私が記憶している限りだと、おそらく「リクルート」に次いで、日系企業として2社目かと思います！日本勢カグラーで上位を叩き出したいところではありますが、ひとまず最速レビューとして英語の苦手な方でも参加が可能なように、コンペの概要をまとめました。</p>
<p>また、ランダムフォレストを使って、既に複数のカーネル（コード）も公開されていましたので、機械学習初心者向けのハンズオンチュートリアルもまとめています。機械学習を勉強されている方は、これを機会にKaggleへの参加をしてみてはいかがでしょうか？</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:#000000;border-top-left-radius:1px;border-top-right-radius:1px">Kaggleへ挑戦する前に…</div><div class="su-box-content su-u-clearfix su-u-trim" style="border-bottom-left-radius:1px;border-bottom-right-radius:1px">
<p>初めて機械学習に学ぶのであれば、Kaggleへ参加する前に初歩的な手法から学ぶのがオススメです。環境構築が不要、オンラインで実行が可能な機械学習入門チュートリアルを公開中！機械学習の世界へ飛び込んでみませんか？</p>
<ul>
<li><a href="https://www.codexa.net/tutorial-linear-regression-for-beginner/">スクラッチで最小二乗法と最急降下法をPythonでコーディング（線形回帰）</a></li>
<li><a href="https://www.codexa.net/tutorial-logistic-regression-for-beginner/">ロジスティック回帰の概要や数学的理解と実践に役立つ知識（ロジスティック回帰）</a></li>
</ul>
</div></div>
<h3></h3>
<h3>メルカリ 価格予測チャレンジ概要</h3>
<p><img loading="lazy" class="aligncenter size-full wp-image-558" src="https://www.codexa.net/wp-content/uploads/2017/11/mercari-kaggle-challenge.png" alt="" width="945" height="207" srcset="https://www.codexa.net/wp-content/uploads/2017/11/mercari-kaggle-challenge.png 945w, https://www.codexa.net/wp-content/uploads/2017/11/mercari-kaggle-challenge-300x66.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/mercari-kaggle-challenge-768x168.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/mercari-kaggle-challenge-304x67.png 304w" sizes="(max-width: 945px) 100vw, 945px" /></p>
<p>Kaggleメルカリチャレンジでは、販売者が投稿した情報を基に「適正な販売価格」を予測するチャレンジです。訓練データとして、ユーザーが投稿した商品情報やカテゴリ、さらに商品の状態やブランド名などが与えられており、それらを基に販売価格を予測するモデル作成が課題です！</p>
<p>下記、Kaggleメルカリチャレンジの必要な概要情報まとめです。</p>
<ul>
<li>コンペ開始日は2017年11月21日</li>
<li>エントリー締切日は2018年2月7日</li>
<li>課題提出締切日は2018年2月14日</li>
<li>このチャレンジは「カーネルオンリー」（カーネルの提出をしないと評価されません）</li>
<li>現在公開されているデータ（Stage1）のカーネルを使ってStage2のデータ予測を行う</li>
<li>チャレンジの最終ランキングはStage2のスコアが基準となる</li>
<li>賞金は1位60,000米ドル、2位30,000米ドル、3位10,000米ドル</li>
</ul>
<p>まだ公開されて4日目と間もないですが、既に231チームが参加しています。現時点でのトップスコアは「0.44408」ですが、時間が経つにつれてスコアは改善されるかと！公開ランキングでは、既に日本人らしきお名前も数名見かけます！（頑張りましょう！！）</p>
<p>では、早速データの簡単な概要と、ランダムフォレストを使った初心者向けKaggleメルカリのハンズオンチュートリアルをやっていきましょう。</p>
<h3>Kaggleメルカリ初心者向けチュートリアル概要</h3>
<p><span style="color: #ff6363;"><strong>本チュートリアルは、機械学習初心者向けの内容</strong></span>となっています。既にKaggleへ参加しているデータサイエンティストの皆々様からは厳しいツッコミがありそうですが・・暖かい目で見守ってください。（笑）</p>
<p><span style="text-decoration: underline;">チュートリアルで使うもの</span></p>
<ul>
<li>Python 3.X</li>
<li>Pandas</li>
<li>Numpy</li>
<li>scikit-learn</li>
<li>Jupyter Notebook（必須ではありません）</li>
</ul>
<p>Python 2をお使いの方がいましたら、3を使うようにお願いします。それ以外のライブラリは、おそらくバージョンが多少違くても問題ないかと思います。</p>
<p><span style="text-decoration: underline;">チュートリアルで行う内容</span></p>
<ul>
<li>Kaggleメルカリチャレンジのデータの確認</li>
<li>データ事前処理</li>
<li>ランダムフォレストのモデル作成</li>
<li>予測データのCSV書き出し</li>
<li>Kaggleへの投稿</li>
</ul>
<p>メルカリチャレンジの「Kernels」ページでは既にたくさんのランダムフォレストを使った予測モデルが公開されています。本チュートリアルでは、同様にランダムフォレストを使った予測を行います。Kaggleメルカリチャレンジへ投稿（Submit）すると「0.53」のスコアとなります。（11月25日時点で100位以内/231位）</p>
<p>参考までにですが、本チュートリアルはMac macOS High Sierra、メモリ 8GB、プロセッサ2.4GHz Core i5で、<strong>15分〜20分程度で処理が完了</strong>しました。</p>
<h3>Kaggleメルカリのデータ確認</h3>
<p>では、早速やってみましょう。まずは必要なものをインポートしておきましょう。</p><pre class="crayon-plain-tag">import pandas as pd
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from IPython.display import display
from sklearn import metrics
from sklearn.model_selection import train_test_split
pd.set_option('display.float_format', lambda x:'%.5f' % x)
import numpy as np</pre><p>
次にメルカリから提供されているトレーニングとテストデータを読み込みましょう。<a href="https://www.kaggle.com/c/mercari-price-suggestion-challenge/data" target="_blank" rel="nofollow noopener">Kaggle Mercari Price Suggestion Challenge Data</a>のページからダウンロードが可能です。ダウンロードにはKaggleへの無料会員登録とコンペ参加規約への同意が必要ですので、まだ会員でない方は、まずはKaggleへの登録をしましょう。</p>
<p>メルカリから提供されているデータ形式ですが、「.7z」の形式となっています。Macをお使いの方は、「<a href="https://itunes.apple.com/jp/app/the-unarchiver/id425424353?mt=12&amp;ign-mpt=uo%3D4" target="_blank" rel="nofollow noopener">The Unarchiver</a>」 で解凍が可能です。（無料でApp Storeより入手可能）</p>
<p>Kaggleからデータをダウンロードして解凍が出来たら、Pandasでデータフレームへ読み込みを行いましょう。</p><pre class="crayon-plain-tag"># データタイプを指定
types_dict_train = {'train_id':'int64', 'item_condition_id':'int8', 'price':'float64', 'shipping':'int8'}
types_dict_test = {'test_id':'int64', 'item_condition_id':'int8', 'shipping':'int8'}

# tsvファイルからPandas DataFrameへ読み込み
train = pd.read_csv('train.tsv', delimiter='\t', low_memory=True, dtype=types_dict_train)
test = pd.read_csv('test.tsv', delimiter='\t', low_memory=True, dtype=types_dict_test)</pre><p>
お決まりですが、ひとまずheadとshapeでデータのサイズと中身をチラ見してみましょう。</p><pre class="crayon-plain-tag"># trainとtestのデータフレームの冒頭5行を表示させる
train.head()
test.head()

# trainとtestのサイズを確認
train.shape, test.shape

((1482535, 9), (693359, 8))</pre><p>
<div id="attachment_563" style="width: 1003px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-563" loading="lazy" class="wp-image-563 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/train_head.png" alt="" width="993" height="229" srcset="https://www.codexa.net/wp-content/uploads/2017/11/train_head.png 993w, https://www.codexa.net/wp-content/uploads/2017/11/train_head-300x69.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/train_head-768x177.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/train_head-304x70.png 304w" sizes="(max-width: 993px) 100vw, 993px" /><p id="caption-attachment-563" class="wp-caption-text">trainの最初5行</p></div>
<div id="attachment_562" style="width: 1003px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-562" loading="lazy" class="wp-image-562 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/test_head.png" alt="" width="993" height="229" srcset="https://www.codexa.net/wp-content/uploads/2017/11/test_head.png 993w, https://www.codexa.net/wp-content/uploads/2017/11/test_head-300x69.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/test_head-768x177.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/test_head-304x70.png 304w" sizes="(max-width: 993px) 100vw, 993px" /><p id="caption-attachment-562" class="wp-caption-text">testの最初5行</p></div>
<p>トレーニングデータは1,482,535個のユーザーが投稿した販売商品のデータセットとなっています。同様にテストデータは693,359個となりますが、「価格（Price）」の項目がテストデータは含まれていませんので列数は「8」となっています。</p>
<p>各データの情報を簡単にまとめました。</p>
<ul>
<li>train_id / test _id &#8211; ユーザー投稿のID</li>
<li>name &#8211; 投稿のタイトル。タイトルに価格に関する情報がある場合（例：$20）はメルカリが事前に削除をして[rm]と置き換えています。</li>
<li>item_condition_id &#8211; ユーザーが指定した商品の状態</li>
<li>category_name &#8211; 投稿カテゴリー</li>
<li>brand_name &#8211; ブランドの名前</li>
<li>price &#8211; 訓練データのみ。実際に売られた価格。米ドル表示。今回のチャレンジの予測ターゲットとなります。</li>
<li>shipping &#8211; 送料のフラグ。「1」は販売者負担。「0」は購入者負担。</li>
<li>item_description &#8211; ユーザーが投稿した商品説明の全文。タイトルと同様に価格情報がある場合は[rm]と置き換えられています。</li>
</ul>
<p>冒頭でも触れましたが、Kaggleメルカリチャレンジではこのダウンロードしたデータは「ステージ1」のデータとなります。実際にランキングの評価となるテストデータは、メルカリが新たに提供する「ステージ2」のデータです。（締切日までに投稿されたカーネルに自動的にステージ2のテストデータが提供されてスコアが算出されます）</p>
<p>次にデータの統計量を確認しましょう。Pandasの行と列の表示オプションを最大にして表示する「display_all」を作成して、trainとtestの統計量を確認します。「transpose」で列と行を転置しています。</p><pre class="crayon-plain-tag">def display_all(df):
    with pd.option_context("display.max_rows", 1000):
        with pd.option_context("display.max_columns", 1000):
            display(df)

# trainの基本統計量を表示
display_all(train.describe(include='all').transpose())</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-566" src="https://www.codexa.net/wp-content/uploads/2017/11/train_describe.png" alt="" width="900" height="261" srcset="https://www.codexa.net/wp-content/uploads/2017/11/train_describe.png 900w, https://www.codexa.net/wp-content/uploads/2017/11/train_describe-300x87.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/train_describe-768x223.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/train_describe-304x88.png 304w" sizes="(max-width: 900px) 100vw, 900px" /></p>
<p>ふむふむ。「item_description」の「Top」では「No description yet」と出ていますね。商品説明がしっかり入っている訳ではなさそうですね。価格（price）は平均（mean）が26.74ドルで標準偏差（std)が38.59ドル。最小値が0ドル、最大値は2009ドルとなっています。一体、メルカリで2009ドルもの高価なものが売れているのに驚きが隠せませんが、それよりも最小値0ドルも気になります。</p>
<p>あんまり深追いすると進みませんので、サクサクと次にいきましょう！</p>
<p>次は、下記の4つの文字列を値として持っている項目を「category」のデータタイプへ変換をしましょう。</p>
<p>データタイプを文字列からcategoryへ変換する項目（trainとtestで同項目）</p>
<ul>
<li>category_name</li>
<li>item_description</li>
<li>name</li>
<li>brand_name</li>
</ul>
<pre class="crayon-plain-tag"># trainのカテゴリ名、商品説明、投稿タイトル、ブランド名のデータタイプを「category」へ変換する
train.category_name = train.category_name.astype('category')
train.item_description = train.item_description.astype('category')
train.name = train.name.astype('category')
train.brand_name = train.brand_name.astype('category')

# testのカテゴリ名、商品説明、投稿タイトル、ブランド名のデータタイプを「category」へ変換する
test.category_name = test.category_name.astype('category')
test.item_description = test.item_description.astype('category')
test.name = test.name.astype('category')
test.brand_name = test.brand_name.astype('category')

# dtypesで念のためデータ形式を確認しましょう
train.dtypes, test.dtypes</pre>
<div id="attachment_568" style="width: 454px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-568" loading="lazy" class="wp-image-568 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/dtypes.png" alt="" width="444" height="151" srcset="https://www.codexa.net/wp-content/uploads/2017/11/dtypes.png 444w, https://www.codexa.net/wp-content/uploads/2017/11/dtypes-300x102.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/dtypes-304x103.png 304w" sizes="(max-width: 444px) 100vw, 444px" /><p id="caption-attachment-568" class="wp-caption-text">左がtranで右がtestです。指定した項目のデータ形式が「category」に変換されているのが確認できます。</p></div>
<p>次はデータのユニーク値を確認しておきましょう。</p><pre class="crayon-plain-tag"># trainの中のユニークな値を確認する
train.apply(lambda x: x.nunique())

# testの中のユニークな値を確認する
test.apply(lambda x: x.nunique())</pre><p>
<div id="attachment_569" style="width: 442px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-569" loading="lazy" class="wp-image-569 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/unique_df.png" alt="" width="432" height="143" srcset="https://www.codexa.net/wp-content/uploads/2017/11/unique_df.png 432w, https://www.codexa.net/wp-content/uploads/2017/11/unique_df-300x99.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/unique_df-304x101.png 304w" sizes="(max-width: 432px) 100vw, 432px" /><p id="caption-attachment-569" class="wp-caption-text">左がtrainで右がtestのユニーク値の確認テーブル</p></div>
<p>当然ではありますが、train、test共にIDはしっかりとユニークな値となっています。カテゴリやブランド名の重複は当然ですが、投稿タイトル（name）にも重複データが結構ありますね。先に確認しましたが商品説明では「No Description yet」（商品説明がまだありません）があったので、こちらも重複があって当然ですね。</p>
<p>モデルを作成する前に必ずやらなくてはいけない作業、欠損データの確認もしておきましょう！</p><pre class="crayon-plain-tag"># trainの欠損データの個数と%を確認
train.isnull().sum(),train.isnull().sum()/train.shape[0]

# testの欠損データの個数と%を確認
test.isnull().sum(),test.isnull().sum()/test.shape[0]</pre><p>
<div id="attachment_570" style="width: 527px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-570" loading="lazy" class="wp-image-570 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/missing_df.png" alt="" width="517" height="264" srcset="https://www.codexa.net/wp-content/uploads/2017/11/missing_df.png 517w, https://www.codexa.net/wp-content/uploads/2017/11/missing_df-300x153.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/missing_df-304x155.png 304w" sizes="(max-width: 517px) 100vw, 517px" /><p id="caption-attachment-570" class="wp-caption-text">左がtrainで右がtestです。最初に欠損データ数を表示して、次に欠損データの割合を表示しています</p></div>
<p>カテゴリ名（category_name）とブランド名（brand_name）は欠損数が大きいですね。ブランド名の欠損度合いはかなり大きいのも確認できます。データの簡単な確認も行えましたので、次からはデータの事前処理を行なっていきましょう。</p>
<h3>Kaggleメルカリ データ事前処理</h3>
<p>さて、ランダムフォレストのモデルを作成するためにデータの事前処理を行なっていきましょう。事前処理の流れとしては・・</p>
<ol>
<li>trainとtestのデータを連結させる</li>
<li>連結させたDataFrameの文字列のデータ形式を「cateogry」へ変換</li>
<li>文字列を数値へ値を変換</li>
<li>訓練用データの「price」をnp.log()で処理</li>
<li>ランダムフォレスト用にxとy（ターゲット）で分ける</li>
</ol>
<p>ランダムフォレストのモデルを作るため、文字列のデータ（例：投稿タイトルやカテゴリ名など）をPandasの関数を使って一気に数値へと変換させます。そのため、testとtrainで別々に処理を行わず、連結して事前処理を行います。</p>
<p>文字列を数値へ変換したら、testとtrainへ改めて分けて、さらにランダムフォレスト作成のため、trainからターゲット（つまりprice）を分ける処理を行います。</p>
<p>文章で見ると・・いまいちパッとしませんので、実際にコードを見ていきましょう！</p>
<p>まずは、trainとtestのIDのカラム名を変更して、さらにデータ連結後でもどちらのデータに属しているかわかるようにフラグをつけておきましょう。</p><pre class="crayon-plain-tag"># trainとtestのidカラム名を変更する
train = train.rename(columns = {'train_id':'id'})
test = test.rename(columns = {'test_id':'id'})

# 両方のセットへ「is_train」のカラムを追加
# 1 = trainのデータ、0 = testデータ
train['is_train'] = 1
test['is_train'] = 0

# trainのprice(価格）以外のデータをtestと連結
train_test_combine = pd.concat([train.drop(['price'], axis=1),test],axis=0)

# 念のためデータの中身を表示させましょう
train_test_combine.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-572" src="https://www.codexa.net/wp-content/uploads/2017/11/train_test_combine_head.png" alt="" width="893" height="202" srcset="https://www.codexa.net/wp-content/uploads/2017/11/train_test_combine_head.png 893w, https://www.codexa.net/wp-content/uploads/2017/11/train_test_combine_head-300x68.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/train_test_combine_head-768x174.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/train_test_combine_head-304x69.png 304w" sizes="(max-width: 893px) 100vw, 893px" /></p>
<p>これで、trainとtestのデータの連結が「train_test_combine」に入りました。念のためshapeを確認すると「(2175894, 8)」と訓練データ1,482,535個とテストデータ693,359個の合計になっているのが確認できます。</p>
<p>次は、文字列のデータを数値へ変換しましょう。先に「train」と「test」を個別に文字列データの形式をcategoryに変換しましたが、同様に、連結させたデータ（train_test_combine）のデータ形式も変更をしましょう。</p>
<p>category形式に変換したら、pandasのcat.codesで数値へ変換を行います。</p><pre class="crayon-plain-tag"># train_test_combineの文字列のデータタイプを「category」へ変換
train_test_combine.category_name = train_test_combine.category_name.astype('category')
train_test_combine.item_description = train_test_combine.item_description.astype('category')
train_test_combine.name = train_test_combine.name.astype('category')
train_test_combine.brand_name = train_test_combine.brand_name.astype('category')

# combinedDataの文字列を「.cat.codes」で数値へ変換する
train_test_combine.name = train_test_combine.name.cat.codes
train_test_combine.category_name = train_test_combine.category_name.cat.codes
train_test_combine.brand_name = train_test_combine.brand_name.cat.codes
train_test_combine.item_description = train_test_combine.item_description.cat.codes

# データの中身とデータ形式を表示して確認しましょう
train_test_combine.head()
train_test_combine.dtypes</pre><p>
<div id="attachment_574" style="width: 569px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-574" loading="lazy" class="wp-image-574 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/combine_head.png" alt="" width="559" height="140" srcset="https://www.codexa.net/wp-content/uploads/2017/11/combine_head.png 559w, https://www.codexa.net/wp-content/uploads/2017/11/combine_head-300x75.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/combine_head-304x76.png 304w" sizes="(max-width: 559px) 100vw, 559px" /><p id="caption-attachment-574" class="wp-caption-text">train_test_combineのヘッド情報</p></div>
<div id="attachment_575" style="width: 191px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-575" loading="lazy" class="wp-image-575 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/data_combine_dtypes.png" alt="" width="181" height="143" /><p id="caption-attachment-575" class="wp-caption-text">train_test_combineのdtypes</p></div>
<p>しっかりと文字列の値が数値へ変換されていますね。念のため表示したdtypesでも、objectからintへ変換されているのが確認できます。</p>
<p>数値へ変換が行えましたので、ここでtestとtrainへまた分けましょう。「is_train」（trainとtestのどちらに属するかを示すフラグ）は不要なので、この段階で落として、念のため、分け終わった後のtrain、testのデータフレームのサイズを確認しておきましょう。</p><pre class="crayon-plain-tag"># 「is_train」のフラグでcombineからtestとtrainへ切り分ける
df_test = train_test_combine.loc[train_test_combine['is_train'] == 0]
df_train = train_test_combine.loc[train_test_combine['is_train'] == 1]

# 「is_train」をtrainとtestのデータフレームから落とす
df_test = df_test.drop(['is_train'], axis=1)
df_train = df_train.drop(['is_train'], axis=1)

# サイズの確認をしておきましょう
df_test.shape, df_train.shape

((693359, 7), (1482535, 7))</pre><p>
さて、とうとう次でデータ事前処理の最後のステップとなります！無事に文字列→数値へ変換ができましたので、「df_train」（訓練データ）へ「train」の価格（price）を戻して、log関数で処理を行いましょう。</p><pre class="crayon-plain-tag"># df_trainへprice（価格）を戻す
df_train['price'] = train.price

# price（価格）をlog関数で処理
df_train['price'] = df_train['price'].apply(lambda x: np.log(x) if x&gt;0 else x)

# df_trainを表示して確認
df_train.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-576" src="https://www.codexa.net/wp-content/uploads/2017/11/df_train_head.png" alt="" width="559" height="143" srcset="https://www.codexa.net/wp-content/uploads/2017/11/df_train_head.png 559w, https://www.codexa.net/wp-content/uploads/2017/11/df_train_head-300x77.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/df_train_head-304x78.png 304w" sizes="(max-width: 559px) 100vw, 559px" /></p>
<p>カテゴリ名（category_name）や投稿タイトル（name）などがしっかりと数値に変換されているのが確認できます。参考までにですが、上記のheadのデータのbrand_nameでも確認できますが、文字列から数値へcat.codesへ変換した際に、異常値は「-1」として戻ります。</p>
<p>非常にシンプルなものですが、これでデータセットの事前処理は終わりました！次は、いよいよランダムフォレストのモデルをこのデータを使って作成していきましょう。</p>
<h3>ランダムフォレストのモデル作成</h3>
<p>もうここまで来れば、（気持ち的に）予測が完了したも同然です笑。では、処理をしたデータを使って、scikit-learnのRandomForestRegressorでモデルを作りましょう！</p>
<p>（<strong>処理完了までMac macOS High Sierra、メモリ 8GB、プロセッサ2.4GHz Core i5で、15分〜20分程度かかりました）</strong></p><pre class="crayon-plain-tag"># x ＝ price以外の全ての値、y = price（ターゲット）で切り分ける
x_train, y_train = df_train.drop(['price'], axis=1), df_train.price

# モデルの作成
m = RandomForestRegressor(n_jobs=-1, min_samples_leaf=5, n_estimators=200)
m.fit(x_train, y_train)

# スコアを表示
m.score(x_train, y_train)</pre><p>
さぁ・・・・気になるスコアは・・・</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-577" src="https://www.codexa.net/wp-content/uploads/2017/11/score.png" alt="" width="469" height="64" srcset="https://www.codexa.net/wp-content/uploads/2017/11/score.png 469w, https://www.codexa.net/wp-content/uploads/2017/11/score-300x41.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/score-304x41.png 304w" sizes="(max-width: 469px) 100vw, 469px" /></p>
<p>となりました（笑）</p>
<p>モデルも作れましたので、先に処理を指定た「df_test」（テスト用データ）を入れて、実際の予測値を出しましょう。</p>
<p>予測値が出たら、指数関数（np.exp()）で処理をして、Pandasシリーズへ落とし込み、メルカリチャレンジの予測提出ファイル形式へ処理をしてCSVの書き出しを行いましょう！</p><pre class="crayon-plain-tag"># 作成したランダムフォレストのモデル「m」に「df_test」を入れて予測する
preds = m.predict(df_test)

# 予測値 predsをnp.exp()で処理
np.exp(preds)

# Numpy配列からpandasシリーズへ変換
preds = pd.Series(np.exp(preds))

# テストデータのIDと予測値を連結
submit = pd.concat([df_test.id, preds], axis=1)

# カラム名をメルカリの提出指定の名前をつける
submit.columns = ['test_id', 'price']

# 提出ファイルとしてCSVへ書き出し
submit.to_csv('submit_rf_base.csv', index=False)</pre><p>
自分のパソコンで処理を行なっていた方であれば、「submit_rf_base.csv」のファイルが書き出しされているかと思います。</p>
<p>今回のKaggleメルカリコンペですが、カーネルでのみ評価提出が可能なので、もしKaggleへ実際に投稿してみたい方は、Kaggleのカーネルへ上記コードを入れて提出をしましょう！</p>
<p><strong>冒頭でもお話をしましたが、こちらの処理でスコア「0.53」となります。（11月25日時点で100位以内/231位）</strong></p>
<h3>まとめ</h3>
<p>いかがでしたでしょうか？すでにKaggleメルカリチャレンジへ参加しているチームは日に日に増えており、さらに上位スコアも伸びてきています！</p>
<p>codexaでは日本でのカグラーのマッチングも行なっています！もし一人で参加するより、チームに参加して挑戦してみたいとお考えの方は、<a href="https://www.codexa.net/contact/" target="_blank" rel="nofollow noopener">お問い合わせ</a>にて<strong>Kaggleの公開プロフィールURLを記載</strong>してご連絡ください！スキルレベルが同等のメンバー様とマッチングいたします。</p>
<p>まだ機械学習を始めたばかりの方は、<a href="https://www.codexa.net/kaggle-titanic-beginner/" target="_blank" rel="noopener">Kaggleタイタニックのチュートリアル</a>もやってみてはいかがでしょうか？今回はランダムフォレストを使用しましたが、タイタニックでは「決定木」を使っています。</p>
<p>も間違いなどがありましたら・・コメント欄にてご指導・ご指摘をお願い致します！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>【Kaggle初心者入門編】タイタニック号で生き残るのは誰？</title>
		<link>https://www.codexa.net/kaggle-titanic-beginner/</link>
					<comments>https://www.codexa.net/kaggle-titanic-beginner/#comments</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Fri, 24 Nov 2017 05:53:24 +0000</pubDate>
				<category><![CDATA[Kaggle]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=501</guid>

					<description><![CDATA[Kaggleの中でも特に有名な課題として「Titanic : Machine Learning from Disaster」（意訳：タイタニック号：災害からの機械学習）があります。先日に「Kaggleとは？機械学習初心者 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Kaggleの中でも特に有名な課題として「<a href="https://www.kaggle.com/c/titanic" target="_blank" rel="nofollow noopener">Titanic : Machine Learning from Disaster</a>」（意訳：タイタニック号：災害からの機械学習）があります。先日に「<a href="https://www.codexa.net/what-is-kaggle/">Kaggleとは？機械学習初心者が知っておくべき3つの使い方</a>」にて、初心者向けのKaggleの利用のコツをまとめましたが、今回はKaggleで公開されている実際のデータセットを使って、機械学習で予測を作って投稿してみましょう。</p>
<h3>この記事の概要と対象者</h3>
<p>今回のKaggle紹介記事では、Kaggle初心者向けに公開されているデータセットを使って「タイタニックの生存者予測」をPythonを使って行います。<strong>Pythonはある程度使えるけど・・機械学習を触ったことが無い、とりあえず機械学習をやってみたい</strong>、という方に向けた記事です。（<strong><span style="color: #ff6969;">機械学習中〜上級者の方には、物足りない内容です</span></strong>）</p>
<p><span style="text-decoration: underline;">このチュートリアルで使うもの</span></p>
<ul>
<li>Python 3.X</li>
<li>Pandas</li>
<li>Numpy</li>
<li>scikit-learn</li>
</ul>
<p><span style="text-decoration: underline;">行う内容</span></p>
<ul>
<li>データセットの確認</li>
<li>データセットの事前処理</li>
<li>「決定木」予測その1</li>
<li>「決定木」予測その2</li>
<li>まとめ</li>
</ul>
<p>Pythonを使ってデータを読み込むところから、実際に機械学習のモデルを作成・予測してKaggleへデータを投稿するところまで、手順をまとめています。ぜひ、ご自身のパソコンを使って同じ手順を踏んでみてください。</p>
<p>また、私は便宜上、jupyter notebookを使用しています。pythonを直接叩いても当然処理は可能ですが、プログラムの保存・共有も簡単ですし、「セルコーディング」と呼ばれるセル単位でメモやコーディングが可能なメリットもあります。機械学習をやっている肩であれば、使っている人も多いので、まだ導入されていない方がいれば、是非この機会にインストールしてみてください。</p>
<p><a href="https://jupyter.readthedocs.io/en/latest/install.html">https://jupyter.readthedocs.io/en/latest/install.html</a> （リンク先英語）</p>
<h3>まずはデータセットの確認＆事前処理</h3>
<p>機械学習では「データセットが9割の仕事を占める」と言われているくらい、データセットの確認や事前処理が非常に重要な意味合いを持ちます。では、実施にKaggleからデータをダウロードして、今回使うデータの内容を確認して行きましょう。</p>
<h5>Kaggle無料会員登録＆CSVダウンロード</h5>
<p>Kaggleの利用には無料会員登録が必要となります。まだアカウントをお持ちでいない方は、<a href="https://www.kaggle.com/" target="_blank" rel="noopener">こちら</a>から登録をしましょう。</p>
<p>登録が完了したら、<a href="https://www.kaggle.com/c/titanic/data" target="_blank" rel="noopener">Kaggleタイタニックのデータページ</a>へ移動をお願いします。こちらのページにて今回使う下記のCSVのダウロードをしましょう。</p>
<ul>
<li>train.csv （59.76 KB）</li>
<li>test.csv（27.96 KB）</li>
</ul>
<p>Kaggleタイタニックの課題ですが、実施のコンペティション（コンペ課題）とは異なり、Kaggle側が用意した機械学習初心者向けの課題となっています。ですので、提供されているデータも非常に作りは単純で、またファイルサイズも小さいことから、とても扱いやすいデータとなっています。</p>
<p>また、全て英語での説明となりますが、「Data」のページでは提供されているデータセットの詳細の説明も記載されています。コンペへ参加をする場合は、必ずこのDataページの説明を熟読しましょう。</p>
<h4>CSVを読み込んで内容を確認しましょう</h4>
<p>今回のチュートリアルではNumpyとPandasを使いますので、インポートをして、先ほどダウロードした「train.csv」と「test.csv」をデータフレーム形式で読み込みましょう。csvの格納先のディレクトリは各自、指定をしてから読み込みをしましょう。</p><pre class="crayon-plain-tag">import pandas as pd
import numpy as np

train = pd.read_csv("../ディレクトリを指定/train.csv")
test = pd.read_csv("../ディレクトリを指定/test.csv")</pre><p>
各csvに何が含まれているか、まずは確認をしてみましょう。</p><pre class="crayon-plain-tag">train.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-513" src="https://www.codexa.net/wp-content/uploads/2017/11/output_1.png" alt="" width="979" height="171" srcset="https://www.codexa.net/wp-content/uploads/2017/11/output_1.png 979w, https://www.codexa.net/wp-content/uploads/2017/11/output_1-300x52.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/output_1-768x134.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/output_1-304x53.png 304w" sizes="(max-width: 979px) 100vw, 979px" /></p>
<p>Pandasのhead()を使うと、データフレームの最上部5段がデフォルトで表示されます。つまり、上の表は「train.csv」のカラム名と最上部5段の情報となります。各カラムの簡単な説明をは以下の通りです。</p>
<ul>
<li>PassengerId &#8211; 乗客識別ユニークID</li>
<li>Survived &#8211; 生存フラグ（0=死亡、1=生存）</li>
<li>Pclass &#8211; チケットクラス</li>
<li>Name &#8211; 乗客の名前</li>
<li>Sex &#8211; 性別（male=男性、female＝女性）</li>
<li>Age &#8211; 年齢</li>
<li>SibSp &#8211; タイタニックに同乗している兄弟/配偶者の数</li>
<li>parch &#8211; タイタニックに同乗している親/子供の数</li>
<li>ticket &#8211; チケット番号</li>
<li>fare &#8211; 料金</li>
<li>cabin &#8211; 客室番号</li>
<li>Embarked &#8211; 出港地（タイタニックへ乗った港）</li>
</ul>
<p>以上が訓練データとして提供されている項目となります。さらに各変数の簡単な説明も記載をしておきます。</p>
<p>pclass = チケットクラス</p>
<p>1 = 上層クラス（お金持ち）<br />
2 = 中級クラス（一般階級）<br />
3 = 下層クラス（労働階級）</p>
<p>Embarked = 各変数の定義は下記の通り</p>
<p>C = Cherbourg<br />
Q = Queenstown<br />
S = Southampton</p>
<p>では、次に<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test.csv&nbsp;</span>も内容を簡単に確認してみましょう。</p><pre class="crayon-plain-tag">test.head()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-517" src="https://www.codexa.net/wp-content/uploads/2017/11/test-1.png" alt="" width="821" height="170" srcset="https://www.codexa.net/wp-content/uploads/2017/11/test-1.png 821w, https://www.codexa.net/wp-content/uploads/2017/11/test-1-300x62.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/test-1-768x159.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/test-1-304x63.png 304w" sizes="(max-width: 821px) 100vw, 821px" /></p>
<p>こちらの<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>には、<strong>Survived</strong>のカラムが無いのが確認できます。他のカラムは<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>と同様です。つまり、<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>の乗客の情報と「Survived（生存したかどうか）」の答えを機械学習して、<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>で提供されている乗客情報を元に、生存したか死亡したかの予測を作るのが課題ということです。</p>
<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>と<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>の簡単な統計情報とサイズも確認しておきましょう。<br />
<pre class="crayon-plain-tag">test_shape = test.shape
train_shape = train.shape

print(test_shape)
print(train_shape)</pre>
<pre class="crayon-plain-tag">(418, 11)
(891, 12)</pre>
<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>は418名の乗客情報で、<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>は891名の乗客情報ですね。カラム数が異なるのは、前述しましたが<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>には「Survived」のカラムがあるからです。</p>
<p>次にpandasのdescribe()を使って、各データセットの基本統計量も確認しておきましょう。</p><pre class="crayon-plain-tag">test.describe()
train.describe()</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-530" src="https://www.codexa.net/wp-content/uploads/2017/11/describe.png" alt="" width="596" height="501" srcset="https://www.codexa.net/wp-content/uploads/2017/11/describe.png 596w, https://www.codexa.net/wp-content/uploads/2017/11/describe-300x252.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/describe-255x214.png 255w, https://www.codexa.net/wp-content/uploads/2017/11/describe-188x158.png 188w" sizes="(max-width: 596px) 100vw, 596px" /></p>
<p>上記表の上が<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>で下が<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>の統計量情報となります。</p>
<p>各データのshapeを確認した通り、両データ共に「PassengerId」はTrain=891カウント、test＝418カウントと一致していますね。どうやら「Age」など一部のカラムでカウント数が少ない＝つまり欠損データがあるようです。</p>
<p>次は両データセットの欠損データを確認していきましょう。</p>
<h4>データセットの欠損の確認</h4>
<p>提供されている（または使う）データセットで100%データが揃っていることの方が珍しいくらいです。どこかのデータが欠損してたり、信用性が低いため使えなかったりする場合がほとんどです。</p>
<p>dataframeの欠損データをisnull()で探して、カラム毎に返す関数kesson_table()を作って、<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>と<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>のデータフレームの欠損を確認しましょう。</p><pre class="crayon-plain-tag">def kesson_table(df): 
        null_val = df.isnull().sum()
        percent = 100 * df.isnull().sum()/len(df)
        kesson_table = pd.concat([null_val, percent], axis=1)
        kesson_table_ren_columns = kesson_table.rename(
        columns = {0 : '欠損数', 1 : '%'})
        return kesson_table_ren_columns

kesson_table(train)
kesson_table(test)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-525" src="https://www.codexa.net/wp-content/uploads/2017/11/kesson-tables.png" alt="" width="470" height="411" srcset="https://www.codexa.net/wp-content/uploads/2017/11/kesson-tables.png 470w, https://www.codexa.net/wp-content/uploads/2017/11/kesson-tables-300x262.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/kesson-tables-245x214.png 245w, https://www.codexa.net/wp-content/uploads/2017/11/kesson-tables-181x158.png 181w" sizes="(max-width: 470px) 100vw, 470px" /></p>
<p>左が<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>で右が<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>の欠損データを表しています。思ったよりもしっかりとしたデータではありますが、特に「Age」と「Cabin」の2つの項目で欠損が多いですね。</p>
<p>では、欠損データを含めたデータの事前処理を次は行なっていきましょう！</p>
<h4>データセットの事前処理</h4>
<p>データセットの事前処理が一番重要ですが、今回はあくまでKaggle初心者向けチュートリアルですので、基本的なことを行なっていきます。このチュートリアルで行う内容としては・・</p>
<p>(1) 欠損データを代理データに入れ替える<br />
(2) 文字列カテゴリカルデータを数字へ変換</p>
<p>の2つの事前処理を行なっていきましょう！</p>
<p>では、まずは欠損データへ代わりとなる代理データを入れていきましょう。</p>
<p>まずは<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>から綺麗にしていきましょう。先に確認しましたが、<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>では「Age」「Embarked」「Cabin」の3カラムに欠損データがありましたね。今回のチュートリアルでは「Cabin」は予測モデルで使わないので、「Age」と「Embarked」の2つの欠損データを綺麗にしていきましょう。</p>
<p>まず「Age」ですが、シンプルに<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>の全データの中央値（Median）を代理として使いましょう。（代理データで何を使うか、どのような処理を加えるかは非常に重要かつ大きな議論ではありますが、ここはシンプルに考えて進めます）</p>
<p>次に「Embarked」（出港地）ですが、こちらも2つだけ欠損データが<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>に含まれています。他のデータを確認すると「S」が一番多い値でしたので、代理データとして「S」を使いましょう。</p><pre class="crayon-plain-tag">train["Age"] = train["Age"].fillna(train["Age"].median())
train["Embarked"] = train["Embarked"].fillna("S")


kesson_table(train)</pre><p>
各カラムでfillna()を使って代理となるデータを入れておきましょう。先ほど作ったkesson_table()で年のため欠損データがないかどうか確認をしましょう。Cabinは今回は使いませんので欠損データがあっても大丈夫ですが、「Age」「Embarked」の欠損は埋まりましたね。</p>
<div id="attachment_534" style="width: 223px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-534" loading="lazy" class="wp-image-534 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/train-kesson-filled.png" alt="" width="213" height="352" srcset="https://www.codexa.net/wp-content/uploads/2017/11/train-kesson-filled.png 213w, https://www.codexa.net/wp-content/uploads/2017/11/train-kesson-filled-182x300.png 182w, https://www.codexa.net/wp-content/uploads/2017/11/train-kesson-filled-129x214.png 129w, https://www.codexa.net/wp-content/uploads/2017/11/train-kesson-filled-96x158.png 96w" sizes="(max-width: 213px) 100vw, 213px" /><p id="caption-attachment-534" class="wp-caption-text">trainの欠損データを代理データで埋めました</p></div>
<p>欠損データの処理が終わりましたので、次はカテゴリカルデータの文字列を数字に変換しましょう。今回の予想で使う項目で文字列を値として持っているカラムは「Sex」と「Embarked」の2種類となります。Sexは「male」「female」の2つのカテゴリー文字列、Embarkedはは「S」「C」「Q」の3つの文字列となります。これらを数字に変換しましょう。</p><pre class="crayon-plain-tag">train["Sex"][train["Sex"] == "male"] = 0
train["Sex"][train["Sex"] == "female"] = 1
train["Embarked"][train["Embarked"] == "S" ] = 0
train["Embarked"][train["Embarked"] == "C" ] = 1
train["Embarked"][train["Embarked"] == "Q"] = 2

train.head(10)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-535" src="https://www.codexa.net/wp-content/uploads/2017/11/train_modified.png" alt="" width="961" height="306" srcset="https://www.codexa.net/wp-content/uploads/2017/11/train_modified.png 961w, https://www.codexa.net/wp-content/uploads/2017/11/train_modified-300x96.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/train_modified-768x245.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/train_modified-304x97.png 304w" sizes="(max-width: 961px) 100vw, 961px" /></p>
<p>上記の通り、SexとEmbarkedに入っていた文字列の値が、数字へ変換されていることが確認できます。これで<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>の前処理は終わりましたが、次は<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>も同様の処理を行わないといけません。</p><pre class="crayon-plain-tag">test["Age"] = test["Age"].fillna(test["Age"].median())
test["Sex"][test["Sex"] == "male"] = 0
test["Sex"][test["Sex"] == "female"] = 1
test["Embarked"][test["Embarked"] == "S"] = 0
test["Embarked"][test["Embarked"] == "C"] = 1
test["Embarked"][test["Embarked"] == "Q"] = 2
test.Fare[152] = test.Fare.median()

test.head(10)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-536" src="https://www.codexa.net/wp-content/uploads/2017/11/test_modified.png" alt="" width="817" height="303" srcset="https://www.codexa.net/wp-content/uploads/2017/11/test_modified.png 817w, https://www.codexa.net/wp-content/uploads/2017/11/test_modified-300x111.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/test_modified-768x285.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/test_modified-304x113.png 304w" sizes="(max-width: 817px) 100vw, 817px" /></p>
<p>同様に「Age」へは中央値（Median）の代入、また文字列の値（AgeとEmbarked）は数字に変換しました。さらに、<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>では、「Fare」に一つだけ欠損がありましたので、こちらも年齢と同様に中央値（Median）を代理で入れています。念のためhead()でデータの中身も確認をしておきましょう。</p>
<h3>予測モデル その1 「決定木」</h3>
<p>データの確認、事前処理も終わりましたので、とうとう本題の予測モデルを作って、実際に予測をしてみましょう！本記事では<strong>予測モデル「決定木」を異なるデータで訓練して、結果を比較</strong>してみようと思います。</p>
<p>「決定木」ですが、scikit-learnとNumpyを使えば非常に簡単に作成することが可能です。</p>
<p>まず初めに作る予測モデル「その1」ですが「Pclass」「Sex」「Age」「Fare」の4つの項目を使って「Survived（生存可否）」を予測してみましょう。別の言い方で表すと、<strong>タイタニックに乗船していた客の「チケットクラス（社会経済的地位）」「性別」「年齢」「料金」のデータを元に生存したか死亡したかを予測する</strong>とも言えます。</p>
<p>では実際に作ってみましょう。</p>
<p>まず、scikit-learnのインポートを行いましょう。</p><pre class="crayon-plain-tag"># scikit-learnのインポートをします
from sklearn import tree</pre><p>
</p><pre class="crayon-plain-tag"># 「train」の目的変数と説明変数の値を取得
target = train["Survived"].values
features_one = train[["Pclass", "Sex", "Age", "Fare"]].values

# 決定木の作成
my_tree_one = tree.DecisionTreeClassifier()
my_tree_one = my_tree_one.fit(features_one, target)

# 「test」の説明変数の値を取得
test_features = test[["Pclass", "Sex", "Age", "Fare"]].values

# 「test」の説明変数を使って「my_tree_one」のモデルで予測
my_prediction = my_tree_one.predict(test_features)</pre><p>
まず決定木で使うTargetとFeatureの値を<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>から取得して格納しておきます。</p>
<p>次にscikit-learnの「DecisionTreeClassifier（）」を使って「my_tree_one」という決定木モデルを作成しました。</p>
<p>最後に事前に綺麗に処理をしておいた<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>から<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;train&nbsp;</span>で使ったFeatureと同様の項目の値を「test_features」へ入れて、predict()を使って予測をしました。</p>
<p>予測されたデータを確認してみましょう。</p><pre class="crayon-plain-tag"># 予測データのサイズを確認
my_prediction.shape</pre><p>
</p><pre class="crayon-plain-tag">(418,)</pre><p>
</p><pre class="crayon-plain-tag">#予測データの中身を確認
print(my_prediction)</pre><p>
<img loading="lazy" class="aligncenter size-full wp-image-538" src="https://www.codexa.net/wp-content/uploads/2017/11/my_predict.png" alt="" width="502" height="212" srcset="https://www.codexa.net/wp-content/uploads/2017/11/my_predict.png 502w, https://www.codexa.net/wp-content/uploads/2017/11/my_predict-300x127.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/my_predict-304x128.png 304w" sizes="(max-width: 502px) 100vw, 502px" /></p>
<p>予測をしなくてはいけないデータ数、つまり<span class="su-highlight" style="background:#e9e9e9;color:#f15858">&nbsp;test&nbsp;</span>のデータ数は418個でしたが、上記の通りmy_predictionも同じ数の予測数が結果として出力されていますね。今回の予測は「0か1（生存か死亡）」でしたが、念のため中身も確認してみると0と1で構成されているのが確認できます。</p>
<p>では、この予測データをCSVへ書き出してKaggleへ早速投稿してみましょう！下記のコードでPassengerIdと予測値を取得してCSVファイルを書き出します。</p><pre class="crayon-plain-tag"># PassengerIdを取得
PassengerId = np.array(test["PassengerId"]).astype(int)

# my_prediction(予測データ）とPassengerIdをデータフレームへ落とし込む
my_solution = pd.DataFrame(my_prediction, PassengerId, columns = ["Survived"])

# my_tree_one.csvとして書き出し
my_solution.to_csv("my_tree_one.csv", index_label = ["PassengerId"])</pre><p>
Python（またはJupyter Notebook）が立ち上がっている場所へ「my_tree_one.csv」が作成されていると思いますので、こちらのファイルをKaggleへ投稿してみましょう。</p>
<p>Kaggleへログインをしてタイタニックページへ移動をすると、上部メニュに「Submit Predictions」という項目がありますので、こちらをクリックしましょう。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-539" src="https://www.codexa.net/wp-content/uploads/2017/11/submit-kaggle.png" alt="" width="954" height="280" srcset="https://www.codexa.net/wp-content/uploads/2017/11/submit-kaggle.png 954w, https://www.codexa.net/wp-content/uploads/2017/11/submit-kaggle-300x88.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/submit-kaggle-768x225.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/submit-kaggle-304x89.png 304w" sizes="(max-width: 954px) 100vw, 954px" /></p>
<p>同ページの下部にファイルアップローダーがありますので、こちらで先ほど書き出した「my_tree_one.csv」をアップロードして「Make Submission」をクリックしましょう。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-540" src="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submit-2.png" alt="" width="953" height="757" srcset="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submit-2.png 953w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submit-2-300x238.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submit-2-768x610.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submit-2-269x214.png 269w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submit-2-199x158.png 199w" sizes="(max-width: 953px) 100vw, 953px" /></p>
<p>投稿をすると次のページへ自動的に遷移します。さて、気になる結果ですが・・</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-541" src="https://www.codexa.net/wp-content/uploads/2017/11/my_tree_one_result.png" alt="" width="960" height="221" srcset="https://www.codexa.net/wp-content/uploads/2017/11/my_tree_one_result.png 960w, https://www.codexa.net/wp-content/uploads/2017/11/my_tree_one_result-300x69.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/my_tree_one_result-768x177.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/my_tree_one_result-304x70.png 304w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p>ファイルがKaggleの投稿基準を満たしていると、即座にスコアを計算して表示してくれます。</p>
<p>「my_tree_one」は「チケットクラス（社会経済的地位）」「性別」「年齢」「料金」の4つのデータを用いて「決定木」のモデルを使い予測を行いましたが、結果として「<strong>0.71770</strong>」のスコアが獲得できました。</p>
<p>Kaggleのスコアはコンペにより異なります。各コンペの「Evaluation」のページに詳細が記載されています。今回予測を行なったタイタニックのコンペでは予測スコアは単純に「Accuracy（正解率）」が使われていますので、今作った「my_tree_one」は<strong>約71.8%の確率で正解を予測できました</strong>ということになります<strong>。</strong></p>
<p>参考までにですが、Kaggleタイタニックのランキングを見てみると「0.71770」のスコアですと、約8600位前後となります。（＊このタイタニックの予測課題ですが、実は100%（つまりスコア1.0）を叩き出している強者データサイエンティストもいます。インターネットにその手法も公開されています。）</p>
<p><strong>では、次はこの71.8%のスコアよりももう少し正確なモデルを作って見ましょう！</strong></p>
<h3>予測モデル その2 「決定木 + 7つの説明変数」</h3>
<p>さて、予測モデルその1では「<strong>タイタニックに乗船していた客の「チケットクラス」「性別」「年齢」「料金」のデータを元に生存したか死亡したかを予測」</strong>しました。Kaggleで答え合わせをすると「約71.8%」の正解率でした。</p>
<p>では・・この正解率を上げるためにはどうすれば良いでしょうか？</p>
<p>少し考えて見てください</p>
<p>・・・</p>
<p>・・・</p>
<p>色々と試せることはあるかと思いますが、パッと思いつく限りだと、<strong>予測モデルの訓練で使うデータに他の変数も加味してみてはどうだろう？！</strong>と考えれますよね。</p>
<p>では、「その1」では4つのデータしか予測モデルに反映しませんでしがが、他で使えそうなデータも予測モデルに使って見ましょう！</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-544" src="https://www.codexa.net/wp-content/uploads/2017/11/comparison-predict-model.png" alt="" width="802" height="393" srcset="https://www.codexa.net/wp-content/uploads/2017/11/comparison-predict-model.png 802w, https://www.codexa.net/wp-content/uploads/2017/11/comparison-predict-model-300x147.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/comparison-predict-model-768x376.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/comparison-predict-model-304x149.png 304w, https://www.codexa.net/wp-content/uploads/2017/11/comparison-predict-model-800x393.png 800w" sizes="(max-width: 802px) 100vw, 802px" /></p>
<p>映画「タイタニック」でも家族や子供と一緒に船から脱出を試みるシーンがあったように記憶してますが、これは恐らく生存確率に影響をしそうですよね。また出発港も3つのカテゴリしかありませんが、生存確率に何かしらの影響はあるのでは？と睨んで追加をしてみましょう。</p>
<p>まずはtrainのデータセットから今回追加になった項目の値も追加して「features_two」に取り出しましょう。</p>
<p>また、予測モデルその2では、簡単ではありますが「過学習（Overfitting）」についても考えて見ましょう。その1で作成した決定木のモデルではmax_depthとmin_samples_slitのアーギュメントを指定しませんでしたが、その2のモデルではアーギュメントを設定してみましょう。</p><pre class="crayon-plain-tag"># 追加となった項目も含めて予測モデルその2で使う値を取り出す
features_two = train[["Pclass","Age","Sex","Fare", "SibSp", "Parch", "Embarked"]].values

# 決定木の作成とアーギュメントの設定
max_depth = 10
min_samples_split = 5
my_tree_two = tree.DecisionTreeClassifier(max_depth = max_depth, min_samples_split = min_samples_split, random_state = 1)
my_tree_two = my_tree_two.fit(features_two, target)</pre><p>
さて、モデルの作成もできましたので、実際に「my_tree_two」を使って予測をしてみましょう。</p><pre class="crayon-plain-tag"># tsetから「その2」で使う項目の値を取り出す
test_features_2 = test[["Pclass", "Age", "Sex", "Fare", "SibSp", "Parch", "Embarked"]].values

# 「その2」の決定木を使って予測をしてCSVへ書き出す
my_prediction_tree_two = my_tree_two.predict(test_features_2)
PassengerId = np.array(test["PassengerId"]).astype(int)
my_solution_tree_two = pd.DataFrame(my_prediction_tree_two, PassengerId, columns = ["Survived"])
my_solution_tree_two.to_csv("my_tree_two.csv", index_label = ["PassengerId"])</pre><p>
上記のコードを正しく打ち込んでいれば、「my_tree_two.csv」として新しく作成した決定木による予測のCSVファイルが書き出されているはずです。</p>
<p>では、早速、Kaggleへ戻って結果をアップロードしてみましょう。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-546" src="https://www.codexa.net/wp-content/uploads/2017/11/my_tree_two_result.png" alt="" width="956" height="215" srcset="https://www.codexa.net/wp-content/uploads/2017/11/my_tree_two_result.png 956w, https://www.codexa.net/wp-content/uploads/2017/11/my_tree_two_result-300x67.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/my_tree_two_result-768x173.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/my_tree_two_result-304x68.png 304w" sizes="(max-width: 956px) 100vw, 956px" /></p>
<p>結果は・・スコア「0.76076」でした！つまり、<strong>正解確率が約76.0%</strong>とすこ〜しだけ改善されています。その１では正解率が約71.8%でしたので、訓練データを増やしたことにより約4%の改善ができました。</p>
<h3>まとめ</h3>
<p>今回の記事ではKaggle初心者編として、タイタニック号の乗客リストを使った生存予測を行ってみました。簡単な事前データ処理とScikit-learnの決定木を使うことで、思ったよりも簡単に機械学習に触れることが可能です。</p>
<p>英語ばかりで慣れないKaggleではありますが、機械学習を学ぶ人にとっては避けて通れないほど魅力が詰まっています。是非、これを機械にKaggleへの参加をしてみましょう。</p>
<p>codexaでは、<strong>機械学習初心者向けのチュートリアルや無料講座や有料チュートリアルも配信</strong>しています。Kaggleへ参加される前にPythonの機械学習系ライブラリの操作方法などを身につけてみましょう。</p>
<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp; 有料チュートリアル &nbsp;</span>
<ul>
<li><a href="https://www.codexa.net/tutorial-linear-regression-for-beginner/">スクラッチで最小二乗法と最急降下法をPythonでコーディング（線形回帰）</a></li>
<li><a href="https://www.codexa.net/tutorial-logistic-regression-for-beginner/">ロジスティック回帰の概要や数学的理解と実践に役立つ知識（ロジスティック回帰）</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/kaggle-titanic-beginner/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Kaggleとは？機械学習初心者が知っておくべき3つの使い方</title>
		<link>https://www.codexa.net/what-is-kaggle/</link>
					<comments>https://www.codexa.net/what-is-kaggle/#respond</comments>
		
		<dc:creator><![CDATA[codexaチーム]]></dc:creator>
		<pubDate>Wed, 22 Nov 2017 04:28:14 +0000</pubDate>
				<category><![CDATA[Kaggle]]></category>
		<guid isPermaLink="false">https://www.codexa.net/?p=482</guid>

					<description><![CDATA[私が機械学習やディープラーニングを勉強し始めたての頃、様々な問題を抱えていました。特に大きな問題だったのが、練習として使えるデータセットを探すことでした。 また、まだ日本で機械学習などを周りにやっている人もごく少数で、気 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>私が機械学習やディープラーニングを勉強し始めたての頃、様々な問題を抱えていました。特に大きな問題だったのが、練習として使えるデータセットを探すことでした。</p>
<p>また、まだ日本で機械学習などを周りにやっている人もごく少数で、気軽に相談や議論などをできる環境もなく、一人で悶々とひたすら勉強をしていたのですが・・</p>
<p>そんなあるときに、海外のサイトでデータを探していたら、「<a href="https://www.kaggle.com/" target="_blank" rel="noopener">Kaggle</a>」へ辿り着いたのです！そこは・・まるで・・機械学習を学んでいる当時の私には「天国」のような場所でした 。（今でも天国のような場所です）</p>
<p>今まで散々、お世話になって行きているKaggleですが、<strong>これから機械学習を勉強される方に向けた「Kaggleとは？Kaggle入門編」</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:#000000;border-top-left-radius:1px;border-top-right-radius:1px">Kaggleへ挑戦する前に…</div><div class="su-box-content su-u-clearfix su-u-trim" style="border-bottom-left-radius:1px;border-bottom-right-radius:1px">
<p>機械学習の基礎用語や初歩的な手法、数学的な理解を深めませんか？環境構築が不要、オンラインで実行が可能な機械学習入門チュートリアルを公開中！機械学習の世界へ飛び込んでみませんか？</p>
<ul>
<li><a href="https://www.codexa.net/tutorial-linear-regression-for-beginner/">スクラッチで最小二乗法と最急降下法をPythonでコーディング（線形回帰）</a></li>
<li><a href="https://www.codexa.net/tutorial-logistic-regression-for-beginner/">ロジスティック回帰の概要や数学的理解と実践に役立つ知識（ロジスティック回帰）</a></li>
</ul>
</div></div>
<h3>Kaggleとは？</h3>
<p>まず呼び方ですが、Kaggleと書いて「カグル」と読みます。日本でも最近は定着してきましたが、Kaggleに参加している方を「カグラー（Kaggler）」とも呼びます。</p>
<p>Kaggleですが、本サイトへ行くと一番上に書かれていますが「The Home of Data Science &amp; Machine Learning」（<strong>データサイエンスと機械学習の家</strong>）と題されている通り、世界中の機械学習・データサイエンスに携わっている約40万人の方が集まるコミニティーです。</p>
<p>Kaggleでは、企業や政府などの組織とデータ分析のプロであるデータサイエンティスト/機械学習エンジニアを繋げるプラットフォームとなっています。単純なマッチングではなく、Kaggleの最大の目玉とも言える「Competetion（コンペ）」がKaggleの特徴の一つです。</p>
<p>Competition（コンペ）は、企業や政府がコンペ形式（競争形式）で課題を提示し、賞金と引き換えに最も制度の高い分析モデルを買い取るという、最近でいう一種のクラウドファンディングに近いような仕組みとなります。</p>
<div id="attachment_485" style="width: 985px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-485" loading="lazy" class="wp-image-485 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-competitions.png" alt="" width="975" height="574" srcset="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-competitions.png 975w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-competitions-300x177.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-competitions-768x452.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-competitions-304x179.png 304w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-competitions-268x158.png 268w" sizes="(max-width: 975px) 100vw, 975px" /><p id="caption-attachment-485" class="wp-caption-text">コンペの一例。</p></div>
<p>開催されるコンペは実に様々で、アメリカ国土安全保障省による空港のセキュリティースクリーニングの認識アルゴリズムの競争や、日本からだと<a href="https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/">メルカリによる販売者への自動価格提案アルゴリズムなどが開催</a>されています。</p>
<p>また先述した通り、Kaggleに参加している人たちは無料でこれらのコンペに参加が可能で、企業から提供されているトレーニング用のデータセット（またそれに付随する様々なデータなどもある）を利用して、モデルの訓練を行い、さらにテストセットで評価までも可能です。</p>
<p><strong>まだ機械学習を勉強し始めたばかりで…コンペなんて参加できないです…</strong>と思われている方もご安心ください！Kaggleでは初級者にも優しく設計されているのです。</p>
<p>初心者向けの一つの機能として「<strong>Kernels（カーネル）</strong>」があります。このカーネルでは、各データセットに対して他のユーザーが構築した予測モデルのコードや説明が公開されています。例えば、「<strong>このコンペのデータでは、XXXXの事前処理をデータセットに加えて、〇〇のモデルを使って予測したら、XXの精度が出たよ。これがコードだよ</strong>」という感じで、初心者にも優しく説明がされているカーネルも多数あります。（説明がなく単純にコードが公開されているケースもありますが）</p>
<p>また、「<strong>Discussion（ディスカッション）</strong>」では、世界中のデータサイエンティスト・機械学習実装者とのコミュニケーションも行えます。最新のモデリングの情報や、今までうまく行かなかったデータセットの処理方法など、<strong>最先端の現場の活きた知識／知恵</strong>が詰まっています！</p>
<p>では、実際にKaggle初心者の使い方のコツを詳しく見て行きましょう。</p>
<h3>Kaggleコンペを覗こう/参加しよう</h3>
<p>基本的にコンペへの参加条件などは特に設定はされておらず、無料会員登録を行えば、初心者でも誰でも参加が可能となります。ただし、ルールはコンペに応じて異なり、例えば使って良いデータの詳細やモデル構築時の環境の縛りなどがあります。</p>
<p>コンペのルールや条件などは全て<strong>英語で記載</strong>されていますので、簡単な英語の理解は必要です。加えて、さらに重要なのがデータセットの説明です。こちらも英語なのですが、各データが何を含んでいるのか、また各カラムやデータの質など、データセットの説明を抜きにコンペへ参加するのは難しいかと思います。</p>
<p>英語が苦手な方は、Google翻訳を使ってデータセットを紐解くか、検索をしてチュートリアルの記事を探す方法もあります。有名なコンペや練習データなどに対しては、日本語で解説されたチュートリアル記事もありますので、日本語で検索をしてみるのも一つの手段です。</p>
<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;Kaggleチュートリアル&nbsp;</span>
<ul>
<li><a href="https://www.codexa.net/kaggle-mercari-price-suggestion-challenge/">Kaggle メルカリ価格予想チャレンジの初心者チュートリアル</a></li>
<li><a href="https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/">機械学習を使って630万件のレビューに基づいたアニメのレコメンド機能を作ってみよう（機械学習 k近傍法 初心者向け）</a></li>
<li><a href="https://www.codexa.net/amazon-sagamaker-xgboost-game-sales-predictions/">ゲームソフトの売行きをXGBoostで予測してみた【Amazon SageMaker ノートブック＋モデル訓練＋モデルホスティングまで】</a></li>
<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-titanic-beginner/">【Kaggle初心者入門編】タイタニック号で生き残るのは誰？</a></li>
</ul>
<p>各コンペの利用規約へ同意をすると、データセットのダウロードが可能となります。データセットを落として、自分で処理を行い、最適な予測モデルを作って見ましょう！</p>
<p>予測モデルですが、各コンペの「<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;Evaluation&nbsp;</span>」のページにて「<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;Submission File&nbsp;</span>」（投稿ファイル）とう項目に形式や詳細がまとめられています。下記の例は現在進行中の「<a href="https://www.kaggle.com/c/mercari-price-suggestion-challenge#evaluation" target="_blank" rel="nofollow noopener">Mercari Price Suggestion Challenge</a>」の評価詳細ページです。「<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;Submission File&nbsp;</span>」の項目に、「<strong>test_idとpriceの2列のヘッダーを含むCSV形式</strong>」で提出してくださいと指定があります。</p>
<p>予測モデルを作成して実際の予測をする場合は、提出ファイルの形式をしっかりと理解してから、予測を行いましょう。提出ファイルがルールに沿っていないと、正確に評価もされませんしスコアもつきません。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-492" src="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submission.png" alt="" width="951" height="692" srcset="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submission.png 951w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submission-300x218.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submission-768x559.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submission-294x214.png 294w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-submission-217x158.png 217w" sizes="(max-width: 951px) 100vw, 951px" /></p>
<p>またコンペによっては、「<strong>Kernel Only</strong>」と指定がある場合もあります。この場合は、<strong>予測されたデータのファイルだけでなく、ファイルの事前処理を含む全てのモデルのコードのカーネルの提出が必要</strong>です。コンペに応じて、評価方法や提出物が異なりますので、取り組む前にしっかりと読みましょう。</p>
<p>予測データの投稿が完了すると、リアルタイムで評価がつきます！また<strong>予測データの投稿は1日5回までと制限</strong>があります。色々と試行錯誤をしながら投稿するので、この1日5回の制限によく引っかかります（汗）。</p>
<p>正しいデータフォーマットで予測データを投稿すると、「<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;Leaderboard&nbsp;</span>」へスコアと共に掲載されます。こちらのボードで、自分が構築した予測モデル/データがどれくらい優れているのかの確認が可能です！</p>
<div id="attachment_486" style="width: 964px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-486" loading="lazy" class="wp-image-486 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-ranking.png" alt="" width="954" height="420" srcset="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-ranking.png 954w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-ranking-300x132.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-ranking-768x338.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-ranking-304x134.png 304w" sizes="(max-width: 954px) 100vw, 954px" /><p id="caption-attachment-486" class="wp-caption-text">先述した「アメリカ合衆国国土安全保障省」のコンペのリーダーボード</p></div>
<p>まだ機械学習を始めたばかりで…いきなりコンペに参加するのはハードルが高すぎる…という方は「<strong>Kanerl（カーネル）</strong>」でひたすら勉強をしましょう！次はKernelsの使い方について説明をして行きます。</p>
<h3>Kaggle 初心者はひたすらカーネルをやるべし</h3>
<p>色々なコンペを見て回ったけど・・まだ私にはレベルが高すぎて何をして良いかわからない・・！機械学習を触り始めの初心者の方であれば、Kaggleを使い出すと、そういう状況になることもあるかと思います。（私も最初はそうでした）</p>
<p>そんな初心者の方も安心してください！Kaggleの「Kernels（カーネル）」を使って見ましょう。Kernelsでは、<strong>先輩データサイエンティストさん達が構築したモデルやデータセット処理のコードが公開</strong>されています。各コンペまたはオープンデータセットに対してKernelsは用意されています。また言語でのフィルタリングも可能です。</p>
<p>下記のキャプチャですが、<a href="https://www.kaggle.com/c/mercari-price-suggestion-challenge/kernels?sortBy=votes&amp;group=everyone&amp;pageSize=20&amp;language=Python&amp;outputType=all&amp;competitionId=7559">Mercariの販売価格予測チャレンジのカーネル</a>となります。リストの2番目の「<a href="https://www.kaggle.com/bguberfain/naive-catboost">Naive CatBoost</a>」をご覧いただくとわかりやすいのですが、Jupyter Notebookの形式でCatBoostのモデルを利用した予測モデルのコードが公開されています。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-494" src="https://www.codexa.net/wp-content/uploads/2017/11/mercari_kernels-1.png" alt="" width="960" height="809" srcset="https://www.codexa.net/wp-content/uploads/2017/11/mercari_kernels-1.png 960w, https://www.codexa.net/wp-content/uploads/2017/11/mercari_kernels-1-300x253.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/mercari_kernels-1-768x647.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/mercari_kernels-1-254x214.png 254w, https://www.codexa.net/wp-content/uploads/2017/11/mercari_kernels-1-187x158.png 187w" sizes="(max-width: 960px) 100vw, 960px" /></p>
<p>このコードを自分の環境で書きながら、1ライン1ライン理解をしていくと良い勉強になります。なぜ、このような処理をしたのか？なぜこの項目を特徴量として使ったのか？などなどコードを真似しながら自分の中で噛み砕いていくことで、<strong>最先端のデータサイエンティストの考え方</strong>が身につけられます。</p>
<p>さらに、Kernels（カーネル）の嬉しいところは、実際に提出する予測ファイルまで完成できるところです。こちらの例のコードの全て処理すると、「0.60157」のスコアの予測データが出来上がります。（全てのカーネルが予測ファイルを生成できる訳ではありません）</p>
<p>参考までにですが、このCatBoostを使った予測モデルは<strong>11月22日時点で19位</strong>となっています。つまり、参加している予測モデルで19番目に精度が高いモデルを使って勉強が出来る訳です。</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-495" src="https://www.codexa.net/wp-content/uploads/2017/11/mercari-leaderboard.png" alt="" width="952" height="492" srcset="https://www.codexa.net/wp-content/uploads/2017/11/mercari-leaderboard.png 952w, https://www.codexa.net/wp-content/uploads/2017/11/mercari-leaderboard-300x155.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/mercari-leaderboard-768x397.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/mercari-leaderboard-304x157.png 304w" sizes="(max-width: 952px) 100vw, 952px" /></p>
<p>Mercariのコンペ以外にも、Kaggleでは多数のカーネルが公開されています。機械学習を始めたばかりで、データの処理の仕方がわからない、予測モデルも基本的なものの使い方しかわからないという方は、積極的にカーネルを勉強していきましょう！色々なデータセット、予測モデル、さらにはデータの前処理を行うことにより、経験と知識が増えていきます。</p>
<h3>ディスカッションで積極的に質問しよう</h3>
<p>さて、最後の3つ目のコツですが「<strong>ディスカッション</strong>」へ参加することです。これは<strong>最低限の英語スキルが必要</strong>となりますが、英語の自信のない方でもやるべきだと思います。なぜディスカッションに参加すべきなのか？を説明します。</p>
<div id="attachment_497" style="width: 963px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-497" loading="lazy" class="wp-image-497 size-full" src="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-discussion.png" alt="" width="953" height="253" srcset="https://www.codexa.net/wp-content/uploads/2017/11/kaggle-discussion.png 953w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-discussion-300x80.png 300w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-discussion-768x204.png 768w, https://www.codexa.net/wp-content/uploads/2017/11/kaggle-discussion-304x81.png 304w" sizes="(max-width: 953px) 100vw, 953px" /><p id="caption-attachment-497" class="wp-caption-text">Kaggleのディスカッションの大きなカテゴリです。一般的なフォーラムや技術的なQ&amp;Aなど議論の内容に応じて別れています。</p></div>
<p>冒頭でもお話をしましたが、Kaggleはアメリカのみのサービスではありません。全世界の最先端のデータサイエンティストが集まるコミュニティーとなります。実際にディスカッションで投稿されている質問を見てみると、<strong>英語が必ずしも正しく書かれている訳ではありません</strong>。</p>
<p><strong>自分の英語は完璧ではないから投稿に参加するのはちょっと</strong>…と思っている方でも、大丈夫です！そのような方もたくさんいますので、むしろ利用しない方が損です。また、<strong>自分は初心者だから・・質問の内容が拙いのでは？</strong>と考えるもの損です。Kaggleでは、初級者の方もたくさんいますし、実際に質問も初級から上級まで様々な質問/回答が投稿されているのが確認できます。</p>
<p>「自分は〇〇だから・・」と思う前に、まずはどっぷり、Kaggleのコミニティに浸りましょう！色々なスキルの方とコミュニケーションを取ることで、確実に自分の理解・スキルもアップします。</p>
<h3>まとめ</h3>
<p>全て英語のサービスというハードルはあるものの、データとコードは世界共通です。これから機械学習を学ぶ方、すでに学び始めている方はKaggleへ参加をすることで、機械学習/データサイエンスのスキルアップが出来ます。</p>
<p>codexaでは、<strong>機械学習初心者向けのチュートリアルや無料講座や有料チュートリアルも配信</strong>しています。Kaggleへ参加される前にPythonの機械学習系ライブラリの操作方法などを身につけてみましょう。</p>
<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;有料チュートリアル&nbsp;</span>
<ul>
<li><a href="https://www.codexa.net/tutorial-linear-regression-for-beginner/">スクラッチで最小二乗法と最急降下法をPythonでコーディング（線形回帰）</a></li>
<li><a href="https://www.codexa.net/tutorial-logistic-regression-for-beginner/">ロジスティック回帰の概要や数学的理解と実践に役立つ知識（ロジスティック回帰）</a></li>
</ul>
<span class="su-highlight" style="background:#fce6e6;color:#000000">&nbsp;機械学習 準備編 無料講座&nbsp;</span>
<ul>
<li><a href="https://www.codexa.net/numpy/">Numpy 入門</a></li>
<li><a href="https://www.codexa.net/matplotlib/">Matplotlib 入門</a></li>
<li><a href="https://www.codexa.net/pandas/">Pandas 入門</a></li>
<li><a href="https://www.codexa.net/linear-basics-2/">線形代数 入門</a></li>
<li><a href="https://www.codexa.net/statistics-for-machine-learning-first/">統計入門（前編）</a></li>
<li><a href="https://www.codexa.net/statistics-for-machine-learning-second/">統計入門（後編）</a></li>
<li><a href="https://www.codexa.net/linear-regression-for-beginner/">線形回帰 入門</a></li>
</ul>
<p>以上となります！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codexa.net/what-is-kaggle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
