17 May 2017, 11:00

fast.ai の Practical Deep Learning for Coders, Part1 を受けた

fast.ai が提供する MOOC, “Practical Deep Learning for Coders Part1” を受けた。

特徴

プログラマのための実践ディープラーニング入門

この講座は、プログラマのためにある。素晴らしい理念の序文を引用したい。

The purpose of this course is to make deep learning accessible to those individuals who may or may not possess a strong background in machine learning or mathematics.

We strongly believe that deep learning will be transformative in any application; as such, this course is designed for individuals who possess a background in computer programming and would like to apply these techniques to their domain of expertise.

Deep Learning は、機械学習や数学に深い造詣がないといけないというまやかしを、 吹き飛ばそうという野心を感じる。

そして、機械学習も数学もできない自分にはピッタリの講座だ!

Practical~実践の意味、Kaggler になれ!

講師を努めるのは、Kaggle のかつての President、Jeremy Howard.

TED の動画もある。

そして毎週の課題は、Kaggle に挑戦すること。 そのうち、トップ 50% に入ることが基準として課される。

トップ 50% に入るのは、正直とてもたいへんだ。 しかし、この手法を使えば入れるという種明かしを授業のなかでしてくれる。

ここでタイトルの実践の意味がわかる。つまり、kaggle のデータを使って、 実際にデータ解析をすることで、実力をつけようという意図があるのだ。

実際、以下のコンペに挑戦する。

全て無料!ただし GPU つかうから AWS でインスタンス を借りてね

この講座は無料である。state-of-the-art の内容が無料で受けられる。

しかし、GPU をつかうから AWS を借りてねと言われる。1 時間 90 セントだから安いよと言われる。

p2 タイプというのが GPU 対応らしいのでそのインスタンスを借りる。

AWS の EC2 の自動セットアップスクリプトが提供されるのだけれども、 このスクリプトがアメリカとヨーロッパしか対応してなくて、アジアがない。

しかたがないので、アメリカの EC2 のインスタンスを使う。 操作すると、距離のせいか、レスポンスが遅いが、なんとか頑張る。

floydhub が使えるという情報を見つけた。

2 時間の動画と丁寧なレクチャーノート

毎週 2 時間の動画がある。他の MOOC は動画が短く区切られているけれども、 この MOOC は 2 時間ぶっ通しである。

なので、疲れる。毎回 TimeLine の wiki ページがあるので、 自分は途中休憩をはさみながら細切れに見た。

英語(ただし英語の字幕はある)なので、聞いていてもよくわからない。

しかし、ありがたいことに、すごく丁寧なレクチャーノートの wiki と Jupyter Notebook が提供されている。

疑問点があるときは、Forum で同じことに困っている人がいるので、Forum を検索する。

なので、英語のリスニングに不安がある人でも大丈夫。

Keras 大活躍

この講座では、Python2 と keras 1.x(Backend は Theano)を使う。なぜなら、簡単にかけるからだ。

(一応、Python3, Keras2 に対応した非公式リポジトリもある roebius/deeplearning1_keras2)

今まで TensorFlow しか知らなかったけれども、 Keras をつかうと、Deep Learning のコードがすごく簡単にかける。

Keras がこの講座で好きになった。

全 7 週間で最低 8 時間は自習しましょう

講義は全 7 回ある。2時間の講義ビデオに加えて 8 時間の自習が必要。

勉強時間は平均的に 8-15 時間が一般的らしい。 なかには、15-30 時間勉強する人もいるとか。

ハードだ。でも、他の MOOC と違い、自分のペースで進めることが出来るので、 時間に追い詰められることはなく、自分が納得できるまで努力することができる。

この MOOC は自習が重んじられているように感じた。

自分はこんな感じで、各回を進めた。

  • 動画みる(2h)
  • レクチャーノートを読む(2-3h)
  • Jupyter Notebook を読む(2h)
  • Assignment をやる(???)

講義メモ

以下、各回が終わるたびにメモを書いていきました。

lesson1: Image Recognition

lesson1 の動画はうれしいことに日本語字幕がついている。

前半で、AWS の環境構築をする。全てセットアップスクリプトが面倒見てくれるので、 問題なくセットアップできた。

それから、VGG16 という imagenet のモデルを ファインチューニングして、 Dogs vs. Cats Redux| Kaggle 用にモデルをつくる。

fine-tuning については、この記事が詳しい。

課題は、上記 kaggle のコンペティション(競技会)に参加してみること。 自分が参加したときは、もう既にこのコンペが終了していた。 提出はできたので、スコアを眺めてみたけれども、どうもあまり成績はよくなかった。

lesson1 では、理論的な話はでてこないので、説明された通りに進めていけば OK.

lesson2: CNNs

前半は、lesson1 の課題の説明。Dogs or Cats コンペで 上位に入るための種明かしがされる。

後半は、CNN について。CNN の説明はガイダンスでしたよね?といわれ、 CNN の理論は飛ばされて線形問題を SGD で解くことをやる。 そのあと、Keras をつかって、線形問題を解く。

その後、Keras をつかって、スクラッチから Dogs vs Cats をかいて どうやれば精度が向上するかを実験する。

課題は、コンペで 50%以内に入る種明かしを元に、再度 kaggle に挑戦してみること。 また、vgg16 の fine-tuning による方法はいろんな kaggle のコンペに適用可能なので、犬猫以外のコンペに参加してみること。

また、課題図書で 以下を読むこと。こんなに読めないよ!!と思ったので、読まなかったけど。

てか、普通にこれだけ勉強するなんて、アメリカの学生勉強しすぎでしょ、偉いよ。

lesson3: Overfitting

前半は、CNN の復習。サブ講師のレイチェルさんがちょくちょく質問をして、講義を遮る。

後半は、Overfitting と Underfitting について。以下の手法が紹介される。

  • Data Augmentation
  • Dropout
  • Bach Normalization

そして、これらのテクニックをつかって MMIST の認識を試み、 精度 97%まで達することを示す。自分も Kaggle の Digit Recognizer で好成績を出すことが出来た。

課題は、今までの復習(CNN はここまで)を各自でやるようにとのこと。 それから、State Farm のコンペで上位 50% に入ることが課せられるのだが、 これができなかった。。

lesson4: Embedding

前半は、CNN を Excel で表現していろいろ動かしてみるデモ。

それから、いくつかの最適化手法が紹介される。

  • Momentam
  • Adagrad
  • RMSProp
  • Adam
  • Eve

これを Excel で実装したものが与えられるのだが、Excel もっていない。 LibreOffice では、VBA マクロを動作させることができない。 しかたがないので、Lecture Note と Video で雰囲気だけ感じた。

それから、State Farm のコンペの攻略法について 30 分ほど話がある。 Psuedo-labeling という手法。今週も頑張ってねとのこと。

Psuedo-labeling で検索かけたら面白いスライド見つけた。10 位だって、すごい。

State Farm の課題はサーバーのメモリエラーが発生したので Pesude-labeling の手法ができない! 上位 50%は諦めた。

State Farm が終わったら、Fisheries Monitoring のコンペが紹介される。 Vgg16 の転移学習を試したら、すぐにいい成績が出た。転移学習最強説がでできた。

最後に協調フィルタリングの紹介。Excel のソルバーを使ってデモをしていたけれども、 自分は Excel を持っていないので、試すことができない。 講義資料の ipynb で keras による、協調フィルタリングの説明もある。 ここで、embedding という概念を説明して、次の lesson の word embedding につながる。

lesson4 は Excel 大活躍だな。

lesson5: NLP

まずは、Vgg16 に BatchNormalization を適用したモデルの紹介。

次に、協調フィルタリングについて先週のノートを元に復習したあと 今回のテーマである NLP に。

センチメント分析を Embeddings をつかって実施する。 データは、IMDB という映画のレビューのデータセットを利用する。

単純なモデルから、複雑なモデルへと説明していき、精度が向上することを確かめる。

面白いと思ったのは、NLP の世界でも画像のような訓練済みのモデルを使った 転移学習ができるということだ。Glove という訓練済みのモデルを利用したりした。 日本語の訓練済みモデルが欲しいところだ。

最後に、次のレッスンの導入として RNN の簡単な説明があって終了。

lesson6: RNNs

RNN のモデルが説明される。簡単なモデルから、だんだん複雑になっていく。

文章の文字を読み込んで次の文字を推測するということをやる。

  • 3 層のモデル
  • 8 層のモデル
  • N 層のモデル
  • Sequential RNN
  • Stateful RNN

そして一通り説明が終わったところで、なんと、Theano がでてくる。

