paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

機械学習のデータセットを可視化する「Facets」で遊んでみた

f:id:paiza:20170724122143p:plain
秋山です。

先日、Google Open SourceでFacets」という機械学習向けデータセットの可視化ツールが公開されました。

サイトはこちら
opensource.googleblog.com
(※Chromeであれば、ブラウザ上でどういったことができるかのデモを触れます。Safariだとうまく動かない?ようなのでご注意ください)

GitHubはこちら
github.com

デモのようにブラウザ上でデータを可視化したり、Pythonライブラリのjupyter内で使ったりすることができます(ブラウザで表示させるかjupyter内で表示させるかだけの違いですが…)

例えば巨大なデータを扱っていて、うまく分離できていないデータ群はどの辺りになるのか…といったことを可視化して眺めたいときなどによさそうなので、実際にちょっと使ってみたいと思います。

Facets使ってみた

Facetsには大きく分けて2つの機能があるようです。

  • Facets Overview

機械学習などで訓練データやテストデータを試した結果に変な値がないか…例えばそれぞれのデータの分布や欠損値の割合などを見て、おかしなデータが含まれていないか?といったことが確認できます。

  • Facets Dive

機械学習などで分離したデータ群を実際に覗いてみることができます。例えば、画像データであれば「ネコ」と分類された画像群を実際に見てみる…といったことができます。画像の拡大や縮小、移動もぐりぐりできます。ネコじゃないのにネコであると学習されてしまうのはどんな画像なのか?…といったことが見られます。

巨大なデータを人間がいちいち見て確認するのは非現実的ですが、おかしな分類が多すぎた場合などに、どんなデータはうまく分類できて、どんなデータだとだめなのか?といった傾向を探ったりするのに役立つ…のかもしれませんね。

普通に触って見て遊ぶのも楽しそうなので、jupyterで動かしてみます。


ここからはjupyterがインストールされている前提で進めていきます。インストール方法などは、過去に書いた記事を参考にしてください。
paiza.hatenablog.com


まずはFacetsをcloneしましょう。FacetsはPythonのライブラリというよりはPolymerとTypeScriptを使った可視化ツールなので、pipとかでは入れられないようです。(そのうちできるようになるのかも…?)

git clone https://github.com/pair-code/facets

として、クローンしたfacetsディレクトリに移動してください。

そして

jupyter notebook

として、jupyterを起動させます。

こんな感じで普段からjupyterを使っている人にはおなじみの画面が出てくるかと思いますので、そのまま facets-div/Dive_demo.ipynb と ipynb ファイルを開きます。
f:id:paiza:20170724114919p:plain


サンプルが出てきました。
f:id:paiza:20170724115110p:plain

>"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test",
↑この部分ですが、python 3.5 で試していたら SSL error が出たので
>"http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test",
と、httpsをhttpに差し替えて実行します。

f:id:paiza:20170724115314p:plain


オプションを変えれば、サンプルのデータでは年齢別などで可視化できます。グループ分け幅なども簡単に変更できて、それっぽいきれいなアニメーションが表示されます。
f:id:paiza:20170724115353p:plain


サンプルデータにはあまり身近なデータがないので……もう少し面白そうなオープンデータを探してみました。
opendata-catalogue.metro.tokyo.jp
都内の放置自転車数のデータを使ってみましょう。


データ読み込み周りを書き換えて……とりあえず駅ごとのデータのみにしてみます(※区ごとの合計や全体の合計に関する列を消し、json化して流し込みます)

import pandas as pd
import re
features = ["駅名(*放置禁止区域に指定)", "放置台数(A)自転車", "放置台数(A)原付", "放置台数(A)自二", "放置台数(A)計","実収容台数(B)自転車","実収容台数(B)原付","実収容台数(B)計","収容能力(C)自転車","収容能力(C)原付","収容能力(C)計","乗入台数(A)+(B)計"]
dataset = pd.read_csv(
"http://www.seisyounen-chian.metro.tokyo.jp/kotsu/pdf/koutuu/csv/heisei27nendoekibetuhoutinirinsyanozyoukyou_1.csv",
names=features,
sep=r'\s*,\s*',
engine='python',
skiprows=[0],
na_values="?")
dataset = dataset[dataset["駅名(*放置禁止区域に指定)"] != "計"]
dataset = dataset[dataset["駅名(*放置禁止区域に指定)"] != "区部計"]
dataset = dataset[dataset["駅名(*放置禁止区域に指定)"] != "総数"]
dataset = dataset.replace(re.compile('*'), '') #なんか*が入ってて気持ち悪いので削除
jsonstr = dataset.to_json(orient='records')


# Display the Dive visualization for this data
from IPython.core.display import display, HTML
HTML_TEMPLATE = """<link rel="import" href="/nbextensions/facets-dist/facets-jupyter.html">
<facets-dive id="elem" height="600"></facets-dive>
<script>
var data = {jsonstr};
document.querySelector("#elem").data = data;
</script>"""
html = HTML_TEMPLATE.format(jsonstr=jsonstr)
display(HTML(html))


あとは適当にプルダウンで選択して分類の幅などをいじると、こんな感じに表示されました。いい感じですね。
f:id:paiza:20170724121530p:plain


縦を放置自転車数、横を放置原付数で見るとこんな感じですね。
f:id:paiza:20170724121717p:plain


拡大してみると…
f:id:paiza:20170724121733p:plain
錦糸町、高円寺、赤羽あたりが多いようですね(色は放置合計数が多いほど濃くなるように設定しています)。

赤羽は原付は少ないけど自転車が多く、錦糸町は両方多い…みたいな感じですね。あとは神田、中野、池袋、成増駅地下鉄成増つくばエクスプレス浅草(浅草、成増は文字潰れちゃってます…)が出ています。

■まとめ

というわけでFacetsを使ってみました。

日本語表示には若干難がある感じ(ラベルに文字を出すというよりは、学習セットの画像データを出すほうがよさそうです)だし、特別に操作性がいい!というわけではないですが、グループ化して簡単に表示させられるのはよいかなと思います。

あと拡大縮小がグリグリできるので、数の多いデータ群の中から一部を絞って見にいきたいという目的があるときはよいかと思います。

初心者でも機械学習でちょっと遊べそうな記事を過去にも書いているので、興味のある人は見てみてください。
paiza.hatenablog.com
paiza.hatenablog.com


機械学習どころかプログラミング自体が初心者なので、まずはPythonを使えるようになりたい!」という方は、プログラミングが動画で学べる「paizaラーニングPython入門編から始めてみると、無理なく基礎を習得できると思います。
paiza.jp

Pythonの講座も公開中!プログラミングが動画で学べるレッスン


paizaは、プログラミング未経験者・初心者向け学習サービス「paizaラーニングを、新サービスとして独立オープンいたしました。

今回記事の中で使用しているPythonの入門講座も好評公開中です。ぜひごらんください!

↓詳しくはこちら
paiza.jp




paizaは、技術を追い続けることが仕事につながり、スキルのある人がきちんと評価される場を作ることで、日本のITエンジニアの地位向上を目指したいと考えています。

自分のスキルを磨いていきたいという方におすすめなのが「paizaラーニング」。オンラインでプログラミングしながらスキルアップできる入門学習コンテンツです。初心者でも楽しくプログラミングの基本を学ぶことができます。
paiza.jp
そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
paiza.jp
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

ITプログラマ・エンジニア向け転職・就活・学習サービスのpaiza