DISTRICT 37

なにか

seabornを使うと凡例が見づらくなる

ということでplotsする際のテクニックを軽く

凡例を描画する際に一言二言加える

seabornをmatplotlibと併せて使っているわけだが、凡例を描画すると背景に消えてしまう事がある。今回はそれを解決した。

まずはデータの準備。適当に連続した数字を。

x = np.arange(0, 10, 0.1)
y1 = np.arange(0, 10, 0.1)
y2 = np.arange(10, 0, -0.1)

これをseabornを使わずに描画

import matplotlib.pyplot as plt
plt.plot(x, y1, label="legend_1")
plt.plot(x, y2, linestyle="--", label="legend_2")
plt.legend(loc="best")
plt.show()

こうなる。凡例が見やすい。

f:id:dragstarclassic:20180109144208p:plain

seabornを使うと、、、

import matplotlib.pyplot as plt
import seaborn as sns
plt.plot(x, y1, label="legend_1")
plt.plot(x, y2, linestyle="--", label="legend_2")
plt.legend(loc="best")
plt.show()

凡例が見にくい(個人差はあります)。

f:id:dragstarclassic:20180109144517p:plain

ということでlegendの指定にちょっと書き加える。

import matplotlib.pyplot as plt
import seaborn as sns
plt.plot(x, y1, label="legend_1")
plt.plot(x, y2, linestyle="--", label="legend_2")
plt.legend(loc="best", frameon=True, edgecolor="blue")
plt.show()

こうなる。ちょっと見やすくなる(個人差はあります)。

f:id:dragstarclassic:20180109144632p:plain

だいたいは

plt.legend(frameon=True)

こうするだけでだいぶ見やすくなるわけだが、個人的には枠線があると見やすいと思うので、枠線の色も加えた。

他にもオプションがあるので、リンク先のAPIを参考に。

legend and legend_handler — Matplotlib 2.1.1 documentation

seabornは奥が深い

コード

pandasデータフレームをsklearnにぶち込む作法

せっかくirisがデータフレームで使えるようになったのに!!

dragstar.hatenablog.com

pandasからnp.arrayにする

sklearnの引数はnp.arrayとなっているので、pandasのデータフレームからは直接使えない。ということでデータフレームからnp.arrayにする必要がある。

 

  • 指定の列からnp.arrayに変換
df = sns.load_dataset('iris')
data = np.array(df.iloc[:, 0:4]) #4列目までをnp.arrayにする

 

  • 文字列の列を数値に変換しながらnp.arrayにする
target = np.array([0 if i == 'setosa' else 1 if i == 'versicolor' else 2 for i in data.species.values])

 

これでsklearnの分類器に渡せる

clf.fit(data, target)

 

思ったよりも簡潔なコードだけど、データフレームから直接使いたいというのが正直なところ

コード

機械学習の結果を保存する

学習させたモデルを保存しておきたい!

学習結果の保存

要はオブジェクトをシリアライズさせておけばいい。概念としてはオブジェクトを名前を付けてファイルに保存して、使う際にはそのファイルを開いてオブジェクトとして使うというイメージ。

この処理を応用したら、ディープラーニングとかで大量の餌を食わしていく過程で「今日の学習はここまで。明日はその続きを」なんてことが可能になるかもしれない。

ということでpythonには標準でpickle(漬物:特にピクルス)というモジュールが用意されており、これを使えばシリアライズができる。

  • pickle

12.1. pickle — Python オブジェクトの直列化 — Python 3.6.3 ドキュメント

import pickle
target = [1, 2, 3, 4, 5]
fname = 'test.pickle'

print(target)
# [1, 2, 3, 4, 5]

# リストオブジェクトをpickleを使ってダンプ
with open(fname, 'wb') as f:
  pickle.dump(target, f)

# pickleを使ってリストオブジェクトをロード
with open(fname, 'rb') as f:
  target2 = pickle.load(f)

print(target2)
# [1, 2, 3, 4, 5]

 

機械学習ライブラリであるsklearnには、joblibというモジュールが最初から用意してあった。まぁ学習結果の保存はやりたいですよね。ということで方法2

  • joblib

3.4. Model persistence — scikit-learn 0.19.1 documentation

import sklearn.externals import joblib

clf.fit(X_train, Y_train) # clfは何らかの学習モデル
pre1 = clf.predict(X_test)

fname = 'test.joblib'

# joblibを使ってオブジェクトをダンプ
joblib.dump(clf, fname)

# joblibを使ってオブジェクトをロード
clf2 = joblib.load(fname)
pre2 = clf2.predict(X_test)

# pre1とpre2は同じ結果が出るはず(X_trainが同じ値なら)

コード

jupyterによるコードはコチラ。IRISを学習させ、結果を保持しておく。オブジェクトを復元させて同じ結果が出ることが確認できる。

irisのデータセットをpandasで使う その2

A「オイオイオイ」

B「楽だわこっちのほうが」

dragstar.hatenablog.com

これまではirisのデータセットをsklearnから引っ張ってきたけど、seabornから引っ張ってこれるみたい。何気なく使ってるけど、seabornって本当はなんのライブラリなんだろうと、いよいよわからなくなってきた。

seabornからiris

ということで、irisを使いたければこれで済む