今までは実践的なことばかり教えてきて、Keras で簡単に DL を実装してきたけど、 Keras がどう動いているのかとか、低レイヤとかのことも知っておいたほうがいいよね、 というわけで、Theano による RNN の実装の説明がはじまる。

そして、次回予告として、次回は numpy で RNN を実装するよ!とのこと。感動の最終回??

lesson7: CNN Architectures

ResNet という新たなモデルが出てくる。 これは 2015 年に 現れた手法のようで、VGG モデルよりも複雑。 Input を 層を重ねたあとに Merge するというよくわからないことをやっていた。 ソースコードも提供されている。(courses/resnet50.py)

そのあとに、kaggle Fisheries Monitoring コンペの攻略法の解説。 lesson7 は、3/4 の時間を Fisheries Monitoring の解説に費やすというサービス。 Kaggle 必勝法が凝縮している講義だ。 自分は、一回動画を見ただけでは理解できなかった。

この講座はこれで最後でこれが終わったら、暇になるだろうから、 この Jupyter Notebook を何度も読んで、Kaggle で遊んでねとのこと。

そして、残りの 30 分で、numpy を使った RNN の実装と GRU の紹介。 LSTM よりも、GRU のほうが便利なので、GRU を紹介するとのこと。

難しいのが最後にきた。。keras は一行でかけるが本質を理解することが大事とのことで、 ここでも Theano による実装が紹介された。BackPropagation、復習しよう。

おわりに

この講座でおしいところは、紹介されている kaggle のコンペがすでに終わっているところだ。

今 Active な Kaggle コンペに参加して腕試ししようかと思って、入門の Titanic や Digit Recognizer にも挑んだりした。

DeepAnalytics という日本のデータ解析のコンテストサイト(Kaggle の日本版)を知った。 私は、この MOOC で学んだ技で腕試しをしようと思ってコンテストに挑戦した。そういう実力もつくのがこの MOOC だ。 自分がそういう力を数週間のうちに獲得できるとは思わなかった、順位は低いけど。

coursera で、Octave 使って Machine Learning 学んで結局何にも応用できずに終わるのならば、 この MOOC で実践的なことを学んで、Kaggle なり DeepAnalytics に挑戦したほうがいい。

Machine Learning よりも時代は Deep Learning だ。 DeepAnalytics では、参加者がどの手法や言語をつかったかが分かるのだが、 圧倒的に Python と DeepLearning が使われている。

この MOOC は実践的でかつわかりやすいところが素晴らしい。もっと知られるべきだ。 Udacity で Deep Learning Nanodegree Foundation を受講してるが、この MOOC ほうがいい。

この MOOC は Part2 もある。Part2 はもうすぐ公開予定。楽しみ!

13 May 2017, 09:11

gensim で謎かけしたら微妙な結果になった

はじめに

word2vec を知ったので、これを利用して謎かけできないかと考えました。

結論からいうと、面白いものはできませんでした m(._.)m

今回の Jupyter Notebook は以下です。

謎かけとは

謎かけとは、

「x とかけまして、y と解く。その心は・・・ z でございます。」

というもので、x と y の共通点を z という言葉遊び。

落語家が大喜利でお客さんから お題 x をもらって、それに対して洒落た答えを返す。

例えば、「眼鏡とかけまして、椅子と解く、その心はどちらもかけるものでございます」など。 あまり面白くないね。

自分は学生のとき落語研究会に入っていたので、学園祭のときに謎かけをよくやって恥をかいていた。

gensim を使う

gensim という python で NLP をするときによく使われるライブラリがあるが、 そこに word2vec が実装されてライブラリとして提供されている。

word2vec を使うと、ある単語に関係する単語を導くことができる。(most_similar)

これをつかって、謎かけめいたことができないか考えたのだった。

gemsin のインストール

Anaconda 環境で以下のコマンドで。cython をインストールすると計算が早くなるらしい。

conda install gensim
conda install cython

model の作成

text8 という 英語の Wikipedia のデータセットを使う。なぜかというと、用意が簡単だから。

$ wget http://mattmahoney.net/dc/text8.zip -P /tmp
$ unzip text8.zip

解凍した text8 ファイルには英単語が羅列されている。これを学習のインプットにする。

from gensim.models import word2vec
data = word2vec.Text8Corpus('/tmp/text8')
model = word2vec.Word2Vec(data, size=200)
model.save("sample.model")

これで sample.model というモデルができる。size=200 というのは 単語を表現するベクトルの長さ。

embeddings の 加算

単語を表すベクトル同士の足し算をしてみる。

model.most_similar(positive=['dog','cat'])

[('goat', 0.7966023683547974),
 ('bee', 0.7859479784965515),
 ('pig', 0.7830795645713806),
 ('bird', 0.7660524845123291),
 ('hound', 0.7580216526985168),
 ('panda', 0.7541525363922119),
 ('hamster', 0.7503507137298584),
 ('ass', 0.7488968372344971),
 ('haired', 0.7469390630722046),
 ('rat', 0.7466884851455688)]

加算した結果に類似する単語が帰ってくる。動物が特徴なことが分かる。

謎かけをしてみる

加算だとあまりよい結果がでなかったので、ある単語に近い単語を求めて、二つの単語に共通する単語を求めてみる。

wx = 'japanese'
x = model.wv[wx]
wy = 'smart'
y = model.wv[wy]

sx = set()
for word, emb in model.most_similar([x], [], 500):
    sx.add(word)
sy = set()
for word, emb in model.most_similar([y], [], 500):
    sy.add(word)

sz = (sx & sy)

sz で集合 x と 集合 y の両方に含まれる単語 z が求められる。これを表示してみる。

for wz in sz:
    print(wx + "とかけまして" + wy + "と解く。その心は・・・" + wz + "でございます")
japanese とかけまして smart と解く。その心は・・・ capcom でございます
japanese とかけまして smart と解く。その心は・・・ starcraft でございます
japanese とかけまして smart と解く。その心は・・・ doraemon でございます

日本人とかけて秀才と解く、そのこころは、ドラえもんです。。。微妙だ。

いろいろ試してみたけれども、うまくいかなかった。z が名詞だとつまらないな、動詞が来てほしいが方法がわからない。

時間があれば、日本語版 Wikipedia を情報源に使ってみたいけれども、作成に時間がかかりそう。

13 May 2017, 04:42

Word2Vec(skip-gram)で自分の twitter アカウントのツィート分析した

はじめに

Udacity DLND、今週は week8。word2vec がテーマ。

週をおうごとによくわからなくなっていくのは、自分だけだろうか。 だんだん、コピペと写経の講座になってしまっている。

リンクが張られてこれ読んでおいてねという感じ。自学自習が重視される。

というわけで、理解を深めるために、試行錯誤してみた。

week8 は、word2vec(skip-gram model) を tensorflow で実装するという内容。 word2vec は、2 層のニューラルネットワークに過ぎないので理解はたやすいのだけれども、 その前処理(SubSumpling)や 高速化のテクニック(Negative Sampling)が意味わからなかった。

この絵で説明する word2vec の解説ページがとてもわかりやすかった。感謝!

演習では、text8 という Wikipedia のデータセットを用いるのだけれども、相変わらず英語で、 日本人の自分にはピンとこない。というわけで、日本語のデータセットを自分で用意して試すことにした。

今回試したフル実装の Jupyter Notebook は以下です。

ツィートをデータセットに用いる

自分の twitter アカウントのツィートをデータセットにもちいることにした。

といっても、元ネタがあって、元ネタはこの記事。

この記事に 自分のツイートを取得する方法が詳しく書いてある。 twitter が csv データを提供してくれるのだ。 ダウンロードすると、tweets.csv というファイルが手に入る。

pandas で読み込んで前処理を加える。 studyplus とか fitbit のログを垂れ流していたので、それらは削除。

raw_data = pd.read_csv('tweets.csv')
text = raw_data['text']

# studyplus の垂れ流しツイートは削除
text = text[text.str.contains("#studyplus") == False]
# fitbit のライフログは削除
text = text[text.str.contains("おはようございます。今日は") == False]

オープンソースの形態素解析エンジンである MeCab をインストールして、 ツイートを単語ごとに分解して保存する。

ここでもさらに文章からゴミを落としていく。以下を参考にした。re.sub を使う。

import Mecab
import re
f_out = open("tweets_wakati.txt", "w" )
for line in text.iteritems():
    line = re.sub('https?://[\w/:%#\$&\?\(\)~\.=\+\-…]+','', line[1])
    line = re.sub('RT', "", line)
    line = re.sub(r'[!-~]', "", line)#半角記号,数字,英字
    line = re.sub(r'[︰-@]', "", line)#全角記号
    line = re.sub('\n', " ", line)#改行文字
    f_out.write(m.parse(line))
f_out.close()

これで tweet データセットがてにはいった。

Word2Vec を Tensorflow で実装

Word2Vec を tensorflow で実装!といっても課題をコピペしただけなので、省略!!

元の課題のコードを見てください。

可視化

こうなりました。自分を構成している概念が可視化されて面白い。

たとえば、落語という言葉に注目してみると、 周辺には寄席、談志、独演会など、落語関係の言葉がちゃんとあつまっている。

09 May 2017, 15:53

pybitflyer をつかって Python で ビットコインレートを取得してみた

以前、FX システムトレードをしていたので、その経験を生かし(5 万損したけどね)、 Bitcoin でシステムトレードが出来ないか調べてみた。

Bitcoin API 調査

“bitcoin api” で検索をかけた。また、言語は Python で書きたいので、 Python で使えるかも注目して調べた。

ざっと調べた限りだと、 日本では以下の会社が API を提供しているようだ。

なお、調査には、以下のサイトの情報が役立った。 システムトレードできる会社の名前が列挙されて、比較されている。

python library 調査

BitFlyer に決めた

BitFlyer の API を利用することにした。

理由は、検索で上位に引っかかったから。とりあえずお試しなので、これでいいだろう。

そんな決定で大丈夫か?大丈夫だ、問題ない(ぬわー)

インストール

Anaconda 環境を構築して、そこにインストールした。

conda create -n bitcoin
source activate bitcoin
pip install pybitflyer

BitCoin レートを取得

使い方は簡単。4 行だ。

import pybitflyer

api = pybitflyer.API()
while True:
    print(api.ticker(product_code = "BTC_JPY"))
{'product_code': 'BTC_JPY', 'timestamp': '2017-05-09T14:55:00.413', 'tick_id': 388314, 'best_bid': 208700.0, 'best_ask': 208820.0, 'best_bid_size': 6.95343174, 'best_ask_size': 0.001, 'total_bid_depth': 5013.20612844, 'total_ask_depth': 1350.24206904, 'ltp': 208700.0, 'volume': 135481.11248751, 'volume_by_product': 18380.43374774}
{'product_code': 'BTC_JPY', 'timestamp': '2017-05-09T14:55:01.023', 'tick_id': 388315, 'best_bid': 208700.0, 'best_ask': 208820.0, 'best_bid_size': 6.95343174, 'best_ask_size': 0.001, 'total_bid_depth': 5011.09612844, 'total_ask_depth': 1350.24206904, 'ltp': 208700.0, 'volume': 135481.11348751, 'volume_by_product': 18380.43374774}
{'product_code': 'BTC_JPY', 'timestamp': '2017-05-09T14:55:01.477', 'tick_id': 388318, 'best_bid': 208700.0, 'best_ask': 208820.0, 'best_bid_size': 6.95343174, 'best_ask_size': 0.001, 'total_bid_depth': 5011.21504903, 'total_ask_depth': 1350.24206904, 'ltp': 208700.0, 'volume': 135481.11348751, 'volume_by_product': 18380.43374774}

ドキュメントは以下。

API は、

  • API キーによる認証が不要な HTTP Public API
  • 認証が必要な HTTP Private API

に分けられる。なのでほんとうは、pybitflyer.API()のインスタンス引数に、

  • api_key
  • api_secret

を取得して、設定する必要があるのだが、口座開設してすぐには発行されないので、今はこれで。 API Key, API Secret は、ビットコイン取引所【 bitFlyer Lightning 】 にログインして、 左バーのところにある API を選択して、取得する。

どんな情報が取得できたのか

json ライブラリで見やすくする。

import pybitflyer
import json

api = pybitflyer.API()
while True:
    print(json.dumps(api.ticker(product_code = "BTC_JPY"), 
                     sort_keys=True, indent=4))

取得結果。

{
    "best_ask": 209190.0,
    "best_ask_size": 0.0075,
    "best_bid": 209147.0,
    "best_bid_size": 0.02277838,
    "ltp": 209557.0,
    "product_code": "BTC_JPY",
    "tick_id": 392364,
    "timestamp": "2017-05-09T15:08:51.51",
    "total_ask_depth": 1312.51807976,
    "total_bid_depth": 4998.61968155,
    "volume": 134942.30375862,
    "volume_by_product": 18338.51424803
}

トレード用にデータを間引く

ここでトレードに必要な情報は、FX の経験からいうと、

  • best_bid
  • best_ask

(- product_code)

  • timestamp

データを修正する。

import pybitflyer
import json

api = pybitflyer.API()

class Event(object):
    pass

class TickEvent(Event):
    def __init__(self, instrument, time, bid, ask):
        self.type = 'TICK'
        self.instrument = instrument
        self.time = time
        self.bid = bid
        self.ask = ask

    def show(self):
        print("instrument:" + self.instrument +
              ", time:" + self.time +
              ", bid:" + str(self.bid) +
              ", ask:" + str(self.ask))

while True:
    data = json.dumps(api.ticker(product_code = "BTC_JPY"))
    data_dict = json.loads(data)
    event = TickEvent(data_dict['product_code'], 
                      data_dict['timestamp'],
                      data_dict['best_bid'],
                      data_dict['best_ask'])
    event.show()
instrument:BTC_JPY, time:2017-05-09T15:52:25.537, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:26.413, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:26.853, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:26.697, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.257, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.977, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.977, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.977, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.977, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:30.457, bid:209164.0, ask:209165.0

これで、FX とおなじデータ形式になったので、FX のコードが再利用できるぞ。

追記 ヒストリカルデータが欲しいな

シストレするためには、バックテストをしたい。そのために、ヒストリカルデータが必要だ。

さがしてみると、coincheck のデータが Bitcoincharts というサイトで Markets API として公開されているようだ。

以下の日本語の記事が詳しい。

なので、Bitflyer は止めて、Coincheck(コインチェック) に変更することにした。

coincheck も python の API がある。ありがたい。

これをつかって、Producer-Consumer Pattern をつかって、値を取得する処理を途中まで書いた。

開発中のリポジトリは以下です。

09 May 2017, 08:59

Vgg16 モデルに Batch Normalization を組み込む技

はじめに

Vgg16 モデルによる転移学習で、kaggle で結構いい成績がでているので、 転移学習すごくない?と思っている今日この頃。

Vgg16 モデルを使って、kaggle の MNIST コンペ に挑戦したらどうなるだろうと思っていろいろ試してみた。 結論からいうと、無謀な挑戦で挫折したのだけれども、得たことをまとめて置く。

Vgg16 モデルには、Batch Normalization が使われていない

Batch Normalization は、overfitting を防ぎ、学習をスピードアップさせるよい方法なのだが、 Vgg16 モデルには、Batch Normalization が使われていない。

なぜか?それは、VGG16 モデルができたとき、Batch Normalization は存在しなかったから。

Fast AI での解決方法

fast.ai の講義では Lesson4,5 で、VGG に Batch Normalization を組み込む方法を紹介している。

以下の ipynb がそれ。

以下の処理で、Vgg16 モデルの最後の Convolution レイヤのインデックス値を調べて、 FC 層を取っ払う。ここでコールしている Vgg16 クラスは、独自関数(keras とは関係ない)ので注意。

vgg = Vgg16()
model=vgg.model
last_conv_idx = [i for i,l in enumerate(model.layers) if type(l) is Convolution2D][-1]
conv_layers = model.layers[:last_conv_idx+1]
conv_model = Sequential(conv_layers)

取っ払った層(30 層)のみで、学習をする。

conv_feat = conv_model.predict_generator(batches, batches.nb_sample)
conv_val_feat = conv_model.predict_generator(val_batches, val_batches.nb_sample)
conv_test_feat = conv_model.predict_generator(test_batches, test_batches.nb_sample)

以下のような、BatchNorm と Dropout を含む層を作成する。

def get_bn_layers(p):
    return [
        MaxPooling2D(input_shape=conv_layers[-1].output_shape[1:]),
        Flatten(),
        Dropout(p/2),
        Dense(128, activation='relu'),
        BatchNormalization(),
        Dropout(p/2),
        Dense(128, activation='relu'),
        BatchNormalization(),
        Dropout(p),
        Dense(10, activation='softmax')
        ]
p=0.8
bn_model = Sequential(get_bn_layers(p))
bn_model.compile(Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])

この層をつかって、前に学習した conv_feat から学習を再開する。