import pandas as pd
import seaborn as sns
iris = sns.load_dataset("iris")
iris.head()

戻りはpandasのデータフレームで返される。

他にもタイタニックとかがある。

titanic = sns.load_dataset("titanic")
tips = sns.load_dataset("tips")

詳しくはgithubを見たらいい(そんなにない) github.com

JupyterをIBM Cloudで動かす

ようやくこれでiPad de Jupyterができる

Data Science Experience

参考記事 qiita.com

IBMCloudに環境を作ること自体はこの参考記事の通りやればできる。なんも難しい事はないが、接続先のホストが恐らくアメリカ南部とかその辺なので、日本からやるとレスポンス的にあれだという事。各種設定をIBMCluodのダッシュボード上でポチポチとボタンを押していく作業をするのだが、ところどころ考え中のアニメーションから帰ってこない事があった。いくつかそういったポイントがあったが、我慢強く待つことでIBMCloudを使う資格が与えられる。

各種設定を行ってからPCのブラウザ上でJupyterを動かすことは確認ができた。

f:id:dragstarclassic:20171225101910p:plain

上記コードの通り、pandas、numpy、matplotlibが一通りそろっているので、すぐにでも動かすことができる。確認したらsklearnもあったので機械学習的な事も出来る。どうやらバックグラウンドとしてはanacondaが環境として入っているのかも。

スクリーンショットはないけど、iPadでも同様に見ることができたし、実行もできた。ただやっぱりレスポンスに難があるのは何ともしがたい。それでもとりあえずの目標はクリアできたかなというところ。

IBM Cloud

www.nikkei.com

このニュースに踊らされた技術者は少なくないと思う。Watsonが全面的に無料になるのではなく、このIBM CloudのLite版で使えるいくつかのWatsonAPIが無料になるだけだということだ。とりあえずJupyterを動かしたくてIBM Cloudにアカウントを作ったわけだが、このようにWatsonとかも(少なからず)使えるので、時間ができたら他にもいろいろ試していこうと思う。

2017年富士通フロンティアーズ社会人制覇

いやーすごい点差のゲームでしたね。

prw.kyodonews.jp

www.japantimes.co.jp

www.bcnretail.com

ZINRAI vs Watson

富士通IBMなので当然そう見てしまう。開幕1Qで赤き富士通は疾風迅雷のごとくキックオフリターンタッチダウンを決める。その直後、浮足立つ相手のスキを見逃さなかった青のワトソン君はインサイドからランを決めて同点。1Q開始からそれほど時間がたっていないのにこの展開、まさかの殴り合いが始まる予感がビンビンしてくる。が、落ち着いた迅雷はその後も着実にタッチダウンを重ねていき、最終的には63-23とあまり見たことのない点差のゲームとなった。

富士通

なんといってもQB。この日はWRへの投げ分けがうまくいき、どこへ投げてもパスが通る。特にWR中村へのパスは200ヤードを超える成績で、このコンビで爆発的に得点を取ったといっても過言ではない。スタッツをよく見ると、ランによる獲得ヤードも富士通QBがチームNo1という大車輪の活躍だ。さらにさらにサックも0で危なげない試合展開を見せる。おまけにFGによる得点もなく、すべてタッチダウンによる得点だった。

結果だけ見れば本当にでき過ぎで、ワンサイドゲームだったといえる。

IBM

試合序盤はランプレイが光るも、3サックな上QBの獲得ヤードも-13となかなかの結果。QBをプレイによって切り替えたりとあの手この手を尽くすも富士通DFに阻まれて、FGばかり決めるドライブが続く。ここぞというプレイでインターセプトをされ、何をやってもうまくいく富士通に対し、何をやってもうまくいかないといった様子。

IBMのRB、なんと京都大学ですよ。しかもこのRB、足がとてつもなく早い。ズバズバとカットしていく様は本当に興奮した。配られたパンプレットにあったロースターを見ていたらハーバード大学もいたような、、、さすが外資系の会社は選手層も面白い。

その他

  • ハーフタイムショーにNOKKOが来てた。フレンズを歌うあたり、客層をわかっているというかなんというか。
  • チアはやっぱりいいね。見ているだけで元気が出てくる。
  • ふろん太君も応援に来てた。でも君は見た目青いね。そういえば富士通はJ1に続きXBowlも取ったことで、日本のフットボールを完全に制覇したことになるな
  • 場内解説が丁寧すぎて面白い。1プレー1プレーを解説してくれるのは良かったが、スタジアムDJも含めてちょっと富士通よりか?

あぁ面白かった。ライスボウルも見に行っちゃおうかなぁ

AUKEY PB-N42

唯一といったがあれは嘘だ。

dragstar.hatenablog.com

初モバイルバッテリー

滑り込みでモバイルバッテリーをアマゾンのセールで買った。

外出時にスマホの電池が切れる事ってあまりないし、スマホはあまり買い替えないので2年は使い続ける。それでも後期にはどうしても電池はへたってくるので、保険として買ってみた。それにBluetoothイヤホンも充電できるし、なんといってもセールなので安かったし。

感想

ただのモバイルバッテリーに感想もなにもないですね。ということで一言。

重い

どうせバッグに入れておくから問題ないけど。

こちらからは以上です。