bn_model.fit(conv_feat, trn_labels, batch_size=batch_size, nb_epoch=1, 
             validation_data=(conv_val_feat, val_labels))

うーむ、うなるような職人技だ。

Keras では、オプション指定で可能

Keras では、VGG16 がデフォルトで使うことが出来る。以下の記事が詳しい。

VGG16 というクラスが用意されている。

このクラスをつかうときに、include_top オプションを False に指定することで、 ネットワークの出力層側にある 3 つの全結合層を含まないように指定できるのだ。

このオプションをつかうと以下のように組み込むことが出来る。

def pretrained_model(img_shape, num_classes):
    model_vgg16_conv = VGG16(weights='imagenet', include_top=False)
    #model_vgg16_conv.summary()

    #Create your own input format
    keras_input = Input(shape=img_shape, name = 'image_input')

    #Use the generated model 
    output_vgg16_conv = model_vgg16_conv(keras_input)

    #Add the fully-connected layers 
    x = Flatten(name='flatten')(output_vgg16_conv)
    x = Dropout(0.8)(x)
    x = Dense(256, activation=layer_type, name='fc1')(x)
    x = BatchNormalization()(x)
    x = Dropout(0.8)(x)
    x = Dense(256, activation=layer_type, name='fc2')(x)
    x = BatchNormalization()(x)
    x = Dropout(0.8)(x)
    x = Dense(num_classes, activation='softmax', name='predictions')(x)

    #Create your own model 
    pretrained_model = Model(inputs=keras_input, outputs=x)
    pretrained_model.compile(optimizer=Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])

    return pretrained_model

元にした情報元は以下のリンク

VGG16 モデルで画像の入力サイズを変更したい

VGG16 は デフォルトで 226x226 のサイズの画像を処理するように設計されているけれども、 上のソースを使うことで、input shape を変更できる。

よし、これで MNIST に挑戦するぞ!と思ったら、なんとサイズに制限があった!!

公式ドキュメントによると、48x48 以上でなければいけないのだ。

正確に 3 つの入力チャンネルをもつ必要があり,width と height は 48 以上にする必要があります

MNIST は 28x28 なので、使えない。痛恨!!

今回の記事でとちゅうまで書いた中途半端な ipynb は以下です。

05 May 2017, 10:00

LSTMで為替の予測をしてみた

RNN(LSTM)入門2日目。依然として、全然わかりません。

このあたりが自分のスキルの限界なのかもしれない。Udacity DLNDで株の値動きの予測をする動画が紹介された。

FXのシステムトレードを以前やっていたので、ディープラーニングで学んだことが生かせればいいなと思い、株を為替に置き換えて、LSTMで為替の値動きの予測をしてみた。

この記事は以下の記事をベースに書いている。

また、以下のkaggleコンペのkernelsも大いに参考にした。

準備

  <p>
    まずは、為替データを準備する。以下のサイトから、2017/4/24 の USD/JPY の 10分刻みのデータをダウンロードする。
  </p>

  <ul>
    <li>
      <a href="https://www.dukascopy.com/swiss/english/marketwatch/historical/">Historical Data Feed :: Dukascopy Bank SA | Swiss Forex Bank | ECN Broker | Managed accounts | Swiss FX trading platform</a>
    </li>
  </ul>

  <p>
    githubにも使用したデータをアップロードした。
  </p>

  <ul>
    <li>
      <a href="https://github.com/tsu-nera/futurismo/blob/main/blog/ipynb/USDJPY_Candlestick_10_m_BID_24.04.2017-25.04.2017.csv">futurismo/USDJPY_Candlestick_10_m_BID_24.04.2017-25.04.2017.csv</a>
    </li>
  </ul>

  <h3 id="環境">
    環境<a class="anchor-link" href="#環境">¶</a>
  </h3>

  <ul>
    <li>
      TensorFlow 1.1.0
    </li>
    <li>
      Keras 2.0.2
    </li>
  </ul>
</div>

LSTM Network for Regression

  <p>
    チュートリアルにしたがって順にコードを書いていく。
  </p>
</div>

In [1]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">print_function</span>

import numpy as np # linear algebra import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv) from keras.layers.core import Dense, Activation, Dropout from keras.layers.recurrent import LSTM from keras.models import Sequential from sklearn.preprocessing import MinMaxScaler from sklearn.metrics import mean_squared_error import matplotlib.pyplot as plt import math

    <div class="output_subarea output_stream output_stderr output_text">
      <pre>Using TensorFlow backend.

In [2]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># parameters to be set </span>

look_back = 1 epochs = 30 batch_size = 1

In [3]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># fix random seed for reproducibility</span>

np.random.seed(7)

PrePare Data

In [4]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># read all prices using panda</span>

dataframe = pd.read_csv(‘USDJPY_Candlestick_10_m_BID_24.04.2017-25.04.2017.csv’, header=) dataframe.head()

Out[4]:

    <div class="output_html rendered_html output_subarea output_execute_result">
      <div>
        <table class="dataframe" border="1">
          <tr style="text-align: right;">
            <th>
            </th>

            <th>
              Local time
            </th>

            <th>
              Open
            </th>

            <th>
              High
            </th>

            <th>
              Low
            </th>

            <th>
              Close
            </th>

            <th>
              Volume
            </th>
          </tr>

          <tr>
            <th>
            </th>

            <td>
              24.04.2017 00:00:00.000
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              0.0
            </td>
          </tr>

          <tr>
            <th>
              1
            </th>

            <td>
              24.04.2017 00:10:00.000
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              0.0
            </td>
          </tr>

          <tr>
            <th>
              2
            </th>

            <td>
              24.04.2017 00:20:00.000
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              0.0
            </td>
          </tr>

          <tr>
            <th>
              3
            </th>

            <td>
              24.04.2017 00:30:00.000
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              0.0
            </td>
          </tr>

          <tr>
            <th>
              4
            </th>

            <td>
              24.04.2017 00:40:00.000
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              109.072
            </td>

            <td>
              0.0
            </td>
          </tr>
        </table>
      </div>
    </div>
  </div>
</div>

In [5]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">dataset</span> <span class="o">=</span> <span class="n">dataframe</span><span class="p">[</span><span class="s1">'Close'</span><span class="p">]</span>

In [6]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># reshape to column vector</span>

#close_prices = close.values.reshape(len(close), 1) dataset = dataset.values dataset = dataset.astype(‘float32’) close_prices = dataset.reshape((-1,1))

ここで、データを0~1の間に正規化する。scikit-learnにMinMaxScalerという便利な関数があって、fit_transformとすると、正規化できる。戻すときは、inverse_transformをコールする。

In [7]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># normalize the dataset</span>

scaler = MinMaxScaler(feature_range=(, 1)) close_prices = scaler.fit_transform(close_prices)

訓練用データを 23, テスト用データを 1/3に分ける。

In [8]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># split data into training set and test set</span>

train_size = int(len(close_prices) * 0.67) test_size = len(close_prices) - train_size train, test = close_prices[:train_size,:], close_prices[train_size:len(close_prices),:]

print(‘Split data into training set and test set… Number of training samples/ test samples:’, len(train), len(test))

    <div class="output_subarea output_stream output_stdout output_text">
      <pre>Split data into training set and test set... Number of training samples/ test samples: 192 96

create_dataset()で訓練用のラベルを生成する。現在のデータから一つ先(look_back=1)のデータ、つまり10分後の値動きを予想する。

  <p>
    ちなみにこの関数は便利で、look_backを2にすると、2つ前のデータ、つまり現在と10分前のデータから10分後のデータを予測することができる。look_backパラメータを調整することで、過去のデータから10分後のデータを予測できる。これを元の記事では、Window Methodと書いてある。
  </p>
</div>

In [9]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># convert an array of values into a time series dataset </span>

# in form # X Y # t-look_back+1, t-look_back+2, …, t t+1

def create_dataset(dataset, look_back): dataX, dataY = [], [] for i in range(len(dataset)-look_back-1): a = dataset[i:(i+look_back), ] dataX.append(a) dataY.append(dataset[i + look_back, ]) return np.array(dataX), np.array(dataY)

# convert Apple’s stock price data into time series dataset trainX, trainY = create_dataset(train, look_back) testX, testY = create_dataset(test, look_back) (trainX.shape, trainY.shape, testX.shape, testY.shape)

Out[9]:

    <div class="output_text output_subarea output_execute_result">
      <pre>((190, 1), (190,), (94, 1), (94,))</pre>
    </div>
  </div>
</div>

In [10]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># reshape input of the LSTM to be format [samples, time steps, features]</span>

trainX = np.reshape(trainX, (trainX.shape[], 1, trainX.shape[1])) testX = np.reshape(testX, (testX.shape[], 1, testX.shape[1])) (trainX.shape, testX.shape)

Out[10]:

    <div class="output_text output_subarea output_execute_result">
      <pre>((190, 1, 1), (94, 1, 1))</pre>
    </div>
  </div>
</div>

Build Model & Training

  <p>
    Kerasを利用してLSTMネットワークのモデルを作り、トレーニングを実施する。
  </p>
</div>

In [11]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># create and fit the LSTM network</span>

model = Sequential() model.add(LSTM(4, input_shape=(1, look_back))) model.add(Dense(1)) model.compile(loss=‘mean_squared_error’, optimizer=‘adam’) model.fit(trainX, trainY, epochs=epochs, batch_size=batch_size,verbose=2)

    <div class="output_subarea output_stream output_stdout output_text">
      <pre>Epoch 1/30

1s - loss: 0.1224 Epoch 230 0s - loss: 0.0332 Epoch 330 0s - loss: 0.0204 Epoch 430 0s - loss: 0.0160 Epoch 530 0s - loss: 0.0117 Epoch 630 0s - loss: 0.0082 Epoch 730 0s - loss: 0.0056 Epoch 830 0s - loss: 0.0041 Epoch 930 0s - loss: 0.0034 Epoch 1030 0s - loss: 0.0031 Epoch 1130 0s - loss: 0.0030 Epoch 1230 0s - loss: 0.0030 Epoch 1330 0s - loss: 0.0029 Epoch 1430 0s - loss: 0.0029 Epoch 1530 0s - loss: 0.0030 Epoch 1630 0s - loss: 0.0029 Epoch 1730 0s - loss: 0.0029 Epoch 1830 0s - loss: 0.0029 Epoch 1930 0s - loss: 0.0029 Epoch 2030 0s - loss: 0.0029 Epoch 2130 0s - loss: 0.0030 Epoch 2230 0s - loss: 0.0030 Epoch 2330 0s - loss: 0.0029 Epoch 2430 0s - loss: 0.0029 Epoch 2530 0s - loss: 0.0030 Epoch 2630 0s - loss: 0.0030 Epoch 2730 0s - loss: 0.0030 Epoch 2830 0s - loss: 0.0029 Epoch 2930 0s - loss: 0.0029 Epoch 3030 0s - loss: 0.0030

  <div class="output_area">
    <div class="prompt output_prompt">
      Out[11]:
    </div>

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;keras.callbacks.History at 0x7f29913c3b00&gt;</pre>
    </div>
  </div>
</div>

Predict

In [12]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># make predictions</span>

trainPredict = model.predict(trainX) testPredict = model.predict(testX)

In [13]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># invert predictions and targets to unscaled</span>

trainPredict = scaler.inverse_transform(trainPredict) trainY = scaler.inverse_transform([trainY]) testPredict = scaler.inverse_transform(testPredict) testY = scaler.inverse_transform([testY])

In [14]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># calculate root mean squared error</span>

trainScore = math.sqrt(mean_squared_error(trainY[], trainPredict[:,])) print(‘Train Score: %.5f RMSE’ % (trainScore)) testScore = math.sqrt(mean_squared_error(testY[], testPredict[:,])) print(‘Test Score: %.5f RMSE’ % (testScore))

    <div class="output_subarea output_stream output_stdout output_text">
      <pre>Train Score: 0.09638 RMSE

Test Score: 0.06509 RMSE

In [15]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># shift predictions of training data for plotting</span>

trainPredictPlot = np.empty_like(close_prices) trainPredictPlot[:, :] = np.nan trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict

# shift predictions of test data for plotting testPredictPlot = np.empty_like(close_prices) testPredictPlot[:, :] = np.nan testPredictPlot[len(trainPredict)+(look_back*2)+1:len(close_prices)-1, :] = testPredict

In [16]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="c1"># plot baseline and predictions</span>

plt.plot(scaler.inverse_transform(close_prices)) plt.plot(trainPredictPlot) plt.plot(testPredictPlot) plt.show()

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/a3468b2a3ce342ea6e059347483820d6.png" />
    </div>
  </div>
</div>

予測結果は上の図。あまりにフィットしすぎて、なんかウソっぽいけれども、一応これが結果。

  <p>
    ちなみに、元の記事だとこの先もあるが、stepや state, stacked LSTMs が読んでもよくわからなかった。もう少し時間が必要。
  </p>

  <ul>
    <li>
      How to create an LSTM for a regression and a window formulation of the time series problem.
    </li>
    <li>
      How to create an LSTM with a time step formulation of the time series problem.
    </li>
    <li>
      How to create an LSTM with state and stacked LSTMs with state to learn long sequences.
    </li>
  </ul>

  <p>
    元記事を元に試してみたけれども、修正を加えるたびに精度が悪くなっていくのだった。
  </p>
</div>

おわりに

  <p>
    LSTMを FXのストラテジに応用できるか考えてみたのだけれども、よいストラテジが思いつかない。
  </p>

  <p>
    単純に回帰ならば、LSTMを使わなくてももっと簡単な方法がある。
  </p>

  <p>
    トレーニングに時間がかかるので、リアルタイムに過去のデータを処理して未来の値を予測できるのか?
  </p>

  <p>
    とはいえ、面白い話題なので、もう少し調べてみる。
  </p>
</div>

04 May 2017, 11:58

LSTM で坊ちゃんを学習させて文章生成

Udacity の Deep Learning Nanodegree Foundation week7。今回のテーマは RNN。

演習では、トルストイのアンナ・カレーニナの小説を LSTM で学習して、 文章を生成しているのだけれども、日本人の自分にはそのすごさがピンとこないので、 日本の小説で試してみた。

題材は、夏目漱石の坊ちゃん。

準備

青空文庫から坊ちゃんのテキストを入手した。

ルビ付きをダウンロードするとうまく学習できないと思って、 HTML 版からクリップボード経由で、テキストファイルにコピペした。

ipynb は以下。Udacity から提供された ipynb のインプットファイルを差し替えただけ。

ハイパーパラメータは酔う調整。以下のように設定した。

[sourcecode language=”python” title=””]
batch_size = 10 # Sequences per batch
num_steps = 50 # Number of sequence steps per batch
lstm_size = 128 # Size of hidden layers in LSTMs
num_layers = 2 # Number of LSTM layers
learning_rate = 0.01 # Learning rate
keep_prob = 0.5 # Dropout keep probability
[/sourcecode]

結果

オレオレいってますね。。。人工知能が小説をかける日はくるのだろうか・・・。

[sourcecode language=”text” title=””]
親切りにした. 山嵐とこんな所へは, おれはあったが, このおれは一人ではしたが, おれがこれでも, いいと, おれもおきませのような声だ. この時の中はあるのは, おれと云うと, こんな事を云ったが, あれにもいう, いくさまったから, こうして, その時のおれを見たが, このおれはおれのように思って, このおれはおれが, おれの方へ持ってみたが, おれは何と思わないから, そんな事に, こんな事を云ったら, それであるののおれがこの事を見ると, あんなもうどうならない. おれはおれは, おれももう, こうなってもいいから, こんなもんだ. おれが何と云うから, この時はおれの顔を出した. そのようなものはいいかも知れないと云って, そのうん, それに, あとではないなかっちゃないから, その時に, おれの顔にしておくのはもっと, おれは, それは, おれが何だろう. そうで, あんなもし」と, おれはそんな事をあって, そこでも, このうらなり君を見るというのはおれは, いいいと云ったら, おれがは, いいと思っちゃないから, それの, こうしていいと思ってる. それはいうと, いかした, このおれの事は, この一人には, それから, そうなっぽもこんな所へ出ると, おれはこんな, おれが何だかと云った.
「この時間を, いやなんです. いっしゃしたいと, いかなっと, おれのような所へ出たらいる. おれの事も, これにはおやじがないと, こんな事はこれはおれの方があると思った. いくしまい, これから, あの方が, おれがどうして来る. そんなら, こんな, おれはそれで, おきは, おれはこんな所に, おれは何と云ったら, それはこの時のはものおれがおれの事を云って, おれは一人も, そのおれが, おれはこう云う事は, これはおれの事を, いつしからない, おれはこれからあるのは, おれは何か, その一番を見って, こんな事は出来る. おれはおれは何があるまで, あんな事にはいる. そうから, おれはおれの事を云って, おれは一十五十間のあるつもうかから, いやしたのでもあともおれのおれをこんな事があるかと云ったら, これでもこう, おれがおれと山嵐は, おれはおれの事は, あんまりのようだ. あれにはもうあっぽどおれの事が出来ないと, これはあって, こんなものだ. おれはこれであなたが, あのおれはそれで, そのおきのおれの事をしまっている. おれはこんな, あとはおいたから, この時の中をはれったから, いやなんだ. おれは一番もうと云って来る. そのうらなら君の顔はないのだと思った. この時にはいったと云っていると, おれのお婆さん, おれの方を云ったら, いかない, あとうどうない. この時はあれないとも思ったが, これから, そのうち, いつものはあっても思っと, おれの顔を云うと, おれはこのおきの方を出る.
そのおれが, そのうちの人のはあっちが, いかしいと思ったら, おれの事を見るとおれのおれはおれはおやったのが, そうしたら, この時はあの人は, おれが山城屋が, いやにはいったからもう, あんなもとも, そのうらなり君のようでは, こうならないのは, あんな事は, この方におきと云われたから, おれはおれは, これから, あんなものか. いから, こうしまりゃなくれるのはありますから, いくなかったと思ったと, これはあのおれは, あとうんところはあとから云いている. おれの方を見るともうとう, あまりの事があった. おれはこのおれは, あまりなんだろう. いかしたもので, おれの顔はない. おれは一人ですか, この一つはいった. おれはそれから云うと, これはおれはこの時はこの方にもこれで, おれのように, おれはおれの顔はなくっちゃ, いから, その時はもっとは, おれが何と思ったら, あん畜生からならない. 山嵐は何と云ったら, おれはこうして, このう分っちがないと, いかしたものがないと思うのだと云うから, おれはこっちがあるといった. おれが山城屋の方へはある. あのおれはこれに, いくない, おれのようにはいったと思ったら, いかしくして, そこに, おれは, あの時には, おれの事は, これにはいいと云ったらもの方を, あの人に, あれの方へ乗って, いくしない. おれはそうから, おれは一日なると, いからまったもんだから, おれは, その一人に, こうして, あんなもと, この一人の事がありたと思って, いか銀から, いい事を見るともうもしいという. その方はこんな事がないのから, そう云うから, そうしていいと, この方は, それであるから, おいは, こうかかったから,
[/sourcecode]

03 May 2017, 09:30

Kaggle: Titanic 問題データ分析

はじめに

  <p>
    先日、Kaggleのタイタニック問題に挑んで惨憺たる結果を出しました。
  </p>

  <ul>
    <li>
      <a href="http://futurismo.biz/archives/6296">Kaggle のタイタニック問題に Keras で挑戦した。前処理が課題だと分かった。 | Futurismo</a>
    </li>
  </ul>

  <p>
    データ分析をするスキルが自分にはない。なんとか身につけたいと思っていたところ、<br /> Udemyの講座でKaggleのタイタニック問題を元にデータ分析を行っている講座を発見した。
  </p>

  <ul>
    <li>
      <a href="https://www.udemy.com/python-jp/learn/v4/">【世界で5万人が受講】実践 Python データサイエンス | Udemy</a>
    </li>
  </ul>

  <p>
    これはいい。まずは、講義にしたがってデータ分析してみたので、これはその講義メモです。
  </p>
</div>

目的

  <p>
    以下について、講義では調べている。
  </p>

  <ul>
    <li>
      タイタニック号の乗客はどのような人達だったのか?
    </li>
    <li>
      それぞれの乗客はどのデッキにいたか?また、それは客室の種類とどのような関係にあったか?
    </li>
    <li>
      乗客は主にどこから来たのか?
    </li>
    <li>
      家族連れか、単身者か?
    </li>
  </ul>
</div>

SetUp

  <p>
    タイタニック号のデータは下記のURLのtrainからダウンロードできる。
  </p>

  <ul>
    <li>
      <a href="https://www.kaggle.com/c/titanic/data?train.csv">https://www.kaggle.com/c/titanic/data?train.csv</a>
    </li>
  </ul>

  <p>
    まずは,csvの中身を確認。カラムの意味は <a href="https://www.kaggle.com/c/titanic/data">kaggleのサイト</a> を参照。
  </p>
</div>

In [3]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>

from pandas import Series, DataFrame titanic_df = pd.read_csv(‘train.csv’) titanic_df.head()

Out[3]:

    <div class="output_html rendered_html output_subarea output_execute_result">
      <div>
        <table class="dataframe" border="1">
          <tr style="text-align: right;">
            <th>
            </th>

            <th>
              PassengerId
            </th>

            <th>
              Survived
            </th>

            <th>
              Pclass
            </th>

            <th>
              Name
            </th>

            <th>
              Sex
            </th>

            <th>
              Age
            </th>

            <th>
              SibSp
            </th>

            <th>
              Parch
            </th>

            <th>
              Ticket
            </th>

            <th>
              Fare
            </th>

            <th>
              Cabin
            </th>

            <th>
              Embarked
            </th>
          </tr>

          <tr>
            <th>
            </th>

            <td>
              1
            </td>

            <td>
            </td>

            <td>
              3
            </td>

            <td>
              Braund, Mr. Owen Harris
            </td>

            <td>
              male
            </td>

            <td>
              22.0
            </td>

            <td>
              1
            </td>

            <td>
            </td>

            <td>
              A/5 21171
            </td>

            <td>
              7.2500
            </td>

            <td>
              NaN
            </td>

            <td>
              S
            </td>
          </tr>

          <tr>
            <th>
              1
            </th>

            <td>
              2
            </td>

            <td>
              1
            </td>

            <td>
              1
            </td>

            <td>
              Cumings, Mrs. John Bradley (Florence Briggs Th&#8230;
            </td>

            <td>
              female
            </td>

            <td>
              38.0
            </td>

            <td>
              1
            </td>

            <td>
            </td>

            <td>
              PC 17599
            </td>

            <td>
              71.2833
            </td>

            <td>
              C85
            </td>

            <td>
              C
            </td>
          </tr>

          <tr>
            <th>
              2
            </th>

            <td>
              3
            </td>

            <td>
              1
            </td>

            <td>
              3
            </td>

            <td>
              Heikkinen, Miss. Laina
            </td>

            <td>
              female
            </td>

            <td>
              26.0
            </td>

            <td>
            </td>

            <td>
            </td>

            <td>
              STON/O2. 3101282
            </td>

            <td>
              7.9250
            </td>

            <td>
              NaN
            </td>

            <td>
              S
            </td>
          </tr>

          <tr>
            <th>
              3
            </th>

            <td>
              4
            </td>

            <td>
              1
            </td>

            <td>
              1
            </td>

            <td>
              Futrelle, Mrs. Jacques Heath (Lily May Peel)
            </td>

            <td>
              female
            </td>

            <td>
              35.0
            </td>

            <td>
              1
            </td>

            <td>
            </td>

            <td>
              113803
            </td>

            <td>
              53.1000
            </td>

            <td>
              C123
            </td>

            <td>
              S
            </td>
          </tr>

          <tr>
            <th>
              4
            </th>

            <td>
              5
            </td>

            <td>
            </td>

            <td>
              3
            </td>

            <td>
              Allen, Mr. William Henry
            </td>

            <td>
              male
            </td>

            <td>
              35.0
            </td>

            <td>
            </td>

            <td>
            </td>

            <td>
              373450
            </td>

            <td>
              8.0500
            </td>

            <td>
              NaN
            </td>

            <td>
              S
            </td>
          </tr>
        </table>
      </div>
    </div>
  </div>
</div>

In [4]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">titanic_df</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>

    <div class="output_subarea output_stream output_stdout output_text">
      <pre>&lt;class 'pandas.core.frame.DataFrame'&gt;

RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): PassengerId 891 non-null int64 Survived 891 non-null int64 Pclass 891 non-null int64 Name 891 non-null object Sex 891 non-null object Age 714 non-null float64 SibSp 891 non-null int64 Parch 891 non-null int64 Ticket 891 non-null object Fare 891 non-null float64 Cabin 204 non-null object Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.6+ KB

train.csvのなかには、891人の乗客のデータが含まれるけれども、AgeやCabinが Nanが多いことがわかる。

タイタニック号の乗客はどのような人達だったのか

性別に関して、女性、男性の数を調べる。

In [5]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>

import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline

In [6]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">countplot</span><span class="p">(</span><span class="s1">'Sex'</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">)</span>

Out[6]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f1942ae6a90&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/d51c9a4dafed2cd880f8d588f220ad72.png" />
    </div>
  </div>
</div>

女性の二倍近く男性が多いことがわかる。

客室のクラスで層別化

In [7]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">countplot</span><span class="p">(</span><span class="s1">'Sex'</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">,</span> <span class="n">hue</span><span class="o">=</span><span class="s1">'Pclass'</span><span class="p">)</span>

Out[7]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f194d251dd8&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/7fb95fc331eefbb698644f3780b2890d.png" />
    </div>
  </div>
</div>

In [8]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">countplot</span><span class="p">(</span><span class="s1">'Pclass'</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">,</span><span class="n">hue</span><span class="o">=</span><span class="s1">'Sex'</span><span class="p">)</span>

Out[8]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f193f6ef588&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/6eb2b11a900f4bf0456df8ec822e5e62.png" />
    </div>
  </div>
</div>

三等客室の男性が多いことがわかる。

子供という新しい列を追加

  <p>
    子供を優先して助けたということがkaggleのサイトにかかれているので、子供がどのくらいいるかを調べる。ここでは、16歳未満が子供。
  </p>
</div>

In [9]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="k">def</span> <span class="nf">male_female_child</span><span class="p">(</span><span class="n">passenger</span><span class="p">):</span>
<span class="n">age</span><span class="p">,</span><span class="n">sex</span> <span class="o">=</span> <span class="n">passenger</span>
<span class="k">if</span> <span class="n">age</span> <span class="o">&lt;</span> <span class="mi">16</span><span class="p">:</span>
    <span class="k">return</span> <span class="s1">'child'</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">return</span> <span class="n">sex</span>

titanic_df[‘person’] = titanic_df[[‘Age’,‘Sex’]].apply(male_female_child,axis=1)

In [12]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">countplot</span><span class="p">(</span><span class="s1">'Pclass'</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">,</span><span class="n">hue</span><span class="o">=</span><span class="s1">'person'</span><span class="p">)</span>

Out[12]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f19433e22e8&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/5e2fc220fd19b91aba0ba0ab152dc580.png" />
    </div>
  </div>
</div>

In [13]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">titanic_df</span><span class="p">[</span><span class="s1">'person'</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">()</span>

Out[13]:

    <div class="output_text output_subarea output_execute_result">
      <pre>male      537

female 271 child 83 Name: person, dtype: int64

1等客室、2客室には子供が少ない。3客室に多い。これで年齢分布が分かった。

  <p>
    次に、カーネル密度推定で分布を見てみる。
  </p>
</div>

In [17]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">fig</span> <span class="o">=</span> <span class="n">sns</span><span class="o">.</span><span class="n">FacetGrid</span><span class="p">(</span><span class="n">titanic_df</span><span class="p">,</span> <span class="n">hue</span><span class="o">=</span><span class="s2">"person"</span><span class="p">,</span> <span class="n">aspect</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>

fig.map(sns.kdeplot, ‘Age’, shade=True) oldest = titanic_df[‘Age’].max() fig.set(xlim=(, oldest)) fig.add_legend()

    <div class="output_subarea output_stream output_stderr output_text">
      <pre>/home/tsu-nera/anaconda3/lib/python3.6/site-packages/statsmodels/nonparametric/kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future

y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j

  <div class="output_area">
    <div class="prompt output_prompt">
      Out[17]:
    </div>

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;seaborn.axisgrid.FacetGrid at 0x7f193f213e80&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/8922e58c431d0cc763e62204ea897a07.png" />
    </div>
  </div>
</div>

In [18]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">fig</span> <span class="o">=</span> <span class="n">sns</span><span class="o">.</span><span class="n">FacetGrid</span><span class="p">(</span><span class="n">titanic_df</span><span class="p">,</span> <span class="n">hue</span><span class="o">=</span><span class="s2">"Pclass"</span><span class="p">,</span><span class="n">aspect</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>

fig.map(sns.kdeplot,‘Age’,shade= True) oldest = titanic_df[‘Age’].max() fig.set(xlim=(,oldest)) fig.add_legend()

    <div class="output_subarea output_stream output_stderr output_text">
      <pre>/home/tsu-nera/anaconda3/lib/python3.6/site-packages/statsmodels/nonparametric/kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future

y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j

  <div class="output_area">
    <div class="prompt output_prompt">
      Out[18]:
    </div>

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;seaborn.axisgrid.FacetGrid at 0x7f193f238208&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/1716019788b55655778ec18831b54e9c.png" />
    </div>
  </div>
</div>

それぞれの乗客はどのデッキにいたか(Cabin)?

  <p>
    Cabinは Nanが多いので、これを取り除く。Cabinは頭文字(Cxx, Dxx, Exx など)でレベル別に分けられるので、レベル別に見てみる。
  </p>
</div>

In [19]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">deck</span> <span class="o">=</span> <span class="n">titanic_df</span><span class="p">[</span><span class="s1">'Cabin'</span><span class="p">]</span><span class="o">.</span><span class="n">dropna</span><span class="p">()</span>

In [23]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">levels</span> <span class="o">=</span> <span class="p">[]</span>

for level in deck: levels.append(level[]) cabin_df = DataFrame(levels) cabin_df.columns = [‘Cabin’] sns.countplot(‘Cabin’,data=cabin_df,palette=‘winter_d’,order=sorted(set(levels)))

Out[23]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f193f0ce780&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/0bfa7bd5bc987b02fdd1c4af6558cc2b.png" />
    </div>
  </div>
</div>

A,B,C,D,E,F,G… T と T が外れ値となっている(間違ったデータ??)ので、Tを取り除く。

In [24]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">cabin_df</span> <span class="o">=</span> <span class="n">cabin_df</span><span class="p">[</span><span class="n">cabin_df</span><span class="o">.</span><span class="n">Cabin</span> <span class="o">!=</span> <span class="s1">'T'</span><span class="p">]</span>

sns.countplot(‘Cabin’,data=cabin_df,palette=‘summer’,order=sorted(set(cabin_df[‘Cabin’])))

Out[24]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f193f00ecf8&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/c024cc6b97ab2f8b039a9ee8f305f511.png" />
    </div>
  </div>
</div>

乗客はどこから乗ったか?

  <p>
    Embarkedのカラムを見る。C,Q,S という値は、それぞれCherbourg, Queenstown, Southhampton。Southhamptonが圧倒的におおいことが分かる。
  </p>
</div>

In [25]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">countplot</span><span class="p">(</span><span class="s1">'Embarked'</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">,</span><span class="n">hue</span><span class="o">=</span><span class="s1">'Pclass'</span><span class="p">)</span>

Out[25]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f193efbff60&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/f7d081bd05719cad80c2bc53cb7f6d4b.png" />
    </div>
  </div>
</div>

In [27]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">titanic_df</span><span class="o">.</span><span class="n">Embarked</span><span class="o">.</span><span class="n">value_counts</span><span class="p">()</span>

Out[27]:

    <div class="output_text output_subarea output_execute_result">
      <pre>S    644

C 168 Q 77 Name: Embarked, dtype: int64

ちなみに自分が小学生のとき、タイタニックの音楽を合奏する機会があって、Southhamptonのマーチをリコーダーで演奏した。

  <p>
    <a href="http://www.youtube.com/watch?v=fCPC6-6n5Uo"><img src="http://img.youtube.com/vi/fCPC6-6n5Uo/0.jpg" alt="IMAGE ALT TEXT HERE" /></a>
  </p>
</div>

家族連れか、単身者か?

  <p>
    Aloneのカラムを追加します。
  </p>
</div>

In [30]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">titanic_df</span><span class="p">[</span><span class="s1">'Alone'</span><span class="p">]</span> <span class="o">=</span> <span class="n">titanic_df</span><span class="o">.</span><span class="n">Parch</span> <span class="o">+</span> <span class="n">titanic_df</span><span class="o">.</span><span class="n">SibSp</span>

titanic_df[‘Alone’].loc[titanic_df[‘Alone’] >] = ‘With Family’ titanic_df[‘Alone’].loc[titanic_df[‘Alone’] == ] = ‘Alone’

    <div class="output_subarea output_stream output_stderr output_text">
      <pre>/home/tsu-nera/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py:141: SettingWithCopyWarning: 

A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self._setitem_with_indexer(indexer, value)

In [31]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">countplot</span><span class="p">(</span><span class="s1">'Alone'</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">,</span><span class="n">palette</span><span class="o">=</span><span class="s1">'Blues'</span><span class="p">)</span>

Out[31]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f193ef73eb8&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/94b2a136ff9bd372b77372348e344399.png" />
    </div>
  </div>
</div>

単身者がおおい。

In [32]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">titanic_df</span><span class="p">[</span><span class="s2">"Survivor"</span><span class="p">]</span> <span class="o">=</span> <span class="n">titanic_df</span><span class="o">.</span><span class="n">Survived</span><span class="o">.</span><span class="n">map</span><span class="p">({</span><span class="mi"></span><span class="p">:</span> <span class="s2">"no"</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="s2">"yes"</span><span class="p">})</span>

sns.countplot(‘Survivor’,data=titanic_df,palette=‘Set1’)

Out[32]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;matplotlib.axes._subplots.AxesSubplot at 0x7f193eef0b70&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/89f48756a8c20b39fbb7dd564e0d8807.png" />
    </div>
  </div>
</div>

大勢の人がなくなっていることがわかる。客室の種類は関係があるのかをみると、3等客室が死亡者が多いことがわかる。

In [33]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">factorplot</span><span class="p">(</span><span class="s1">'Pclass'</span><span class="p">,</span><span class="s1">'Survived'</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>

Out[33]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;seaborn.axisgrid.FacetGrid at 0x7f193f082e10&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/a584fc48dd2faee368d63127ee2d1451.png" />
    </div>
  </div>
</div>

「女性と子供を先に」というポリシーが本当に実施されていたかをみる。グラフを見ると、女性や子供の生存率が高い。

In [34]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">factorplot</span><span class="p">(</span><span class="s1">'Pclass'</span><span class="p">,</span><span class="s1">'Survived'</span><span class="p">,</span><span class="n">hue</span><span class="o">=</span><span class="s1">'person'</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span> <span class="n">aspect</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>

Out[34]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;seaborn.axisgrid.FacetGrid at 0x7f193ed63f98&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/4d46ccd0c0c9cdc3a67c660cb14b887b.png" />
    </div>
  </div>
</div>

生存率と年齢の、クラスの関係を見てみると、年齢が高いと生存率が下がる。

In [36]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">generations</span><span class="o">=</span><span class="p">[</span><span class="mi">10</span><span class="p">,</span><span class="mi">20</span><span class="p">,</span><span class="mi">40</span><span class="p">,</span><span class="mi">60</span><span class="p">,</span><span class="mi">80</span><span class="p">]</span>

sns.lmplot(‘Age’,‘Survived’,hue=‘Pclass’,data=titanic_df,palette=‘winter’, x_bins=generations,hue_order=[1,2,3])

Out[36]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;seaborn.axisgrid.FacetGrid at 0x7f193f0ddac8&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/a81c169dfff765508baed3e42d6f04f8.png" />
    </div>
  </div>
</div>

性別と年齢の関係もみる。

In [37]:
<div class="inner_cell">
  <div class="input_area">
    <div class=" highlight hl-ipython3">
      <pre><span class="n">sns</span><span class="o">.</span><span class="n">lmplot</span><span class="p">(</span><span class="s1">'Age'</span><span class="p">,</span><span class="s1">'Survived'</span><span class="p">,</span><span class="n">hue</span><span class="o">=</span><span class="s1">'Sex'</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="n">titanic_df</span><span class="p">,</span><span class="n">palette</span><span class="o">=</span><span class="s1">'winter'</span><span class="p">,</span><span class="n">x_bins</span><span class="o">=</span><span class="n">generations</span><span class="p">)</span>

Out[37]:

    <div class="output_text output_subarea output_execute_result">
      <pre>&lt;seaborn.axisgrid.FacetGrid at 0x7f193ecdac88&gt;</pre>
    </div>
  </div>

  <div class="output_area">
    <div class="prompt">
    </div>

    <div class="output_png output_subarea ">
      <img src="http://futurismo.biz/wp-content/uploads/fb35b6ecad305e6d0e026ca7ec9bb145.png" />
    </div>
  </div>
</div>

まとめ

  • 男性が女性よりも多い。
  • 女性や子供は男性よりも生存率が高い。(-> personがfactor候補)
  • サウサンプトンからの乗客が多い。
  • 高齢者ほど生存率が低い(->Ageがfactor候補)
  • クラスが高いほど生存率が高い(-> PClassがfactor候補)
  • 単身者が多い

以上を踏まえてKaggle再挑戦

以上から、前回の特徴量を見直して、Kaggle再挑戦しました。

その結果は、5759位でした。

You advanced 305 places on the leaderboard!

Your submission scored 0.75598, which is an improvement of your previous score of 0.74163. Great job!

300人抜きしたけれども、まだまだ改善が必要です。

03 May 2017, 06:20

Jupyter Notebook で書いた ipynb を WordPress の記事にするには jupy2wp が便利

Jupyter Notebook で実行した結果や、matplotlib や seaborn で生成した図を、 そのまま WordPress に表示して、記事にしたいとする。

調べてみると、以下の やり方があるようだ。

  1. gist に アップロードして公開したものを WordPress に 埋め込む。
  2. Jupyter Notebook を html 形式で、ダウンロードする。
  3. .ipynb ファイルを nbconvert で html ファイルにして WordPress に入力する。
  4. jupy2wp を使う。

gist を埋め込む

Jupyter Notebook には、Gist-it という extentions がある。 extentions の有効方法については、以下の README を参照。

これを有効にすると、ツールバーに gist のマークが現れる。 ポチルだけで、gist に ipynb がアップロードされて、公開される。

注意点は、gist-it の設定画面から Github personal access token を入力することだ。 そうしないと、anonymous として gist が公開される。

しかし、この方法は自分は好まない。なぜなら、gist を WordPress に 埋め込んだとき、 コードの高さが固定されてスクロールバーが出てきてしまうからだ。この回避方法がわからなかった。 もし、この問題が回避できれば、gist はいいかもしれない。

どういう仕組みかわからないけれども、図表も表示される。

HTML 形式でダウンロードする

Jupyter Notebook の notebook を開いて、 File > Download as > HTML から html 形式でダウンロードする。

出来た html ファイルを WordPress のテキスト画面に貼り込む

この作戦も、自分は好まない。なぜなら、Jupyter Themes を使っているのだけれども、 Themes が反映された状態で HTML がダウンロードされるからだ。

黒背景を使っているので、真っ黒な画面になった、よくない。

nbconvert をつかう

以下のサイトで紹介されている方法。

1.Jupyter Notebook でコンテンツを作り、Save する 2.nbconvert で html ファイルに変換する

[sourcecode language=”sh” title=”” ]
$ jupyter nbconvert –to html –template basic 出来たファイル.ipynb
[/sourcecode]

3.出来た html ファイルを WordPress のテキスト画面に貼り込む 4.Wordpress の CSS ファイルに最後に示した CSS を追加する。

これはいいかもしれない。しかし、もっといい方法を見つけた。

jupy2wp を使う

jupy2wp というツールを使う。

インストール方法は README 参照。ちょっとコマンドオプションが長いけれども、以下のように使う。

[sourcecode language=”bash” title=”” ]
python -m jupy2wp.jupy2wp –xmlrpc-url http://futurismo.biz/xmlrpc.php –user username –password hogehoge –nb titanic-cnn.ipynb –title “Kaggle: Titanic 問題データ分析” –categories [Python, 統計] –tags keras
[/sourcecode]

こうすると、下書きの状態で、ipynb で表示されていた内容がそのまま記事として投稿される。

さらに、画像は、/upload フォルダ配下に自動でアップロードされて保存される。これはいい。

02 May 2017, 10:19

TOEICほぼ900点達成

2017年4月の公開テストで895(L475/R420)をとりました。

ほぼ、900です。自分の中ではもう十分TOEIC満足です。

どうやって、TOEIC900達成したか?それは・・・ひたすらバカみたいに努力したから。

1700時間勉強したのだ。

このFuturismoのブログ、2016年はほとんど記事を更新していない。なにをしていたかというと、ひたすらTOEICを勉強していた。

正直、エンジニアやめようかと思ってた。

このサイトに、勉強時間の目安が書いてある。400点の人でも1500時間で900可能らしい。

自分がTOEICの勉強をはじめたのが、2015年11月でその時点で805点。

たった、90点あげるために1700時間も費やした。自分はバカなんじゃないかと思う。そうとう効率が悪い。

いや、実際バカなのだった。IQが89しかない(平均は100)。心理テストの結果、言語能力が人並みよりも特に低いのだ。

それでも、能力は努力で克服できることを証明したくて、バカみたいに頑張り、諦めなかった。GRITを信じた。

その結果だ。

 

TOEIC900とっても、英語は喋れないし、相変わらずMOOCのレクチャーは分からないし、英文読むのはしんどい。

まだまだ英語全然できない。

とりあえず、もうTOEICはいいです。別のことに時間を使います。